如何防止外部PHP脚本的“手动执行”

时间:2011-09-04 20:36:47

标签: php detect execution

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

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

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

等。

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

我要做的是查找是一段代码,用于检测(从内部)是否通过AJAX或MANUALLY通过URL从文件执行这些脚本。

这是可能的吗?

我已经在所有地方进行了搜索并尝试了各种方法来处理$ _SERVER []数组,但仍未成功。

3 个答案:

答案 0 :(得分:3)

  

我要做的是查找是一段代码,用于检测(从内部)是否通过AJAX或MANUALLY通过URL从文件执行这些脚本。

     

这是可能的吗?

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

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

答案 1 :(得分:2)

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

即便如此,没有什么可以防止有人手动设置这个标题 - 没有真正的100%万无一失的方法来检测这个,但检查这个标题可能就像你将得到的那样接近。

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

作为一个你可以验证的事情的想法,如果你在服务之前验证所有这些,你会提供一定程度的确定性(尽管不是很多,如果有人故意试图对你的系统进行处理,那就没有了):

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

您查看的内容越多,攻击者在获得正确之前就越有可能感到无聊和放弃。同样,为每个请求提供服务所需的系统资源越多/越多......

答案 2 :(得分:1)

如果用户知道您的请求的地址,则无法100%可靠地阻止用户调用您的脚本。

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

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