【发布时间】:2013-08-02 05:53:53
【问题描述】:
一直在尝试创建一个简单的 JSONP 调用,但它并不总是有效,我不知道为什么。代码如下:
服务器端(http://server/server.php):
<?php
$res = json_encode("It works!");
if(isset($_GET['callback']) === TRUE) {
header('Content-Type: text/javascript;');
header('Access-Control-Allow-Origin: http://client');
header('Access-Control-Max-Age: 3628800');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
echo $_GET['callback']."(".$res.");";
} else {
echo $res;
}
?>
客户端(http://client/client.html):
<html>
<head><title>JSONP</title></head>
<body>
<h1>JSONP Experiment</h1>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
function process(data) {
$('#result').text(data);
}
$.getJSON(
'http://server/server.php?callback=?',
{'callback': 'process'}
);
</script>
<p id="result"></p>
</body>
</html>
此代码有效并显示“有效!”在我的
阻止。
为什么我不使用
{'callback': 'process'}并将 ?callback=process 直接放入 $.getJSON() URL 时它不起作用?如果我使用
<script src="http://server/server.php?callback=process"></script>而不是 $.getJSON() 调用,为什么它不起作用?
两个不工作的情况实际上都返回 process("It works"); 但这没有被执行,为什么?
谢谢
【问题讨论】:
-
请注意,
echo $_GET['callback']确实不是一个好主意。你应该确保函数名是一个有效的 JS 标识符。 -
@lonesomeday 虽然它并没有真正构成安全风险。如果代码发送的东西不是有效的 JS 标识符,那么将会发生的一切就是它根本不起作用——唯一可以实现的就是破坏它,这只会影响调用客户端,所以基本上,攻击者只会把自己搞砸。
-
@DaveRandom 这是一个潜在的 XSS 漏洞。更重要的是,应该使用错误响应来处理故障事件。在这种情况下,
400 Bad Request。但这是问题的一个侧面。 -
@lonesomeday 事实上,它是直接(而不是存储)回显,结合 SOP,应该 否定 XSS 漏洞(除非我遗漏了什么?)但是我完全同意处理错误。