我正在处理的项目,对页面上的每个链接使用AJAX调用,更具体地说,jQuery AJAX调用,除了登录之外,每个提交的表单都是通过AJAX提交的,还有一些json,和xml,在混合中,我的问题是,这有什么安全隐患?所有服务器端代码都是PHP,所有内容都被正确转义。
答案 0 :(得分:13)
AJAX中没有任何特定内容。这只是您的浏览器执行的请求。它只是一般的HTTP请求,应该像任何其他HTTP请求一样受到保护,无论其XHR性质如何。
答案 1 :(得分:2)
人们普遍认为,没有必要使用XSRF令牌来保护仅通过GET公开数据并通过cookie授权用户的服务。
事实并非如此。当输出是JSON数组时,这些过去常常具有AJAX特定的XSSI漏洞。
考虑一个返回/getfriends
等数据的服务[ { "name": "Alice" }, { "name": "Bob" } ]
。
攻击页面可以
<script>
var stolenData;
var RealArray = Array;
Array = function () {
return stolenData = new RealArray();
};
</script>
<script src="https://naivedomain.com/getfriends" type="text/javascript"></script>
并且第二个<script>
标记使用用户的Cookie在域中加载了JSON
由于EcmaScript 3中的怪癖(在EcmaScript 5.0和现代ES 3解释器中修复),页面可以读取被盗数据,因为JavaScript解析器在解析JSON响应中的Array
时调用了被覆盖的[...]
构造函数
除了普通的基于cookie的方法之外,通过XSRF令牌保护这些服务解决了这个问题,例如禁止GET,通过自定义标头授权以及包括解析器。解析断路器通过使响应无效JSON来工作,例如返回throw 0; [{ "name": "Alice" }, { "name": "Bob" }]
以便XHR客户端可以删除throw 0;
前缀,但是通过<script>
加载的客户端不能。{/ p>
最后,由于JavaScript解析器将加载的脚本解析为程序,因此这只会影响返回JSON数组的服务。返回/getfriend
的{{1}}服务不会受到攻击,因为该内容不是有效程序 - 它被解析为具有无效标签的块。但是像{ "names": ["Alice", "Bob"] }
这样的无效JSON很容易被攻击,因为这是一个有效的程序。
答案 2 :(得分:0)
Ajax违反了有关POST数据中保留字符转义百分比的安全规则。纯粹而简单,这允许将恶意代码直接注入SQL模式,这些模式可以是诸如PHP代码之类的东西,以便以后在主机上检索和执行。在AJAX开始转义所有保留的GET和POST字符之前,正如普通浏览器对表单所做的那样,如果没有针对恶意代码段的每次通信进行完整扫描,就不会信任它。