PHP是一种非常流行之网站脚本语言,但是它本身所固有之安全性是非常薄弱。本文讲述了PHP增强计划(Hardened-PHP project)和新之Suhosi计划,Suhosin提供了增强之PHP之安全配置。
PHP是带有争论地但又是最流行之一种网站脚本语言。它之所以流行,是因为它低廉之价格,然而,这低廉之价格导致用PHP写之网站应用程序越来越多之同时也越来越多之展现出PHP本身在安全上之脆弱,这种安全特性显示出PHP是极不可靠,不过同时对这个脚本语言本身而言它又是非常灵活之,使用它就能很容易之实现代码,不过这些代码都是臃肿之且不安全之,虽然是这样它还是一直都拥有很多之使用者。你可以根据实际情况来假设,一次又一次,各种应用软件都体现了这种脆弱性:容易受到SQL注入、跨站脚本、任意执行指令等等之攻击。
因为象safe_mode和open_basedir这样内置之PHP安全措施将被忽略,PHP增强计划创建之PHP更具有安全性,同时也对PHP进行校验检查。最初,这些是由增强之PHP补丁完成之,这些补丁需要修补并重新编译PHP自身。最近,PHP增强计划发布了一个名为Suhosin之新工程。
Sohosin包括有两部分:第一部分是PHP之补丁,这个补丁强化了Zend引擎自身,以免可能产生缓冲溢出,也可以防止相关之弱点。第二部分是Suhosin之扩展,这是一个PHP之独立使用模块。这两部分可以一起工作,或者是扩展部分单独工作。
开发人员不希望为了达到安全性而总去维护他们自己之PHP安装设置和他们当然更喜欢直接使用销售商提供之Linux分布系统上PHP,使用扩展模块能提供更多PHP本身所不能具有之安全特点。
扩展模块很容易安装;它也能通过PECL安装,或者是下载后通过编译安装:
tar xvzf suhosin-0.9.17 cd suhosin-0.9.17 phpize ./configure -with-php-config=php-config make sudo make install
为了使用suhosin,还需要增加/etc/php.ini,如下所示:
extension=suhosin.so
对于大部分人来说默认之配置选项已经足够了。为了加强设置,可以在/etc/php.ini中增加相应之值。网站中详细地介绍了有关之各种配置选项,这些说明可以帮助你进行初始化配置。
使用Suhosin,你可以得到一些错误日志,你能把这些日志放到系统日志中,也可以同时写到其他任意之日志文件中去;它还可以为每一个虚拟主机创建黑名单和白名单;可以过滤GET和POST请求、文件上载和cookie。你还能传送加密之会话和cookie,可以设置不能传送之存储上线等等。它不像原始之PHP强化补丁,Suhosin是可以被像Zend Optimizer这样之第三方扩展软件所兼容之。
扩展应用
加密功能
Session加密
SESSION里的数据通常在服务器上的明文存放的。这里通过在服务端来加解密$_SESSION。这样将Session的句柄存放在Memcache或数据库时,就不会被轻易攻破,很多时候我们的session数据会存放一些敏感字段。
这个特性在缺省情况下是启用的,也可以通过php.ini来修改:
suhosin.session.encrypt = On suhosin.session.cryptkey = zuHywawAthLavJohyRilvyecyondOdjo suhosin.session.cryptua = On suhosin.session.cryptdocroot = On ;; IPv4 only suhosin.session.cryptraddr = 0 suhosin.session.checkraddr = 0
Cookie加密
Cookie在客户端浏览器的传输的HTTP头也是明文的。通过加密cookie,您可以保护您的应用程序对众多的攻击,如
Cookie篡改:攻击者可能会尝试猜测其他合理的cookie值来攻击程序。
跨应用程序使用Cookie:不正确配置的应用程序可能具有相同的会话存储,如所有会话默认存储在/tmp目录下,一个应用程序的cookie可能永远不会被重新用于另一应用,只要加密密钥不同。
Cookie加密在php.ini中的配置:
suhosin.cookie.encrypt = On ;; the cryptkey should be generated, e.g. with 'apg -m 32' suhosin.cookie.cryptkey = oykBicmyitApmireipsacsumhylWaps1 suhosin.cookie.cryptua = On suhosin.cookie.cryptdocroot = On ;; whitelist/blacklist (use only one) ;suhosin.cookie.cryptlist = WALLET,IDEAS suhosin.cookie.plainlist = LANGUAGE ;; IPv4 only suhosin.cookie.cryptraddr = 0 suhosin.cookie.checkraddr = 0 Blocking Functions
测试
##默认PHP的Session保存在tmp路径下
ll -rt /tmp | grep sess
##扩展未开启时查看某条sesson的数据
cat sess_ururh83qvkkhv0n51lg17r4aj6
//记录是明文的
##扩展开启后查看某条sesson 的数据
cat sess_ukkiiiheedupem8k4hheo0b0v4
//记录是密文的
可见加密对安全的重要性
阻断功能
白名单
##显式指定指定白名单列表
suhosin.executor.func.whitelist = htmlentities,htmlspecialchars,base64_encode suhosin.executor.eval.whitelist = htmlentities,htmlspecialchars,base64_encode
<?php echo htmlentities('<test>'); eval('echo htmlentities("<test>");');
黑名单
##显式指定指定黑名单列表
suhosin.executor.func.blacklist = assert,unserialize,exec,popen,proc_open,passthru,shell_exec,system,hail,parse_str,mt_srand suhosin.executor.eval.whitelist = assert,unserialize,exec,popen,proc_open,passthru,shell_exec,system,hail,parse_str,mt_srand
常被阻断的函数
assert,unserialize,exec,passthru,shell_exec,system,hail,parse_str,mt_srand,fopen,fsockopen,popen,proc_open,fread,fwrite,fputs,fclose,file_get_contents,file_put_contents,dirname,is_writable,is_dir,mkdir,allow_url_fopen, allow_url_include,phpinfo,import_request_vars
通过日志来查看非法调用黑白名单
suhosin.simulation = 1 suhosin.log.file = 511 suhosin.log.file.name = /tmp/suhosin-alert.log
其他配置项
suhosin.executor.include.max_traversal 扩目录的最大深度,可以屏蔽切换到非法路径 suhosin.executor.include.whitelist 允许包含的URL,用逗号分隔 suhosin.executor.include.blacklist 禁止包含的URL,用逗号分隔 suhosin.executor.disable_eval = On 禁用eval函数 suhosin.upload.max_uploads suhosin.upload.disallow_elf suhosin.upload.disallow_binary suhosin.upload.remove_binary suhosin.upload.verification_script 上传文件检查脚本,可以来检测上传的内容是否包含webshell特征
|
---|