简单来说,我在客户的网站上使用外部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 []数组,但仍未成功。
答案 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>
作为一个你可以验证的事情的想法,如果你在服务之前验证所有这些,你会提供一定程度的确定性(尽管不是很多,如果有人故意试图对你的系统进行处理,那就没有了):
X-Requested-With:
标题已设置且值是否合理User-Agent:
标题是否与启动会话的标题相同您查看的内容越多,攻击者在获得正确之前就越有可能感到无聊和放弃。同样,为每个请求提供服务所需的系统资源越多/越多......
答案 2 :(得分:1)
如果用户知道您的请求的地址,则无法100%可靠地阻止用户调用您的脚本。
这就是您必须验证脚本的每个请求的原因。如果您的脚本仅由经过身份验证的用户调用,请在脚本中再次检查身份验证。对待它,因为您将处理传入的用户输入 - 验证和清理所有内容。
On Edit:对于用户可以通过URL访问的任何脚本,都可以这样说。例如,请考虑profile.php?userid=3