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

阻止外部访问PHP脚本,但允许AJAX,php,ajax,security,Php,Ajax,Security,我读了很多关于.htaccess规则、检查头、使用加密等的书。。但我还没有找到我想要的答案。我知道,如果服务器设置正确,就无法使用AJAX访问我宝贵的PHP脚本。我尝试检查是否定义了访问变量,该变量不允许访问地址栏,但也阻止了我的AJAX请求 如果我有一些用于AJAX调用的PHP脚本,是否有一种方法可以阻止地址栏访问、PHP POST(cURL等)以及来自我域之外的AJAX(通过跨域访问限制假设)?没有绝对的方法来安全/可靠地识别请求来自浏览器的哪个部分——地址栏、AJAX。有一种方法可以通过用

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


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

没有绝对的方法来安全/可靠地识别请求来自浏览器的哪个部分——地址栏、AJAX。有一种方法可以通过用户代理头识别通过browser/curl/etc发送的内容(但不可靠)

一个快速但不太可靠的解决方案是检查以下标题。大多数浏览器通过AJAX调用将其附加。一定要彻底调查,并实施

X-Requested-With: XMLHttpRequest

注意:如果资源不可靠,请不要信任客户端。您最好实施一些其他的访问筛选方法。记住,任何人都可以伪造标题

绝对没有办法安全/可靠地识别请求来自浏览器的哪个部分——地址栏、AJAX。有一种方法可以通过用户代理头识别通过browser/curl/etc发送的内容(但不可靠)

一个快速但不太可靠的解决方案是检查以下标题。大多数浏览器通过AJAX调用将其附加。一定要彻底调查,并实施

X-Requested-With: XMLHttpRequest

注意:如果资源不可靠,请不要信任客户端。您最好实施一些其他的访问筛选方法。记住,任何人都可以伪造标题

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

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

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


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

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

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

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


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

我不太清楚。然而,你可以间接地做到这一点。传递一个唯一且不断变化的参数(GET或POST),该参数只有您有权访问,作为来源证明。如果请求缺少此唯一变量,则它不是来自您。在这件事上跳出框框思考。可能是你想要的任何东西,这里有一些想法

1) 传递数学方程的结果作为原点的证明。您可以通过编程方式预测,但对窥探头部的黑客来说并不明显。i、 e
cos($dayOfYear)
或者更好的
base64_编码(base64_编码(cos($dayOfYear))

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


等等,我不太清楚。然而,你可以间接地做到这一点。传递一个唯一且不断变化的参数(GET或POST),该参数只有您有权访问,作为来源证明。如果请求缺少此唯一变量,则它不是来自您。在这件事上跳出框框思考。可能是你想要的任何东西,这里有一些想法

1) 传递数学方程的结果作为原点的证明。您可以通过编程方式预测,但对窥探头部的黑客来说并不明显。i、 e
cos($dayOfYear)
或者更好的
base64_编码(base64_编码(cos($dayOfYear))

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


等等。

尝试从POST访问中捕获isset服务器['HTTP_ORIGIN',它必须与您的域相同。如果是这样,那么帖子是由您自己的网站生成的,处理它是安全的。

尝试从帖子访问中捕获isset服务器['HTTP_ORIGIN',它必须与您的域相同。如果是这样的话,那么帖子是由yourselft网站生成的,处理它是安全的。

你不能阻止公共(AJAX或非AJAX)访问,同时允许它。所以任何知道我脚本路径的人都可以使用AJAX修改我的SQLite数据库?@paranoid android不,你应该通过某种身份验证来保护你的AJAX请求。“AJAX”并不意味着“未经验证”。任何事情都是可能的,您可以侦听任何不是AJAX请求的内容,并在有人试图直接访问PHP文件时显示消息,但标题很容易被伪造,因此这并不真正安全。您可以使用.htaccess来阻止来自任何非您自己的IP的访问,或者您可以使用PHP来执行相同的操作,等等。您可以使其变得困难,但是