Dojo Toolkit:如何转义 HTML 字符串?
Posted
技术标签:
【中文标题】Dojo Toolkit:如何转义 HTML 字符串?【英文标题】:Dojo Toolkit: how to escape an HTML string? 【发布时间】:2012-04-11 19:31:36 【问题描述】:我的 html 5 应用程序的用户可以在表单中输入他的姓名,该姓名将显示在其他地方。更具体地说,它将成为某个 HTML 元素的innerHTML
。
问题在于,如果您在表单中输入有效的 HTML 标记,即某种 HTML 注入(如果您愿意的话),这可能会被利用。
用户的名字只是在客户端存储和显示,所以最终只有用户自己受到影响,但还是比较马虎。
在我将字符串放入 Dojo 中的元素 innerHTML
之前,有没有办法对其进行转义?我猜 Dojo 在某一时刻确实有这样的功能 (dojo.string.escape()
) 但它在 1.7 版本中不存在。
谢谢。
【问题讨论】:
【参考方案1】:dojox.html.entities.encode(myString);
【讨论】:
工作就像一个魅力,我不必重新发明***。谢谢!【参考方案2】:Dojo 具有用于 HTML 转义的模块 dojox/html/entities
。不幸的是,the official documentation 仍然只提供 1.7 之前的非 AMD 示例。
这是一个如何在 AMD 中使用该模块的示例:
var str = "<strong>some text</strong>"
require(['dojox/html/entities'], function(entities)
var escaped = entities.encode(str)
console.log(escaped)
)
输出:
&lt;strong&gt;some text&lt;/strong&gt;
【讨论】:
【参考方案3】:从 Dojo 1.10 开始,转义函数仍然是字符串模块的一部分。
http://dojotoolkit.org/api/?qs=1.10/dojo/string
以下是如何将其用作简单模板系统的方法。
require([
'dojo/string'
], function(
string
)
var template = '<h1>$title</h1>';
var message = title: 'Hello World!<script>alert("Doing something naughty here...")</script>'
var html = string.substitute(
template
, message
, string.escape
);
);
【讨论】:
【参考方案4】:我试图找出其他库是如何实现这个功能的,我从 MooTools 中借鉴了以下想法:
var property = (document.createElement('div').textContent == null) ? 'innerText': 'textContent';
elem[property] = "<" + "script" + ">" + "alert('a');" + "</" + "script" + ">";
所以根据 MooTools 有可以转义 HTML 的 innerText 或 textContent 属性。
【讨论】:
【参考方案5】:查看dojo.replace
的这个例子:
require(["dojo/_base/lang"], function(lang)
function safeReplace(tmpl, dict)
// convert dict to a function, if needed
var fn = lang.isFunction(dict) ? dict : function(_, name)
return lang.getObject(name, false, dict);
;
// perform the substitution
return lang.replace(tmpl, function(_, name)
if(name.charAt(0) == '!')
// no escaping
return fn(_, name.slice(1));
// escape
return fn(_, name).
replace(/&/g, "&").
replace(/</g, "<").
replace(/>/g, ">").
replace(/"/g, """);
);
// that is how we use it:
var output = safeReplace("<div>0</div",
["<script>alert('Let\' break stuff!');</script>"]
);
);
来源:http://dojotoolkit.org/reference-guide/1.7/dojo/replace.html#escaping-substitutions
【讨论】:
以上是关于Dojo Toolkit:如何转义 HTML 字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Dojo Toolkit 中为带有按钮的工具栏定义 Widget 类?
基于 Dojo toolkit 实现 web2.0 的 MVC 模式
使用 IBM MobileFirst Platform v7.1(包括 Dojo Toolkit SDK 1.10.3)开发的混合移动应用程序在升级到 iOS 10.3 后崩溃