对于我网站上的AJAX,我从Javascript文件调用something.php?request = bla。我不希望用户查看此请求的结果,甚至不要通过输入www.myurl.com/something.php?request=bla来运行PHP文件。我只希望我的服务器上的文件能够调用PHP文件。我考虑过很多事情,例如在PHP脚本本身中进行比较的秘密值,但这听起来太复杂了。我相信有一种更简单的方法。
如何使PHP文件只能在服务器上存在的脚本调用它时才能运行?用户不应该使用他们的地址栏来运行它。
答案 0 :(得分:8)
这根本不可能。您的Ajax请求始终来自客户端。
理论上,您可以检查HTTP_REFERER
标题,但作为安全措施,完全无用。来自客户端的请求(Ajax或非Ajax)的每个方面都可以自由操作,包括referer字段。伪造据称在您的页面上启动的Ajax请求是微不足道的。
首先应该强制实施这样的限制:如果您有一个安全系统(如登录),该系统的限制也将(或应该)应用于Ajax请求。
如果您的Ajax请求允许在没有身份验证的情况下执行有害操作(如删除),则需要添加身份验证。您无法将这些请求限制在某个上下文或网站上。
答案 1 :(得分:1)
对所有AJAX调用使用POST,并拒绝所有GET请求。这不会是完美的,但它会足够好。
答案 2 :(得分:0)
作为 解决方法 (仅限!),您可以探测X-Requested-With:
标头。这将真正的AJAX请求与地址栏调用区分开来。您无法确保请求的来源。
if (stristr($_SERVER["HTTP_X_REQUESTED_WITH"], "XMLHttpRequest")) {
(您可以使用$ .ajax()调用注入更多混淆标题。但同样,这只会让伪造更加麻烦,而不是不可能。)