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

时间:2013-04-10 17:18:58

标签: php ajax security

我已经阅读了很多关于.htaccess规则,检查标题,使用加密等等。但我还没有找到我正在追求的答案。我知道假设服务器设置正确,您无法使用AJAX访问我宝贵的PHP脚本。我尝试检查是否定义了一个禁止地址栏访问的访问变量,但也阻止了我的AJAX请求。

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

4 个答案:

答案 0 :(得分:4)

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

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

X-Requested-With: XMLHttpRequest

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

答案 1 :(得分:0)

您可以检查请求是否不是Ajax请求并禁止它,但由于可以操作标头,因此它不是很安全。

您可以做的是阻止除允许访问这些文件的IP之外的每个IP。

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

很多方面,但它们并不是实现最大安全性的最佳方法。

答案 2 :(得分:0)

我当然不知道。但是 - 间接地,你可以这样做。传递唯一且不断变化的参数(GET或POST),只有您可以访问该参数作为原点的证明。如果请求缺少这个唯一变量,那么它不是来自你。在这个盒子外面思考。可能是你想要的任何东西,这里有一些想法。

1)将数学方程的结果作为原点证明。你可以通过编程方式预测的东西,但不能明显地撬开黑客攻击者。即cos($dayOfYear)甚至更好base64_encode(base64_encode(cos($dayOfYear)))

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

等。

答案 3 :(得分:-1)

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