我已经阅读了很多关于 .htaccess 规则、检查标头、使用加密等的内容。但我还没有找到我想要的确切答案。我知道,假设服务器设置正确,您将无法使用 AJAX 访问我宝贵的 PHP 脚本。我尝试检查是否定义了一个访问变量,该变量不允许地址栏访问但也阻止了我的 AJAX 请求。
如果我有一些用于 AJAX 调用的 PHP 脚本,是否有办法阻止地址栏访问、PHP POST(cURL 等)以及来自我域外部的 AJAX(假设通过跨域访问限制)?
没有办法绝对安全/可靠地识别请求来自浏览器的哪个部分——地址栏、AJAX。有一种方法可以通过 User-Agent 标头识别通过浏览器/curl/etc 发送的内容(但不可靠)
一个快速但不太可靠的解决方案是检查以下标题。大多数浏览器使用 AJAX 调用附加它。请务必彻底调查并实施。
X-Requested-With: XMLHttpRequest
注意:如果资源很重要,请不要相信客户。你最好实现一些其他的访问过滤方式。请记住,任何人都可以伪造标题!
您可以检查请求是否不是 Ajax 请求并禁止它,但由于可以操纵标头,因此它并不安全。
您可以做的是阻止除允许访问这些文件的 IP 之外的所有 IP。
可以做的是实现一种身份验证,其中外部应用程序必须将凭据发送到您的脚本,并且脚本会检查客户端是否有效。
方法很多,但它们都不是实现最大安全性的最佳方法。
我不确定。然而——间接地,你可以做到这一点。传递一个唯一且不断变化的参数(GET 或 POST),只有您可以访问该参数作为来源证明。如果请求缺少这个唯一变量,那么它不是来自您。跳出框框思考这个问题。可以是你想要的任何东西,这里有一些想法。
1) 传递数学方程的结果作为来源证明。您可以以编程方式预测的东西,但对于窥探标头黑客来说并不明显。即cos($dayOfYear)
甚至更好base64_encode(base64_encode(cos($dayOfYear)))
。
2)在数据库中存储一个唯一键,每次有人访问该页面时该键都会更改。然后将该密钥与请求一起传递,并在结束页面上进行一些检查,如果它们与数据库密钥不匹配,您就找到了偷窥者。(请注意,将涉及确保密钥在请求传输之间没有更改的逻辑)
ETC..
尝试从 POST 访问中捕获 isset SERVER['HTTP_ORIGIN'] ,它必须与您的域相同。如果是这样,那么 POST 是由您自己的网站生成的,并且可以安全地处理它。