PHP应用程序因高于平均的安全性问题而享有声誉。 您使用什么configuration技术来确保应用程序尽可能安全?
我正在寻找像这样的想法:
我通常使用Linux,但也可以自由地推荐Windows解决scheme。
使用open_basedir指令将PHP脚本限制到其主目录和最终的额外应用程序目录。 这本身非常有效。
使用强化的PHP,因为它没有成本,它可以帮助。
使用suPHP作为文件的所有者(每个网站一个用户)执行PHP脚本,并避免使用具有不良权限的文件,例如777 … suPHP也可以允许您在每个网站上使用php.ini,这样一个网站的愚蠢要求不要摧毁一切。
Mod_security是一个很大的优势,但需要很好的使用和configuration。
根据我的经验,基于PHP的网站上的大多数漏洞都是(站点)devise不佳的结果,而不是PHP本身的缺陷。
一些快速提示:
*您也可以看一下我写的一篇名为“确保phpinfo()”的短文章,并且一定要阅读http://egovsergo.com/2009/04/03/protecting-your-phpinfo/这是一个很快的想法,我必须(有点)保护phpinfo(),如果我忘了在生产网站上删除它。
更一般的方式是,一些开发人员为敏感函数编写包装,检查是否设置“生产站点”标志,并禁用生产中的敏感function。
其他参数,应该改变,以加强PHP:
safe_mode = Off register_globals = Off expose_php = Off allow_url_fopen = Off allow_url_include = Off log_errors = On error_log = /var/log/phperror.log display_errors = Off enable_dl = Off disable_functions="popen,exec,system,passthru,proc_open,shell_exec,show_source,phpinfo"
将所有PHP错误保存在文件/var/log/phperror.log中 :
touch /var/log/phperror.log chmod 666 /var/log/phperror.log
我已经将dotdeb存储库添加到我的/etc/apt/sources.lst
deb http://packages.dotdeb.org stable all deb-src http://packages.dotdeb.org stable all
因为他们比Debian更频繁地修补php / apache / mysql。
考虑在“每个站点”的基础上设置open_basedir
。 open_basedir
是一个php.ini设置,它将阻止你的脚本访问定义的白名单之外的文件。 如果您的服务器托pipe多个站点,则会阻止一个站点从另一个站点读取数据库设置。 它也会阻止一个php脚本访问/修改核心系统文件。 打开basedir很容易设置,只需将“ php_admin_value open_basedir /my/list/of/folders:/as/a/colon/seperated/list
”添加到每个Apache vhost。
还要考虑closures不应包含PHP脚本的所有站点/文件夹(例如上传的图像文件夹)的PHP脚本引擎。 同样,这很简单,将“php_admin_value引擎closures”添加到任何不需要PHP的Apache VirtualHosts。 要禁用目录中的PHP,请将相同的内容放入Directory标签中。
尽可能严格地运行文件权限,避免对Apache用户的PHP脚本的写入访问,这可以防止正在运行的脚本在同一站点/服务器上修改自身或其他脚本。 如果可能,尽量避免777权限,找出运行应用程序所需的最低权限并使用它们。
如果您要托pipe多个站点,每个站点都有自己的数据库,请为每个站点分别使用一个MySQL / Postgres用户,并为每个用户设置权限,以便他们只能访问相关的数据库。 这又会阻止恶意脚本篡改另一个应用程序的数据库。
Suosin,HardenedPHP,mod_security等都是有价值的,但除了紧密locking的configuration之外,还可以使用它们,而不是使用它们。
Suhosin的性能成本相当可观,所以“不计成本”的评论是有点偏离。
你在寻找一些基本的防火墙/拓扑build议? 我喜欢使用像英镑这样的东西的想法,以防止从未刷洗的互联网直接访问PHPnetworking服务器。 这样,您也可以将networking服务器从networking的其他部分分离出来。
使用Suhosin / mod_security / SuPHP肯定会使你的PHP服务器变得安全。 禁用某些function,如exec,passthru,system和escapeshellcmd也会有很大的帮助。