设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

写给系统管理员的 25 个 PHP 安全实践

2013-12-26 11:39| 发布者: 红黑魂| 查看: 7955| 评论: 0|来自: 伯乐在线

摘要: PHP是广泛使用的开源服务端脚本语言。通过HTTP或HTTPS协议,Apache Web服务允许用户访问文件或内容。服务端脚本语言的错误配置会导致各种问题。因此,PHP应该小心使用。以下是为系统管理员准备的,安全配置PHP的25个 ...

#8:启用SQL安全模式

如下修改/etc/php.d/security.ini:

1
sql.safe_mode=On

当此特性被启用,mysql_connect()和mysql_pconnect()会忽略传入的所有参数。与此同时,你需要在代码上做些相应的修改。第三方以及开源应用,如Wordpress,在sql.safe_mode下可能无法正常工作。同时建议关闭5.3.x版本的PHP的magic_quotes_gpc过滤,因为它简单粗暴又没效率。使用mysql_escape_string()以及自定义的过滤函数会更好一些

1
magic_quotes_gpc=Off

 

#9:控制POST的数据大小

HTTP POST通常作为请求的一部分,被客户端用于向Apache Web服务器发送数据,如上传文件或提交表单。攻击者会尝试发送超大的POST请求去消耗服务器的资源。如下编辑/etc/php.d/security.ini限制POST的最大大小:

1
2
; 在这里设置一个靠谱的数值
 post_max_size=1K

这里设置了1K的最大大小。这个设置会影响到文件上传。要上传大文件,这个值需要比update_max_filesize大。
建议在Apache中限制可用的请求方法,编辑httpd.conf如下:

1
2
3
4
5
6
<Directory /var/www/html>
     <LimitExcept GET POST>
         Order allow,deny
     </LimitExcept>
 ## Add rest of the config goes here... ##
 </Directory>

 

#10:资源控制(DoS控制)

设置每个PHP脚本的最大运行时间。另外建议限制用于处理请求数据的最大时间,以及最大可用内存数。
# 单位:秒

1
2
3
max_execution_time = 30
max_input_time = 30
memory_limit = 40M

 

#11:为PHP安装Suhosin高级保护系统

具体参考Suhosin项目页:project page

 

#12:取消危险的PHP函数

PHP有大量可用于入侵服务器的函数,如使用不当则会成为漏洞。如下取消这些函数:

1
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

 

#13:PHP Fastcgi / CGI – cgi.force_redirect管理

PHP可与Fastcgi协同工作。Fastcgi可以减少Web服务器的内存足迹(memory footprint),并改善PHP性能。可以参考这个来配置Apache2+PHP+FastCGI。在这个配置中,cgi.force_redirect会阻止用户通过访问URL来调用PHP。为安全考虑,启用该特性:

1
2
; Enable cgi.force_redirect for security reasons in a typical *Apache+PHP-CGI/FastCGI* setup
 cgi.force_redirect=On

 

#14:PHP用户与用户组ID

mod_fastcgi是Apache Web服务的一个cgi模块,可连接到外部的FASTCGI服务器。你需要确保PHP使用非root用户运行。若其使用root或是UID小于100的用户权限,它就可以访问,乃至操作系统文件。通过Apache’s suEXECmod_suPHP,可在非特权用户下执行PHP CGI。suEXEC可以是Apache调用CGI程序的user ID不同于运行Apache的user ID。如下:

1
# ps aux | grep php-cgi

样例输出:

1
2
3
4
5
6
7
phpcgi      6012  0.0  0.4 225036 60140          S    Nov22   0:12 /usr/bin/php-cgi
 phpcgi      6054  0.0  0.5 229928 62820          S    Nov22   0:11 /usr/bin/php-cgi
 phpcgi      6055  0.1  0.4 224944 53260          S    Nov22   0:18 /usr/bin/php-cgi
 phpcgi      6085  0.0  0.4 224680 56948          S    Nov22   0:11 /usr/bin/php-cgi
 phpcgi      6103  0.0  0.4 224564 57956          S    Nov22   0:11 /usr/bin/php-cgi
 phpcgi      6815  0.4  0.5 228556 61220          S    00:52   0:19 /usr/bin/php-cgi
 phpcgi      6821  0.3  0.5 228008 61252          S    00:55   0:12 /usr/bin/php-cgi

可以通过spawn-fcgi来生成phpcgi用户的远程或本地FastCGI进程(前提是有这个用户):

1
# spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi

现在可以配置Apache、Lighthttpd或Nginx Web服务调用运行在127.0.0.1:9000的FastCGI。

 

#15:限制PHP访问文件系统

open_basedir会限制PHP的运行目录,例如通过fopen()之类的函数可访问的目录。如果访问的目录不在open_basedir之内,PHP会拒绝该访问。不要使用软链接作为工作区。例如,只允许访问/var/www/html而非/var/www、/tmp或/etc目录:

1
2
3
4
5
6
7
; Limits the PHP process from accessing files outside
 ; of specifically designated directories such as /var/www/html/
 open_basedir="/var/www/html/"
 ; ------------------------------------
 ; Multiple dirs example
 ; open_basedir="/home/httpd/vhost/cyberciti.biz/html/:/home/httpd/vhost/nixcraft.com/html/:/home/httpd/vhost/theos.in/html/"
 ; ------------------------------------

 

#16:Session路径

PHP Session用户提供数据保存功能,以便后续访问。这可以使应用可定制性更强,提升吸引力。所有Session相关的数据会被保存在session.save_path中。RHEL/CentOS/Fedora Linux的默认设置如下:

1
2
3
session.save_path="/var/lib/php/session"
 ; Set the temporary directory used for storing files when doing file upload
 upload_tmp_dir="/var/lib/php/session"

确认这个路径在/var/www/html之外,且不可被其他系统用户访问:

1
# ls -Z /var/lib/php/

样例输出:

1
drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session

注:ls -Z会显示SELinux的安全信息,如文件模式,user,group,安全信息,文件名等。

 



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部