禁止外部访问PHP脚本,但允许AJAX


Prevent external access to PHP scripts but allow AJAX

我读过很多关于。htaccess规则,检查头,使用加密等。但我还没有找到我想要的答案。我知道,假设服务器设置正确,您无法使用AJAX访问我宝贵的PHP脚本。我试着检查是否定义了一个访问变量,它不允许访问地址栏,但也阻止了我的AJAX请求。

如果我有一些PHP脚本,我使用AJAX调用,是否有一种方法,我可以阻止地址栏访问,PHP POST (cURL等)以及AJAX从我的域外(假设通过跨域访问限制)?

没有绝对安全/可靠地识别请求来自浏览器的哪个部分的方法——地址栏,AJAX。有一种方法可以通过User-Agent头(但不可靠)识别通过浏览器/curl/等发送的内容

一个快速但不太可靠的解决方案是检查以下标头。大多数浏览器都用AJAX调用附加它。请务必仔细研究并实施。

X-Requested-With: XMLHttpRequest

说明:如果资源是关键的,不要信任客户端。您最好实现一些其他的访问过滤方法。记住,任何人都可以伪造标题!

您可以检查请求是否不是Ajax请求并禁止它,但由于header可以被操纵,因此并不真正安全。

你能做的就是阻止除了允许访问这些文件的IP之外的所有IP。

可以做的是实现一种身份验证,其中外部应用程序必须向脚本发送凭据,脚本检查客户端是否有效。

有很多方法,但它们都不是真正实现最大安全性的最佳方法。

我不确定。然而,你可以间接地做到这一点。传递一个唯一且不断变化的参数(GET或POST),只有您可以访问该参数作为来源的证明。如果请求缺少这个唯一变量,那么它就不是来自您。在这个问题上跳出常规思考。可以是你想要的任何东西,这里有一些想法。

1)传递一个数学方程的结果作为原点的证明。您可以通过编程来预测,但对于窥探标头的黑客来说并不明显。即cos($dayOfYear)或更好的base64_encode(base64_encode(cos($dayOfYear)))

2)在数据库中存储一个唯一的键,每次有人访问该页时该键都会改变。然后将该键与请求一起传递,并在结束页上做一些检查,如果它们与数据库键不匹配,那么您就找到了偷窥者。(注意,将涉及到确保在请求传输之间的密钥没有更改的逻辑)

等。

尝试从POST访问捕获isset SERVER['HTTP_ORIGIN'],它必须与您的域相同。如果是,那么POST是由您自己的网站生成的,并且可以安全地处理它。