【问题标题】:how to prevent 'manual execution' of external PHP script如何防止外部 PHP 脚本的“手动执行”
【发布时间】:2011-09-04 20:36:47
【问题描述】:

简单来说,我在整个客户网站中使用外部 PHP 脚本用于各种目的,例如获取搜索结果、更新内容等。

我将这些脚本保存在一个目录中:

www.domain.com/scripts/scriptname01.php
www.domain.com/scripts/scriptname02.php
www.domain.com/scripts/scriptname03.php

等等。

我通常使用 jQuery AJAX 调用来执行它们。

我要做的是找到一段代码,它将(从内部)检测这些脚本是通过 AJAX 从文件执行还是由用户通过 URL 手动执行。

这可能吗??

我已经到处搜索并尝试了各种方法来处理 $_SERVER[] 数组,但仍然没有成功。

【问题讨论】:

  • 当你说 URL 和用户时,你是指一个典型的用户,他们的技能不超出对浏览器地址栏的试验,还是一个对 HTTP 是什么以及如何使用有更多了解的用户使用它?

标签: php detect execution


【解决方案1】:

我要做的是找到一段代码,它将(从内部)检测这些脚本是通过 AJAX 从文件执行还是由用户通过 URL 手动执行。

这可能吗??

不,不是 100% 可靠。您无法阻止客户端模拟 Ajax 调用。

不过,您可以测试一些标头,即X-Requested-With。它们会阻止不成熟的用户直接调用您的 Ajax URL。见Detect Ajax calling URL

【讨论】:

  • 感谢您的帮助,我想了很多(不是 100% 可靠)。这不是安全性的主要问题,因为我已经对我的脚本进行了针对 mysql 注入等的炸弹防护,但是任何其他阻止黑客的方法总是有用的。
【解决方案2】:

大多数 AJAX 框架将发送 X-Requested-With: 标头。假设您在 Apache 上运行,您可以使用 apache_request_headers() 函数来检索标头并检查/解析它。

即便如此,没有什么可以阻止某人手动设置此标头 - 没有真正的 100% 万无一失的检测方法,但检查此标头可能会尽可能接近。

根据您需要保护的内容和原因,您可能会考虑要求某种形式的身份验证,和/或使用唯一的哈希/PHP 会话,但任何了解 Javascript 的人仍然可以对此进行逆向工程。

作为您可以验证的事情的想法,如果您在请求服务之前验证所有这些,它将提供一定程度的确定性(虽然不多,如果有人故意试图绕过您的系统,则没有):

  • 在会话值中存储唯一的哈希值,并要求通过 AJAX 调用(在 cookie 或请求参数中)将其发回给您,以便在服务器端比较它们以验证它们是否匹配
  • 检查X-Requested-With: 标头是否设置且值是否合理
  • 检查User-Agent: 标头是否与启动会话的标头相同

你检查的东西越多,攻击者就越有可能感到无聊并在他们做对之前放弃。同样,服务每个请求所需的系统资源越长/越多……

【讨论】:

    【解决方案3】:

    没有 100% 可靠的方法可以防止用户在知道您的请求地址的情况下调用您的脚本。

    这就是您必须对脚本的每个请求进行身份验证的原因。如果您的脚本仅由经过身份验证的用户调用,请在您的脚本中再次检查身份验证。像对待传入的用户输入一样对待它 - 验证和清理所有内容。

    在编辑时:对于用户可以通过 URL 访问的任何脚本都可以这样说。例如,考虑profile.php?userid=3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-26
      • 2012-04-30
      • 2018-02-08
      • 1970-01-01
      • 2012-11-29
      • 2019-09-17
      • 2018-06-07
      • 2011-09-27
      相关资源
      最近更新 更多