PHP:如何禁用危险函数

时间:2009-12-08 06:34:27

标签: php security

如何禁用危险的 eval 功能?可以使用 ini_set 功能完成吗?

还有如何禁用以下功能?我们可以使用 ini_set 功能停用它们吗?

allow_url_fopen  
allow_url_include
exec
shell_exec
system
passthru
popen
stream_select

eval 是坏人可以用来利用这些东西的最危险的功能之一。应该有一种机制来禁用它而不诉诸 php.ini 文件;但是应该以编程方式完成。

嗯,伙计们,我正在寻找一个答案,建议在不去 php.ini 文件的情况下禁用这些危险的可爱家伙;我的意思是如何在运行时或以编程方式禁用它们?

提前致谢....

更新

有没有人听说过PHP Shell Offender Script?它主要使用eval函数进行利用。黑客能够在您的网站上运行他们的PHP代码。

我的问题是我不想完全禁用php.ini文件中的eval函数。例如,我开发了自己的MVC框架。现在,框架用户可以从框架配置文件中指定是否应禁用eval(和其他)功能。所以这留给了框架用户的选择。一旦他们指定禁用它;我应该能够以编程方式禁用eval函数。

这就是场景。寻找有用的答案/解决方案。

再次感谢。

6 个答案:

答案 0 :(得分:21)

害怕你几乎停止使用php.ini禁用大部分内容。然而,它变得更糟。 eval()在技术上不是函数,它是一种语言结构,因此不能使用disable_functions禁用它。为此,您必须安装类似 Suhosin 的内容并从那里禁用它。

优秀的网站管理员应将安全审核视为网站设置的重要组成部分。不要试图完全抽象出来,人们对安全已经足够懒惰了。如果您打算使用工具(如虚拟主机),您应该主动至少掌握如何以负责任的方式管理工具。

也就是说,你可以采取一些其他措施来严重削弱大多数黑客企图,包括:

- 使用base64_decode()禁用disable_functions。现在,有很多方法,但绝大多数黑客脚本本质上是通用的,这将打破其中的95%,因为它们需要存在这些功能才能正常运行。这并不意味着您的服务器无法被黑客入侵,但在大多数情况下,它会产生手动嗅探服务器漏洞的开销,并且大多数黑客都在玩这些数字并且没有时间(注意:一些黑客)确实有时间,这本身并不是一个神奇的子弹。)

- 为常见的其他漏洞利用字符串模式(例如<?php)过滤所有输入,这些模式经常用于通过未被注意的开放php标记发出吱吱声。有几种这样的模式。最佳做法是将特定字符列入白名单,并在每个输入的基础上拒绝所有其他字符。至少,过滤前面提到的null终止符,以及可能的sql注入字符串,例如'; --(不要以为简单地使用pdo或mysqli会过滤所有注入尝试,还有一些方法可以解决这个问题即使你正确使用准备好的陈述也要关闭。)

- 仅为媒体提供服务的任何目录都应禁用所有脚本访问,并且所有上载和媒体应仅放在此类目录中。最好只将可接受的媒体列入黑名单而不是黑名单脚本,因为有许多方法可以执行脚本文件(例如:phpphp5phtml等)在任何给定的服务器环境中可以单独使用,也可以不使用。您可以使用与此类似的媒体目录中的简单.htaccess执行此操作:

php_flag engine off
AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .aspx .htm .html .shtml .sh .cgi
Options -Indexes -ExecCGI

<Files "\.(jpe?g|png|gif|bmp|tiff|swf|flv|mov|avi|mp4)$">
  order deny,allow
  deny from all
</Files>

这部分可以由php动态编写,因此您的应用程序能够以类似于此的方式保护敏感目录,这可以减轻大量黑客的痛苦,因为这通常被忽视。我通常在上传目录中的几乎每个Wordpress网站上添加一个类似的.htaccess,并且经常想知道为什么这不是开箱即用的,因为它阻止了大量的黑客攻击并且不会干扰应用程序以我注意到的任何方式。

不幸的是,如果你不在apache服务器上,你需要找到另一个解决方案(在IIS上很可能是等价的,但我不知道它会是什么样的。)

- 您还应该配置.htaccess(或web.config / etc)以禁用特定应用程序不需要的任何访问方法。如果您没有使用RESTful Web服务,实际上没有理由允许PUTDELETE,您几乎肯定也会禁用TRACE,而且可能也没有任何启用OPTIONSHEAD的原因。还应该提到的是,默认情况下所有未识别的连接方法都解析为GET,这意味着从命令行我可以执行以下操作:

curl -X BOOGITY -d arg=badstuff -d arg2=morebadstuff yoursite.com

在此示例中,BOOGITY没有意义,但是,您的服务器会将其解释为:

curl -X GET -d arg=badstuff -d arg2=morebadstuff yoursite.com

但是你的申请可能不会。 为了防止这种情况发生,您应该将服务器配置为仅接受GET作为GET,并且不允许它作为默认值。

在大多数情况下,主要的观点是不要让在您的环境中执行特定的php模式变得困难,重点是防止包含恶意代码(本地或外部),因此它不会成为问题。如果你允许在你的CMS中安装模块等,那么草率的程序员最终会创建漏洞,除了强制执行非常严格的API参数之外你不能真正做很多事情,这些参数很难做到很差,但它永远不会变得不可能。永远不要低估离岸黑客商店或自称“兄弟忍者”的能力#34; php ninja&#34;尽可能以最不安全或不合规的方式与您的系统一起努力工作,制造大量漏洞,并发明任何数量的迂回黑客,这样做实际上比正确的方式更难实现。

/ security rant。

答案 1 :(得分:11)

要禁用功能,主要是出于安全考虑,您可以在php.ini配置文件中使用disable_functions指令。

但是,正如文件所述:

  

此指令必须在php.ini中设置   例如,您无法将其设置为   的httpd.conf。

我认为这太“内部”,无法在PHP以外的任何地方进行配置......而且由于它与安全相关,因此需要由系统管理员进行配置。


尽管如此,最好的安全措施是编写干净/安全的代码,过滤所有输入,转义所有输出......并且不要让任何人在您的服务器上运行自己的代码!

答案 2 :(得分:11)

简而言之:你做不到。

但我认为你并不真正了解eval和这些功能是如何被利用的。当程序员没有正确地清理传递给他们的ARGUMENTS时会出现问题。

你提到的php shell offender脚本只是一个简单的PHP脚本,它将参数传递给这些函数。但是攻击者已经有了注入/上传恶意脚本的方法。如果您根本不使用这些函数或从用户输入传递参数,则攻击者无法使用eval()或亲戚在您的服务器上运行任意代码。

您打算为您的用户托管此框架吗?如果您允许用户上传和运行代码,那么您手中就会遇到更大的问题。

在此处阅读有关远程代码执行和远程/本地文件包含的信息,以了解有关此相关攻击的更多信息:Common PHP vulnerabilities

答案 3 :(得分:6)

disable_functions指令仅在php.ini configuration中可用。

在运行时禁用函数没有多大意义,因为您可以在运行时修改禁用的函数列表以重新启用函数。

答案 4 :(得分:1)

你可以disable evalhttps://github.com/mk-j/PHP_diseval_extension并解决suhosin与php7兼容/稳定的问题。

答案 5 :(得分:0)

将此行添加到您的php.ini中(您搜索“ disable_functions”)

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

然后重新启动您的php服务(apache或php-fpm)