PHP:如何禁用危险功能

2022-08-30 18:07:03

如何禁用危险的评估功能?这可以使用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(和其他)功能。因此,这留给框架用户的选择。一旦他们指定禁用它;我应该能够以编程方式禁用评估函数。

这就是情况。寻找有用的答案/解决方案。

再次感谢。


答案 1

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

一个好的网站站长应该认为安全审查是网站设置的重要组成部分。不要试图完全抽象出来,人们对安全性已经足够懒惰了。如果您要使用工具(如网络主机),则应主动至少对如何负责任地管理一个工具有粗略的了解。

也就是说,您还可以做一些其他事情来严重削弱大多数黑客尝试,包括:

-禁用使用 .现在,有办法解决这个问题,但是绝大多数黑客脚本本质上是通用的,这将破坏大约95%的脚本,因为它们需要同时存在这两个功能才能正常运行。这并不意味着您的服务器不会被黑客入侵,但在大多数情况下,它会产生手动嗅探服务器是否存在漏洞的开销,并且大多数黑客都在玩数字并且没有时间(注意:一些黑客确实有时间这样做,这本身并不是一颗灵丹妙药)。base64_decode()disable_functions

-过滤所有输入,以查找常见的其他漏洞利用字符串模式,例如 ,它经常用于在不被注意的情况下通过开始的 php 标记发出吱吱声。有几种这样的模式。最佳做法是将特定字符列入白名单,并在每个输入的基础上拒绝所有其他字符。至少,过滤上述空终止符和可能的sql注入字符串,例如(不要假设简单地使用pdo或mysqli将过滤所有注入尝试,即使您正确使用预准备语句,仍然有一些方法可以做到这一点)。<?php'; --

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

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服务,真的没有理由允许或,你几乎肯定也应该禁用,并且可能也没有任何理由离开或启用。还应该提到的是,默认情况下,所有无法识别的连接方法都解析为 ,这意味着从命令行我可以执行如下操作:PUTDELETETRACEOPTIONSHEADGET

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

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

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

但是,您的应用程序可能不会。为了防止出现这种情况,应将服务器配置为仅接受 为 ,而不允许其为默认值。GETGET

在大多数情况下,主要不是使在您的环境中执行特定的php模式变得困难,重点是防止包含流氓代码(本地或外部),因此它不会成为问题。如果您允许在CMS中安装模块或类似内容,那么草率的程序员最终会创建漏洞利用程序,除了强制执行非常严格的API参数之外,您无法真正做到这一点,这些参数使得它很难做到很糟糕,但它永远不会变得不可能。永远不要低估离岸黑客商店或自称“php ninja”的能力,以最不安全或不合规的方式勤奋地使用您的系统,创建巨大的漏洞,并发明任意数量的迂回黑客来做到这一点,实际上比以正确的方式完成更难实现。

/安全咆哮。


答案 2

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

但是,正如文档所述:

此指令必须在 php 中设置.ini例如,不能在 httpd.conf 中设置此指令。

我认为这太“内部”了,除了PHP之外,其他任何地方都无法配置......由于它与安全性相关,因此由系统管理员进行配置。


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


推荐