【问题标题】:Sanitizing user input when creating HTML elements创建 HTML 元素时清理用户输入
【发布时间】:2015-10-24 12:55:42
【问题描述】:

我正在尝试用纯 HTML5 和 Javascript 制作一个待办事项应用程序,但遇到了清理输入的问题。

例如:如果用户输入<script>alert("XSS")</script>,则代码在页面上执行。

添加元素的代码是:

if ($('#TextArea').val() !== "") {
  var taskID = new Date().getTime();
  var taskMessage = $('#textArea').val();
  localStorage.setItem(taskID, taskMessage);
}

而显示元素的代码是:

var i = 0;
for (i = localStorage.length; i != 0; i--) {
  var taskID = localStorage.key(i - 1);
  $('#task').append("<li id='" + taskID + "'>" + localStorage.getItem(taskID) + "</li>");
}

有没有办法只使用 HTML5 和 Javascript 属性来清理数据?

【问题讨论】:

标签: javascript jquery html xss


【解决方案1】:

与任何和所有 XSS 预防一样:不要从字符串构建 HTML,尤其是当这些字符串包含用户提供的值时。

jQuery 有a convenient facility to build elements safely - 你可以传入一个带有属性的对象:

$("<li>", {
  id: taskID,
  text: localStorage.getItem(taskID)
}).appendTo('#task');

事实上,我建议您绝对不要使用字符串连接来构建 HTML。对于比上述更复杂的情况,请使用经过充分测试的 HTML 模板库,例如 MustacheHandlebars

【讨论】:

  • 先生,如果我必须插入一个锚标签,例如 &lt;a href="something"&gt;&lt;li&gt;something&lt;/li&gt;&lt;/a&gt; ,那我该怎么做呢?
  • 您不能将&lt;li&gt; 嵌套在&lt;a&gt; 中,所以让我们反过来:$("&lt;li&gt;").append( $("&lt;a&gt;", {href: "something", text: "something"}) );。这很快就会变得乏味,这就是我推荐模板引擎的原因。比较几个,然后选择一个你喜欢的。
  • 但是先生,如果我必须使用上面的代码:$("&lt;li&gt;", {id: taskID,text:localStorage.getItem(taskID)}).appendTo('#task');$("&lt;li&gt;").append( $("&lt;a&gt;", {href: "something", text: "something"}) );,我们该怎么做呢?
  • $("&lt;li&gt;").append( $("&lt;a&gt;", {href: "something", text: "something"}) ).appendTo("#task");,如果我没听错的话。您似乎缺少基本的 jQuery 基础知识,请花一些时间了解 jQuery 的工作原理。使用您并不真正了解的库不是一个好主意。
  • 不,先生,我理解那部分。实际上,如果你会看到这个:jsfiddle.net/bwk54ma2/1。我无法做到的是,我还希望
  • 具有 id=taskID(例如 &lt;li id=taskID&gt;&lt;a href=taskID&gt;Something&lt;/a&gt;&lt;/li&gt;),并且我不能嵌套该属性。
猜你喜欢
相关资源
最近更新 更多
热门标签