以此HTML为例:
<td onclick="$(this).html('Wanted HTML: <br>; Unwanted HTML: <script>alert('xss')</script>')">
Click to Show</td>
正如您所看到的,我已经将不需要的HTML转义(使用PHP)到实体。但是,当您单击该框时,它将执行JavaScript。
如果我将.html
更改为.text
,它也会按字面意思显示换行符。
我怎样才能将<br>
s显示为换行符,但<
和>
字面上小于和大于单击框时的符号?
答案 0 :(得分:2)
问题是,您的字符在onclick
中被解码,然后才会到达JavaScript函数。
您需要进行双重编码。所以你的例子将成为:
<td onclick="$(this).html('Wanted HTML: <br>; Unwanted HTML: &lt;script&gt;alert(&#39;xss&#39;)&lt;/script&gt;')">
Click to Show
</td>
请注意,我对 想要的标记进行了编码(单一编码)。我还在第一个>
添加了缺少的分号。
当然,更好的解决方案是完全从HTML中删除它。大多数开发人员都同意JavaScript是用于交互性而HTML用于内容,并且它们应该尽可能少地混合(使用addEventHandler
等调用将JavaScript挂钩到内容中)