apache模块和cgi之间(在安全性方面)有区别吗?
例如。使用mod_php
而不是php-cgi
是否更安全?
还是使用mod_perl代替传统的cgi-scripts更安全?
我主要对安全问题感兴趣,但是如果存在重大差异,速度可能会成为问题。
解决方案
回答
使用内置模块肯定比使用CGI更快。安全隐患取决于配置。在默认配置中,它们几乎相同,但是cgi允许一些内置模块无法提供的更安全的配置,尤其是在共享主机的情况下。我们到底想保护自己什么?
回答
大多数安全漏洞是由于脚本本身的糟糕编程造成的,因此,如果将它们作为cgi或者在模块中运行,这真的很不容易。就是说,Apache模块可能会导致整个Web服务器崩溃(尤其是如果使用线程MPM),并且mod_php对此很有名。
cgi会变慢,但是如今有解决方案,主要是FastCGI和朋友。
威胁模型是什么?
回答
安全在什么意义上?无论哪种方式,它实际上都取决于正在运行的脚本以及编写的方式。这些天的脚本太多了,无法进行输入验证。
我个人更喜欢FastCGI而不是mod_php,因为如果FastCGI进程死了,将会产生一个新进程,而我看到mod_php杀死了整个Apache。
至于安全性,使用FastCGI,我们可以在技术上以与默认Web服务器用户不同的用户身份运行php进程。
另外,如果我们使用的是Apache的新辅助线程支持,则我们将要确保未使用mod_php,因为某些扩展不是线程安全的,并且会导致竞争情况。
回答
从适用于PHP 5.2.6的PHP install.txt文档中:
服务器模块提供了明显更好的性能和添加功能
功能与CGI二进制文件相比。
对于IIS / PWS:
警告
通过使用CGI设置,服务器对几种可能的状态都开放
攻击。请阅读我们的CGI安全性部分,以了解如何防御
使自己免受这些攻击。
回答
如果我们以模块方式运行自己的服务器,则速度会更快一些。
如果我们使用的是共享服务器,通常已经在CGI方面为我们做出了决定。原因是文件系统权限。 PHP作为模块在http服务器(通常为" apache")的权限下运行,除非我们可以将脚本更改为该用户,否则必须将其更改为777世界可读。 means,这意味着服务器邻居可以看看他们,以为我们将数据库访问密码存储在何处。大多数共享服务器已使用phpsuexec之类的东西解决了此问题,这些东西在脚本所有者的许可下运行脚本,因此我们(必须)将代码更改为644. Phpsuexec仅与PHP一起运行,因为CGI或者多或者少都是这样,这只是本地机器,对整个世界没有任何影响。
回答
诸如mod_php或者FastCGI之类的模块比纯CGI快得多。正如其他人所说,PHP程序本身是最大的安全威胁,但忽略了共享主机上还有其他考虑。
如果脚本与其他php程序位于共享主机上,并且该主机未在安全模式下运行,则所有服务器进程都可能以同一用户身份运行。这可能意味着任何其他php脚本都可以读取我们自己的php脚本,包括数据库密码。因此,请务必调查服务器配置,以确保代码对其他人不可读。
即使我们控制自己的托管,也请记住,服务器上另一个被黑客入侵的Web应用程序可能是通向其他应用程序的渠道。