【问题标题】:PHP json_encode and XSSPHP json_encode 和 XSS
【发布时间】:2013-05-17 12:19:07
【问题描述】:

这个问题已经被问过很多次了。见hereherehere

根据这些问题的答案,我做了一些测试,但我不得不再次问同样的问题,因为没有一个答案似乎是正确的(至少对我来说)。如果我对主题的理解不好,请纠正我。

我正在开发一个用于输出 JSON 响应的 Web 应用程序的 API。服务器端响应由 PHP 中的json_encode 处理。因为,这将是一个公共 API,所以我希望防止由于使用 API 的开发人员执行不正确的客户端实现而导致的任何 XSS。

对于我的测试,我在服务器端做了以下操作:

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

在客户端,我使用 jQuery AJAX 自动解析收到的 JSON。最初,这似乎没有显示任何 XSS 问题。然后我将response.bad_key 传递给eval()

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 呢?

【问题讨论】:

    标签: php javascript xss json


    【解决方案1】:

    在这种情况下,您不需要阻止“XSS”。如果有人愚蠢到执行一些随机数据,你将其作为 JavaScript 发送给他,那么你对它无能为力。实际上,如果您确实逃脱了某些东西以防止它发生,他可能会取消它以使其再次起作用。

    请注意,使用eval解析 JSON 字符串在一定程度上是安全的(假设您发送有效的 JSON) - 即使在任何具有本机 JSON.parse() 的现代浏览器中都不鼓励这样做。 但是在您的示例中,您不使用它来解析 JSON,而是使用它来执行一些随机的数据字符串!当任何人这样做时,这意味着他希望它作为代码执行 - 所以它不是 XSS,而是“按预期工作”!

    【讨论】:

    • +1 你无法保护人们免于愚蠢。清除所有可能“危险”的字符串会让你基本上没有任何内容。
    • @thiefmaster 是的,这是一个灰色地带,我真的无法做些什么来防止由于其他人实施不当而出错。我想可能是我错过了什么。感谢您的澄清。
    • 它甚至不会是“糟糕的实现”——它需要其他用户主动将一些数据作为 JavaScript 代码执行。
    猜你喜欢
    • 1970-01-01
    • 2018-07-16
    • 2012-08-17
    • 2011-02-23
    • 2023-03-31
    • 1970-01-01
    • 2015-01-19
    • 2011-09-04
    • 1970-01-01
    相关资源
    最近更新 更多