使用 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();
例如$("<div/>").html('<img src="X" onerror="alert(\'hi\');" />').text()
显示警报。
This answer 建议使用textarea
来避免 XSS 漏洞:
return $('<textarea/>').html(encodedText).text();
这能够安全地处理之前的漏洞。
但是this answer表示使用textarea
时仍然存在XSS漏洞:
我建议使用更安全、更优化的函数
不要使用 jQuery.html().text() 来解码 html 实体,因为它不安全,因为用户输入不应该访问 DOM
我的问题是:假设攻击者可以访问encodedText
,是否有办法在任何浏览器中利用$('<textarea/>').html(encodedText);
运行XSS?
【问题讨论】:
$('<textarea/>').html('<script>alert()</script>').text();
仍会运行该脚本。我看不出使用 <textarea>
有什么好处。
哦,废话,你说得对,textarea
处理我发布的漏洞,但不是你更简单的漏洞!
这是因为当<img>
元素是<textarea>
的一部分时,浏览器(或至少Chrome)不会触发onerror
事件。但是如果攻击者可以访问encodedText
,那么简单的脚本注入仍然会运行。您需要问自己为什么encodedText
由最终用户控制?它是存储在数据库中的东西(然后在保存时对其进行清理),是否通过某些请求参数注入(不要这样做,或者至少在以任何方式解析/附加到 DOM 之前尝试对其进行操作)。
将此添加为答案,我会接受它
【参考方案1】:
老实说,我不会冒险,如果您在服务器端处理任何需要加密或未加密的东西,那会更安全。
【讨论】:
此方法的目的是将me &amp; you
之类的字符串转换为me & you
。所以我可以做那个服务器端,但是我把它写到页面上。将未编码的 html 特殊字符写入页面将是另一种 XSS 攻击。例如,用户可以写<script>alert('lol')</script>
。所以如果我想将数据写入页面然后显示它,我必须在服务器上对其进行编码,然后在客户端将其取消编码。以上是关于使用 textarea 开发 jQuery HTML 解码的主要内容,如果未能解决你的问题,请参考以下文章
在按键事件中使用jQuery在textarea中设置文本[重复]
使用 jquery 将选择器元素的 html 写入 textarea
使用 javascript 或 Jquery 获取 textarea 文本