PHP:如何禁用危险函数

2023-12-29

我怎样才能禁用危险的eval功能?可以使用以下方法完成吗ini_set功能?

另外如何禁用以下功能?我们可以使用禁用它们吗ini_set功能?

allow_url_fopen  
allow_url_include
exec
shell_exec
system
passthru
popen
stream_select

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

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

提前致谢....

Update

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

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

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

再次感谢。


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

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

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

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

- 过滤所有输入以查找常见的其他漏洞利用字符串模式,例如<?php,它经常被用来在不被注意的情况下通过打开的 php 标签发出吱吱声。有几种这样的模式。最佳实践是将特定字符列入白名单并根据每个输入拒绝所有其他字符。至少,过滤掉前面提到的空终止符和可能的 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

<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 服务,真的没有理由允许PUT or DELETE,你几乎肯定还应该禁用TRACE,并且可能也没有任何理由离开OPTIONS or 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”的能力,他们会以最不安全或不合规的方式努力使用您的系统,制造大量漏洞,并发明任意数量的迂回黑客技术来实现这一目标事实上,比以正确的方式去做更难实现。

/安全咆哮。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP:如何禁用危险函数 的相关文章

  • 将文件附加到 PHPMailer

    我目前正在开发一个项目 该项目将文件作为 blob 存储在数据库中 我需要将文件附加到电子邮件并通过 PHPMailer 发送出去 我熟悉 mail gt addAttachment 但是 这个函数似乎只接受文件路径 而我没有 我想知道是否
  • File_get_contents($url): 无法打开流

    我有一个脚本 我使用以下方法读取文件 file get contents urlencode url 我收到此错误 failed to open stream HTTP request failed HTTP 1 0 400 Bad req
  • 从 PHP 中的平面路径数组构建目录树

    所以 标题可能令人困惑 但我不知道如何表达这种数组结构 它肯定是一个树结构 但至于它的创建 这正是我所渴望的 它似乎不遵循典型的递归数组树构建 我正在尝试从平面路径数组创建列目录布局 每个路径都位于其自己的多维数组内 该数组旨在构建 mac
  • 如何在代码输出中显示 PHP 错误?

    当通过浏览器执行PHP页面时 我们只会得到输出 但不会得到代码中的错误 如何查看后端代码发生的错误 我在代码中使用以下内容进行错误报告 error reporting E ALL E ALL ini set display errors 1
  • 如何使用 Zend 2 http 发送 json 数据?

    我已经为此苦苦挣扎了几天 我需要将一组以 json 编码的数据发送到 api 我正在尝试使用 Zend 2 http 来实现这一点 但到目前为止我还没有运气 以下是 api 手册的内容 Bulk Create Contacts This c
  • Ajax 刷新后的事件监听器

    我的网站上有一个结帐部分 我在数量部分运行此事件侦听器 以便每次根据单击的产品更新数量时 整个 div 都会使用 AJAX 重新加载 因此所有价格 总金额也会刷新 该代码可以工作一次 但之后该功能就不再工作了 cart product qu
  • PHP:会话.auto_start

    我在同一台服务器上有两个项目 它们的设置在 session auto start 中冲突 相关post https stackoverflow com questions 1378324 php setting variables in i
  • 奇怪的 500 内部服务器错误(firebug、php、display_errors、ajax)

    在一页上我正在进行多个 AJAX 调用 所有调用均成功返回响应 但最后一个调用 与其他 ajax 调用无关 返回 500 内部服务器错误作为响应代码 如 firebug 所示 但是 尽管存在错误代码 该 AJAX 调用仍会返回正确的内容 令
  • phpstorm 和 xdebug 之间的连接

    我配置了 phpstorm xdebug 并且能够使用断点调试我的代码 这些天我更新了 php 通过brew 和 xdebug 现在我有 php 5 5 26 和 xdebug 2 3 3 当我尝试调试测试 和代码 时 phpstorm 告
  • Symfony2 - 多种形式的主题

    有没有办法在同一页面上的两个 或多个 表单使用不同的主题 我有 2 个表单 我想对第一个表单使用主题 X 对第二个表单使用主题 Y 您需要在显示表单之前声明您的主题 你应该试试 form theme form ThemeX html twi
  • PHP 下载页面

    这些 PHP 下载页面 例如 somesite com download php id somefile 通常如何工作 我最初想到了一个执行计数器操作的页面 然后简单地将用户重定向到文件 URL 这似乎是其他地方给出的唯一答案 但是我不知道
  • 如何在使用 echo 时将字符串与函数调用连接起来?

    我想在我的 echo ed html 字符串中使用两个函数调用返回的值 li a href the permalink the title a li 以下工作正常 echo li a href echo the title echo a l
  • 如何复制具有 MySQL 中保留的键和其他结构特征的表?

    如何复制保留键和其他结构特征的表 包括主键 外键和索引 这可以通过单个 MySQL 查询来完成吗 我正在使用 create table newtable as select 但此方法会使所有键和索引丢失 无法使用单个查询来从另一个表复制一个
  • 如何知道 Solr Optimize 何时完成?

    我正在使用 Solr php client 通过 php 与 Solr 进行通信 这段代码触发solr优化命令 solr gt optimize 请问有没有什么方法可以确定优化完成了 这都是因为我的网站上有一个管理页面 我每天必须手动优化
  • 在表单中重新填充密码字段会产生安全问题吗?

    我想知道当其他字段未验证时是否应该重新填充表单中的 屏蔽的 密码字段 我在网上看到过两种形式 重新填充屏蔽密码字段 清空密码字段 因此用户需要再次输入它 即使它是有效的 你的最佳实践是什么 重新填充密码字段是否表明存在安全漏洞 就可用性而言
  • 如何在 Yii 框架中从数据库中获取所有表名和列名

    我正在开发一个模块 我想在其中执行动态相关下拉表和列名称功能 前任 获取所有表名称并将其显示在下拉字段中 选择特定表后 我想在下拉字段中再次显示其所有列名称 问题是 1 如何从数据库中获取所有表名 2 如何从表中获取所有列名 我尝试了一些文
  • 基于 ajax 的弹出窗口中的 Mathjax + CKEditor 4 + CKEditor

    我已经配置了 CKEditor 4 并且我的页面上有以下内容 我的页面中有一个 CKEditor 设置值的两个选项 这两个选项本身分别选项两个基于 ajax 的弹出窗口 这些基于 ajax 的弹出窗口包含 CKEditor 现在我有以下问题
  • PHP 插入中的 mysqli_affected_rows

    我有这个代码 if mail to subject message headers insert member sql INSERT INTO members id username VALUES id username insert me
  • PHP/MySQL - 在数据库中存储数组

    我正在开发一个 PHP 应用程序 它需要将各种设置存储在数据库中 客户经常询问是否可以添加或更改 删除某些内容 这导致了表格设计出现问题 基本上 我有很多布尔字段 它们只是指示是否为特定记录启用了各种设置 为了避免再弄乱表格 我正在考虑将数
  • 使用 Ajax 和 PHP 上传图像

    我想将图像上传到我的服务器 并控制 HTML 代码中的 PHP 回显 为此 我想使用 jQuery Ajax 但我不知道如何使用 Ajax 将图像发送到 PHP 这是一个大学项目 所以我不能使用任何类型的插件 我的实际代码 HTML

随机推荐