PHP是运行在服务器端的脚本语言,功能强大,广为流行,目前全球近80%的网站是基于PHP来开发的。本文将介绍一些技巧,以帮助站长提高PHP主机的安全性。
1. 保持更新
每个大型系统都有一个不断的改进过程,所以无论是PHP,服务器程序(Apache,Nginx…)及操作系统(Linux,Windows…)定期更新升级,是非常有必要的。
2. 文件系统安全
PHP被设计为以用户级别来访问和读写文件,因此非常有必要限制PHP的读写权限,确保一些不必要的文件被其误操作,尤其是系统文件,如/etc/passwd. 我们必须保证不能让PHP拿到root的权限,为其分配合适的用户和用户组。大多情况下我们会将其分配一个www-data的用户和用户组。
3. 数据库安全
数据库是现在网站必不可少的重要组成部分。一些敏感和机密数据会被保存在数据库中,例如网站用户的登录账户。我们从以下4个方面讨论数据库安全的问题:
1)设计数据库
永远不要用数据库的所有者或者超级用户(root)账号连接数据库,因为这些帐号可以执行任意的操作,如例如删除一个表,甚至清空整个数据库的内容。必要的话为网站应用程序分配多个用户,除了必须,不分配任何多余权限。
2)通信加密
通过ssl或ssh对客户端和数据库之间的通信数据进行加密,避免其被攻击者所监听。
3)存储加密
做好最环的打算是必须的。对一些敏感数据进行加密,如用户的密码,避免以明文的方式暴露给用户。一般我们可以通过php函数crypt()和md5()实现MD5,DES,Blowfish,SHA256,SHA512加密。
4)SQL注入
SQL可以被恶意的篡改,在执行SQL之前,必须对其合法性进行检测。
- 输入数据的格式检查。如整数型(int)的数据,不能错误的使用字符串型(string)的数据
- 使用转义函数(比如 mysql_escape_string() 和 sql_escape_string())把用户提交上来的非数字数据进行转义
- 不要将错误报告暴露给用户
- 使用存储过程隐藏操作内容
4. 错误报告
基本原则不要直接在页面上显示错误报告。
php.ini
display_errors = off log_error = on error_log = /var/log/php_error.log
5. Register Globals
"本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。"
关闭register_globals避免代码内部变量和客户端发送变量混杂在一起的情况
php.ini
register_globals = Off
6. 魔术引号(Magic Quote)
“本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。”
魔术引号是,所有的 '(单引号),"(双引号),\(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义,主要会影响到HTTP请求数据(GET,POST,COOKIE)。
可以通过以下方式将其关闭
php.ini
; Magic quotes ; ; Magic quotes for incoming GET/POST/Cookie data. magic_quotes_gpc = Off ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. magic_quotes_runtime = Off ; Use Sybase-style magic quotes (escape ' with '' instead of \'). magic_quotes_sybase = Off
.htaccess
php_flag magic_quotes_gpc Off