当前位置:  开发笔记 > 编程语言 > 正文

PHP:如何禁用危险函数

如何解决《PHP:如何禁用危险函数》经验,为你挑选了4个好方法。

如何禁用危险的评估功能?可以使用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函数.

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

再次感谢.



1> mopsyd..:

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

一个好的网站管理员应该考虑安全审查是网站设置的重要部分.不要试图完全抽象出来,人们对安全已经足够懒惰了.如果您打算使用工具(如虚拟主机),您应该主动至少掌握如何负责任地管理工具的粗略知识.

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

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

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

- 仅为媒体提供服务的任何目录都应禁用所有脚本访问,并且所有上载和媒体应仅放在此类目录中.最好是只有白名单可以接受的媒体,而不是黑名单剧本,因为有任意数量的方式来执行一个脚本文件(如:php,php5,phtml等),其分别可以或可能无法使用在任何给定的服务器环境.您可以使用类似于以下内容的简单.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


  order deny,allow
  deny from all

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

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

- 您还应该配置.htaccess(或web.config/etc)以禁用特定应用程序不需要的任何访问方法.如果您没有使用RESTful Web服务,那么实际上没有理由允许,PUT或者DELETE您几乎肯定也会禁用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

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

在大多数情况下,主要的观点是不要让在您的环境中执行特定的php模式变得困难,重点是防止包含恶意代码(本地或外部),因此它不会成为问题.如果你允许在你的CMS中安装模块等,那么草率的程序员最终会创建漏洞,除了强制执行非常严格的API参数之外你不能真正做很多事情,这些参数很难做到很差,但它永远不会变得不可能.永远不要低估离岸黑客商店或自称"php ninja"以最不安全或不合规的方式努力使用您的系统的能力,造成大量漏洞,

/安全咆哮.



2> Pascal MARTI..:

要禁用功能,主要是出于安全原因,您可以disable_functionsphp.ini配置文件中使用该指令.

但是,正如文件所述:

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

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


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


我不知道为什么这个答案是公认的答案,这是完全错误的:https://bugs.php.net/bug.php?id = 62397

3> 小智..:

简而言之:你做不到.

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

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

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

阅读有关远程代码执行和远程/本地文件包含的信息,以了解有关此攻击的更多信息:常见的PHP漏洞



4> Kenaniah..:

disable_functions指令仅在php.ini配置中可用.

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

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有