我正在使用javascript从XML生成HTML页面(从XML文件生成表),好吧,我有某种XML结构等。我编写HTML代码如下
document.write("<span>" + name + "</span>");
我得到我的变量如下
name = x[i].getElementsByTagName("NAME")[0].childNodes[0].nodeValue;
所以变量名称包含我的XML文件结构中包含的任何节点NAME要演示的简单 XML:
<FILE>
<NAME>file 1.2.3</NAME>
<SIZE>1Kb</SIZE>
</FILE>
XML文件由用户编辑,所以用户可以插入他/她想要的任何内容,所以如果用户输入:<script>alert(1);</script>
到NAME节点JavaScript将打印出常规HTML,浏览器将调用"alert(1)"。这就是我不想发生的事情。
所有的编辑都是用"我的"前端完成的,通过php函数htmlspecialchars();所以实际上用户保存到NAME节点中的是"编码的"HTML
<script>alert(3);</script>
即使这一切还不够,当XML与编码的HTML标签一起保存时,JavaScript将它们打印为普通标签。
换句话说:我如何使用JS(document.write)在页面上书写以下文本: <?php $=1; ?>
或<htmltag>whatever is here </htmltag>
而不会损坏我的真实HTML。
有什么解决办法吗?
例如,这不像我期望的那样工作:
document.write("<span class='"edit'"><script>alert(3);</script></span>");
溶液
在网络上找到此功能
function htmlspecialchars(str) {
if (typeof(str) == "string") {
str = str.replace(/&/g, "&"); /* must do & first */
str = str.replace(/"/g, """);
str = str.replace(/'/g, "'");
str = str.replace(/</g, "<");
str = str.replace(/>/g, ">");
}
return str;
}
它完成了完成的工作,但我真的不明白为什么。
在XML文件中,它已经被"编码"或以应该可以安全呈现的形式(发送到document.write函数)。我只是再次做"htmlspecialchars",它工作得很好。
document.write("<span>" + htmlspecialchars(name) + "</span>");
您是否尝试使用"单引号"?
:document.write('<span class="edit">' + name + '</span>');
如果你想创建动态元素,如果你想再次将这些元素与javascript一起使用,你应该使用DOM函数(createElement,createTextNode,createAttribute):
http://reference.sitepoint.com/javascript/Document/createElement