2013-05-17 115 views
1

这个问题已被问了很多次。见herehereherePHP json_encode和XSS

基于对这些问题我做了一些测试,我被迫再次问同样的问题没有答案的答案似乎是正确的(在 - 至少对我来说)。如果我对主题的理解不好,请纠正我。

我正在为输出JSON响应的Web应用程序开发API。服务器端响应由PHP中的json_encode处理。因为,这将是一个公共API,我想阻止任何XSS,因为使用API​​的发动机不正确的客户端实现。

对于我的测试,我做了服务器端执行以下操作:我使用jQuery AJAX能够自动解析JSON收到

header("Content-Type: application/json", true); 
$bad = array('bad_key' => 'alert("hi");'); 
echo json_encode($bad); 

在客户端。最初这似乎没有显示任何XSS问题。然后我通过response.bad_keyeval()

eval(response.bad_key); 

这立即导致bad_key执行字符串。我知道使用eval是不好的,应该避免。但是,这是我知道的,并不能确保其他开发人员遵循相同的做法。为了避免这种情况,解决方案将是执行服务器端编码。对于这个让我们说我使用htmlspecialchars

header("Content-Type: application/json", true); 
$bad = array('bad_key' => htmlspecialchars('alert("hi");')); 
echo json_encode($bad); 

这一点,尽管它不执行alert("hi");客户端,但打破了JS代码由于&存在。 json_encode与选项JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS建议here也没有帮助。

那么如何在这种情况下防止XSS?

回答

9

在这种情况下,您不需要防止“XSS”。如果某人足够愚蠢以执行一些随机数据,那么您将其作为JavaScript发送给您,但您无法对此做任何事情。事实上,如果你确实逃脱了某些东西来阻止它,他可能会嘲笑它以使其再次运行。

注意,使用eval解析 JSON字符串是偏于安全(假设你发送有效的JSON) - 尽管它在任何现代的浏览器,有一个天然的JSON.parse()真实气馁。 但在你的例子中,你不用它来解析JSON,而是执行一些随机数据串!当任何人这么做的时候,这意味着他希望将其作为代码执行 - 所以它不是XSS,而是“按预期工作”!

+1

+1你无法保护人们免于自己的愚蠢。消除任何和所有*潜在的*“危险”字符串,根本没有内容。 – deceze

+0

@thiefmaster是的,这是一个灰色的地方,我实在无法做一些事情来防止由于其他人执行不当而导致错误。我想可能是我错过了一些东西。感谢您的澄清。 – John

+1

它甚至不是“糟糕的实现” - 它需要其他用户主动执行一些数据作为JavaScript代码。 – ThiefMaster