使用 textarea 开发 jQuery HTML 解码

Posted

技术标签:

【中文标题】使用 textarea 开发 jQuery HTML 解码【英文标题】:Exploiting jQuery HTML decoding using textarea 【发布时间】:2015-09-25 21:36:25 【问题描述】:

跟进my last question...

如果攻击者可以访问encodedText,则可以利用此代码:

return $('<div/>').html(encodedText).text();

例如$("&lt;div/&gt;").html('&lt;img src="X" onerror="alert(\'hi\');" /&gt;').text() 显示警报。

This answer 建议使用textarea 来避免 XSS 漏洞:

return $('<textarea/>').html(encodedText).text();

这能够安全地处理之前的漏洞。

但是this answer表示使用textarea时仍然存在XSS漏洞:

我建议使用更安全、更优化​​的函数

不要使用 jQuery.html().text() 来解码 html 实体,因为它不安全,因为用户输入不应该访问 DOM

我的问题是:假设攻击者可以访问encodedText,是否有办法在任何浏览器中利用$('&lt;textarea/&gt;').html(encodedText); 运行XSS?

【问题讨论】:

$('&lt;textarea/&gt;').html('&lt;script&gt;alert()&lt;/script&gt;').text(); 仍会运行该脚本。我看不出使用 &lt;textarea&gt; 有什么好处。 哦,废话,你说得对,textarea 处理我发布的漏洞,但不是你更简单的漏洞! 这是因为当&lt;img&gt; 元素是&lt;textarea&gt; 的一部分时,浏览器(或至少Chrome)不会触发onerror 事件。但是如果攻击者可以访问encodedText,那么简单的脚本注入仍然会运行。您需要问自己为什么encodedText 由最终用户控制?它是存储在数据库中的东西(然后在保存时对其进行清理),是否通过某些请求参数注入(不要这样做,或者至少在以任何方式解析/附加到 DOM 之前尝试对其进行操作)。 将此添加为答案,我会接受它 【参考方案1】:

老实说,我不会冒险,如果您在服务器端处理任何需要加密或未加密的东西,那会更安全。

【讨论】:

此方法的目的是将me &amp;amp; you之类的字符串转换为me &amp; you。所以我可以做那个服务器端,但是我把它写到页面上。将未编码的 html 特殊字符写入页面将是另一种 XSS 攻击。例如,用户可以写&lt;script&gt;alert('lol')&lt;/script&gt;。所以如果我想将数据写入页面然后显示它,我必须在服务器上对其进行编码,然后在客户端将其取消编码。

以上是关于使用 textarea 开发 jQuery HTML 解码的主要内容,如果未能解决你的问题,请参考以下文章

在按键事件中使用jQuery在textarea中设置文本[重复]

使用 jquery 将选择器元素的 html 写入 textarea

使用 javascript 或 Jquery 获取 textarea 文本

jquery 获取textarea文本值详解

启用 TextArea 以使用 JQuery 进行编辑 [关闭]

使用 jQuery 将文本附加到 textarea 的末尾