【问题标题】:PHP, Javascript JSON, XSS ProtectionPHP、Javascript JSON、XSS 保护
【发布时间】:2013-02-07 00:09:47
【问题描述】:

我正在考虑 XSS 漏洞!

我有一个网站,所有的 b/w 网络服务器和客户端数据都通过 XHR 传输 - JSON 和浏览器 javascript 完成其余的工作以显示该网站。

当客户端提交数据时,这是我在数据记录到数据库(PHP)之前的代码:

$string = trim($_POST['user_input']);
$string = strip_tags($string);
$string = mysql_real_escape_string($string);

当服务器从数据库中获取数据时 PHP 代码如下:

$string = htmlspecialchars($db_value);

然后

header('Content-Type: application/json; charset=utf-8');
print json_encode($string);

这足以保护我免受 XSS 攻击吗?

【问题讨论】:

  • 如果您发送的是普通的 XMLHttpRequest,除非您实际将从 AJAX 加载的响应内容放置在任何地方,否则您不会出现 XSS。你在哪里/如何向用户展示它?
  • 顺便提一下,您可以将所有这些功能放在一行代码中。 $string = trim(htmlspecialchars(strip_tags($_POST['string'])));
  • @Brad 谢谢队友,我知道,但在问题中我把它们分开写只是为了更容易阅读。
  • JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT) 选项用于转义 IE 的 HTML 特殊字符和 header("X-Content-Type-Options: nosniff")。
  • 您的意思是说您关注 XSS 漏洞。

标签: php javascript json xss


【解决方案1】:

作为一般经验法则,这里的其他答案是不正确的。将 application/json 用于您的内容类型将解决一些问题,但许多客户端倾向于从 JSON 对象中提取数据并将其显示在页面上。这导致了经典攻击。

阻止 XSS 的唯一可靠方法(我说可靠是因为它不是万无一失的)是清理入站流上的数据(完全拒绝请求可能是一个更好的调用)并对所有可能的输出进行编码显示(即:用户可以修改的任何内容)。

另外,不要接受不为安全而设计的方法本质上是安全的想法(json_encode 不适用于 XSS 安全,不应该这样使用)。任何关于由于 X 而没有必要进行正常安全实践的建议,如果不是完全无视,则应持怀疑态度。

【讨论】:

    【解决方案2】:

    这真的取决于。如果$string post json_encode 的内容包含 HTML 实体并在页面上显示为 html,那么您将容易受到 XSS 攻击。如果不是这种情况(而且不是因为您使用的是application/json),那么不仅不需要使用htmlspecialchars,它可能是不可取的,因为它会改变您尝试通过JSON传输的原始数据。

    我不会说你对 XSS 完全无懈可击,因为它只受到恶人想象力的限制,但我会说 header('Content-Type: application/json;') 在这种情况下提供了足够的保护。

    在不相关的注释上,停止使用ext/mysql

    【讨论】:

    • 好的,我给你举个例子,如果我在将 JSON 发送到客户端之前不使用 htmlspecialchars(),在这种情况下我完全容易受到攻击。
    • @OlegPopov 不一定;这取决于客户将如何使用它。它是否显示为 HTML?应该不会
    • 是的,实际上显示为普通 HTML。如果 STRING 是“ onmouseover="alert('WTF!')” - 它正在发出警报。这就是我使用 htmlspecialchars($string) 的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2014-02-10
    • 2012-08-17
    相关资源
    最近更新 更多