jQuery不解析.html()方法中的转义HTML

时间:2013-03-30 02:47:16

标签: javascript jquery html xss sanitization

以此HTML为例:

<td onclick="$(this).html('Wanted HTML: <br>; Unwanted HTML: &lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;')">
Click to Show</td>

正如您所看到的,我已经将不需要的HTML转义(使用PHP)到实体。但是,当您单击该框时,它将执行JavaScript。

如果我将.html更改为.text,它也会按字面意思显示换行符。

我怎样才能将<br> s显示为换行符,但&lt;&gt;字面上小于和大于单击框时的符号?

1 个答案:

答案 0 :(得分:2)

问题是,您的字符在onclick中被解码,然后才会到达JavaScript函数。

您需要进行双重编码。所以你的例子将成为:

<td onclick="$(this).html('Wanted HTML: &lt;br&gt;; Unwanted HTML: &amp;lt;script&amp;gt;alert(&amp;#39;xss&amp;#39;)&amp;lt;/script&amp;gt;')">
    Click to Show
</td>

请注意,我对 想要的标记进行了编码(单一编码)。我还在第一个&gt;添加了缺少的分号。

当然,更好的解决方案是完全从HTML中删除它。大多数开发人员都同意JavaScript是用于交互性而HTML用于内容,并且它们应该尽可能少地混合(使用addEventHandler等调用将JavaScript挂钩到内容中)