DFe*_*oso 17 html javascript escaping
我正在使用一个Web服务,它会给我以下值:
var text = "<<<&&&";
Run Code Online (Sandbox Code Playgroud)
我需要使用javascript将其打印为"<<< &&&".
但是这里有一个问题:我不能使用内部HTML(我实际上是将这些值发送到创建文本节点的原型库,因此它不会取消我的原始html字符串.如果编辑库不是一个选项,如何你会忘记这个HTML吗?
我需要在这里承担真正的交易,这种类型的字符串有什么风险?innerHTML是如何做到的?还有哪些其他选择?
编辑 - 问题不是关于使用javascript普通的escape/unescape甚至jQuery/prototype实现它们,而是关于可能来自使用任何这些的安全问题...又名"他们告诉我使用它们是非常不安全的"
(对于那些试图用innerHTML来解决这个奇怪字符串的问题,请看看这个简单的例子:
<html>
<head>
<title>createTextNode example</title>
<script type="text/javascript">
var text = "<<<&&&";
function addTextNode(){
var newtext = document.createTextNode(text);
var para = document.getElementById("p1");
para.appendChild(newtext);
}
function innerHTMLTest(){
var para = document.getElementById("p1");
para.innerHTML = text;
}
</script>
</head>
<body>
<div style="border: 1px solid red">
<p id="p1">First line of paragraph.<br /></p>
</div><br />
<button onclick="addTextNode();">add another textNode.</button>
<button onclick="innerHTMLTest();">test innerHTML.</button>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
Sto*_*bor 11
更改您的测试字符串以<b><<&&&</b>
更好地处理风险是什么...(或更好地,<img src='http://www.spam.com/ASSETS/0EE75B480E5B450F807117E06219CDA6/spamReg.png' onload='alert(document.cookie);'>
对于cookie窃取垃圾邮件)
请参阅http://jsbin.com/uveme/139/上的示例(基于您的示例,使用原型进行取消转换.)尝试单击四个不同的按钮以查看不同的效果.只有最后一个是安全风险.(您可以在http://jsbin.com/uveme/139/edit查看/编辑源代码)该示例实际上并没有窃取您的Cookie ...
createTextNode
用于创建文本节点并将未appendChild
更改的节点对象直接插入到文档中,那么您就是安全的.注意:正如Ben Vinegar指出的那样使用createTextNode
它并不是一个神奇的子弹:使用它来逃避字符串,然后使用textContent
或innerHTML
获取转义文本并使用它做其他事情并不能保护您的后续使用.特别是,如果用于填充属性,下面的Peter Brown的回答中的escapeHtml方法是不安全的.
一个非常好的阅读是http://benv.ca/2012/10/4/you-are-probably-misusing-DOM-text-methods/,这解释了为什么使用createTextNode的常规智慧实际上根本不安全.
一个代表性的例子来自上面的风险文章:
function escapeHtml(str) {
var div = document.createElement('div');
div.appendChild(document.createTextNode(str));
return div.innerHTML;
};
var userWebsite = '" onmouseover="alert(\'derp\')" "';
var profileLink = '<a href="' + escapeHtml(userWebsite) + '">Bob</a>';
var div = document.getElementById('target');
div.innerHtml = profileLink;
// <a href="" onmouseover="alert('derp')" "">Bob</a>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
43781 次 |
最近记录: |