环境:
php-5.3.29
安全配置
(1)打开php的安全模式
php的安全模式是一个非常重要的内嵌的安全机制,它能控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键的文件,比如/etc/passwd,但是默认的php.ini是没有打开安全模式,建议打开,但是要看是否会影响程序
safe_mode = On
当php的安全模式关闭的时候,运行test2.php:
<?php
readfile('/etc/passwd');
?>
它会把所有的/etc/passwd的内容显示出来,这样非常不安全
(2)用户组安全
当safe_mode打开时,safe_mode_gid 被关闭,那么php脚本能够对文件进行访问,而且相同组的用户也能够对文件进行访问
建议设置为
safe_mode_gid = Off
默认是关闭的
如果不进行设置,可能我们无法对我们的服务器网站目录的文件进行操作了,比如我们要对文件进行操作的时候
(3)关闭危险函数
如果打开了安全模式,那么函数禁止是可以不需要的,但是我们为了安全还是考虑进去。比如,我们觉得不希望执行包括system()等能够执行命令的php函数,或者能够查看php信息的phpinfo()等函数,那么我们就禁止他们:
disable_functions =system,passthru,exec,shell_exec,popen,phpinfo
如果你要禁止任何文件盒目录的操作,那么可以关闭很多文件操作
disable_functions =chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete
这样,就能过抵御大部分的phpshell
(4)关闭php版本信息在http头中的泄露,(默认开启)
expose_php = Off
关闭前:
[root@mysql teddy]# curl -I http://abc.com/test2.php
HTTP/1.1 200 OK
Date: Mon, 15 Dec 2014 13:13:09 GMT
Server: Apache/2.2.29 (Unix) DAV/2 PHP/5.3.29
X-Powered-By: PHP/5.3.29
Vary: Accept-Encoding
Content-Type: text/html
关闭后:
[root@mysql teddy]# curl -I http://abc.com/test2.php
HTTP/1.1 200 OK
Date: Mon, 15 Dec 2014 13:12:34 GMT
Server: Apache/2.2.29 (Unix) DAV/2
Vary: Accept-Encoding
Content-Type: text/html
(5)关闭注册全局变量
在php中提交变量,包括使用POST或者GET提交的变量,都讲自动注册为全局变量,能过直接访问。这对服务器非常不安全,所以,我们要关闭它,默认是关闭的
register_globals = Off
当然,如果这样设置了,那获取对应变量的时候就要采取合理的方式,比如获取GET提交变量var,那么就要用$_GET[‘var’]来进行获取,这个php程序员要注意
提示:关闭此项可能会导致老的php程序出问题,所以具体情况要具体分析
(6)打开magic_quotes_gpc来防止SQL注入
SQL注入是非常危险的问题,小则网站后台被入侵,重则服务器沦陷
magic_quotes_gpc = Off
默认是关闭的,如果开启了,将自动把用户提交对sql的查询进行转换,比如把 转为\等,这对防止sql注入有很大的帮助,所以建议打开:
magic_quotes_gpc = On
(7)错误信息控制
一般php在没有连接到数据库或者其他的的时候会有提示错误,一般错误信息中会包含php脚本当前路径信息或者查询的SQL语句等信息,所以建议禁止显示错误信息,默认是关闭状态
display_errors = Off
(8)错误日志
建议在关闭display_errors后能够把错误信息记录下来,以便查找服务器运行时候出现问题的原因:
log_errors = On
同时也要设置错误日志存放目录,可以和apache的日志放一起
error_log = /root/logs/php_errors.log
注意:给文件必须允许apache用户和组有写的权限
(9)其他参数的优化
max_execution_time = 30
#每个脚本运行的最长时间(秒)。当出现无法上传较大文件或者后台备份数据经常超时,可以考虑将此值调大一些,0表示没有限制
max_input_time = 60
#等待输入数据的时间有多长(秒),
memory_limit = 128M
#一个脚本可以最多使用多大内存
upload_max_filesize = 2M
#上传文件最大许可大小
output_buffering = 4096
#数据发送给客户机之前,有多少数据(字节)需要缓存
allow_url_fopen = Off
#禁止打开远程地址,默认是开启的。
