如何禁用危险的评估功能?可以使用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函数.
这就是场景.寻找有用的答案/解决方案.
再次感谢.
害怕你几乎停止使用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 -ExecCGIorder deny,allow deny from all
这部分可以由php动态编写,因此您的应用程序能够以类似于此的方式保护敏感目录,这可以减轻大量黑客的痛苦,因为这通常被忽视.我通常在上传目录中的几乎每个Wordpress网站上添加一个类似的.htaccess,并且经常想知道为什么这不是开箱即用的,因为它阻止了大量的黑客攻击并且不会干扰应用程序以任何我注意到的方式.
不幸的是,如果你不在Apache服务器上,你需要找到另一个解决方案(在IIS上很可能是一个等价的,但我不知道它将是什么个人).
- 您还应该配置.htaccess(或web.config/etc)以禁用特定应用程序不需要的任何访问方法.如果您没有使用RESTful Web服务,那么实际上没有理由允许,PUT
或者DELETE
您几乎肯定也会禁用TRACE
,并且可能也没有任何理由离开OPTIONS
或HEAD
启用.还应该提到的是,默认情况下所有未识别的连接方法都解析为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
as GET
,而不是允许它作为默认值.
在大多数情况下,主要的观点是不要让在您的环境中执行特定的php模式变得困难,重点是防止包含恶意代码(本地或外部),因此它不会成为问题.如果你允许在你的CMS中安装模块等,那么草率的程序员最终会创建漏洞,除了强制执行非常严格的API参数之外你不能真正做很多事情,这些参数很难做到很差,但它永远不会变得不可能.永远不要低估离岸黑客商店或自称"php ninja"以最不安全或不合规的方式努力使用您的系统的能力,造成大量漏洞,
/安全咆哮.
要禁用功能,主要是出于安全原因,您可以disable_functions
在php.ini
配置文件中使用该指令.
但是,正如文件所述:
必须在php.ini中设置此指令.例如,您无法在httpd.conf中设置此指令.
我认为这太"内部",无法在PHP以外的任何地方进行配置......而且由于它与安全相关,因此由系统管理员来配置它.
尽管如此,最好的安全措施是编写干净/安全的代码,过滤所有输入,转义所有输出......并且不要让任何人在您的服务器上运行自己的代码!
简而言之:你做不到.
但我认为你并不真正理解eval和那些功能是如何被利用的.当程序员没有正确地清理传递给他们的ARGUMENTS时,就会出现问题.
您提到的php shell offender脚本只是一个简单的PHP脚本,它将参数传递给这些函数.但是攻击者已经有了注入/上传恶意脚本的方法.如果您根本不使用这些函数或从用户输入传递参数,则攻击者无法使用eval()或亲属在您的服务器上运行任意代码.
您打算为您的用户托管此框架吗?如果您允许用户上传和运行代码,那么您手中就会遇到更大的问题.
阅读有关远程代码执行和远程/本地文件包含的信息,以了解有关此攻击的更多信息:常见的PHP漏洞
disable_functions指令仅在php.ini配置中可用.
在运行时禁用函数没有多大意义,因为您可以在运行时修改禁用的函数列表以重新启用函数.