3 回答
TA贡献1802条经验 获得超5个赞
大多数Ajax请求/框架应该设置此特定标头,您可以使用它来过滤Ajax v非Ajax请求。我用它来帮助确定大量项目中的响应类型(json / html):
if( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && ( $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ) ){ // allow access....} else { // ignore....}
编辑:您可以在自己的Ajax请求中自己添加它,并在javascript代码中添加以下内容:
var xhrobj = new XMLHttpRequest();xhrobj.setRequestHeader("X-Requested-With", "XMLHttpRequest");
TA贡献1943条经验 获得超7个赞
这个帖子中建议查看标题的任何人在某种程度上都是错误的。请求中的任何内容(HTTP_REFERER,HTTP_X_REQUESTED_WITH)都可能被不完全无能的攻击者欺骗,包括共享机密[1]。
您无法阻止人们向您的网站发出HTTP请求。您要做的是确保用户在通过会话cookie向网站的某些敏感部分发出请求之前必须进行身份验证。如果用户发出未经身份验证的请求,请在此处停止并为其提供HTTP 403。
您的示例发出GET请求,因此我猜您关注请求的资源要求[2]。您可以对.htaccess规则中的HTTP_REFERER或HTTP_X_REQUESTED_WITH标头执行一些简单的完整性检查,以阻止针对明显虚假请求(或不会收听robots.txt的愚蠢搜索爬虫)生成新进程,但如果攻击者伪造那些,你要确保你的PHP进程尽早退出非经过身份验证的请求。
[1]这是客户端/服务器应用程序的基本问题之一。这就是为什么它不起作用:假设您有一种方法让您的客户端应用程序向服务器验证自己 - 无论是密码还是其他方法。应用程序所需的信息必须是应用程序可访问的(密码隐藏在某处,或其他任何地方)。但是因为它在用户的计算机上运行,这意味着他们也可以访问这些信息:他们所需要的只是查看源,二进制或应用程序与服务器之间的网络流量,最终他们会弄明白您的应用程序进行身份验证和复制的机制。也许他们甚至会复制它。也许他们会写一个聪明的黑客来让你的应用程序做繁重的工作(你总是可以向用户发送虚假的用户输入)。
[2]精心设计的应用程序中的GET请求没有副作用,因此没有人制作它们将能够在服务器上进行更改。您的POST请求应始终使用session plus CSRF令牌进行身份验证,以便只有经过身份验证的用户才能调用它们。如果有人对此进行攻击,则表示他们拥有您的帐户,并且您想要关闭该帐户。
- 3 回答
- 0 关注
- 510 浏览
添加回答
举报