有更好的方法吗?(递归解析HTML unicode实体)
Is there a better way to do this? (recursively resolving HTML unicode entities)
我正在解析一个不受信任的URI,但必须遵守它的URI引擎盖。我正在努力防止javascript:
链接,但我觉得我需要重复使用它,因为你可以:
javascriptjavascript::
并且在剥离了CCD_ 3的所有实例之后,再次取回我们的老朋友CCD_。
我关心的另一个问题是类似的嵌套unicode实体。例如,我们可以有:
"jAvascript:alert('pwnt')"
但我们也可以有:
"j&#塁vascript:alert('pwnt')"
尽管我似乎做错了(而一个成功的攻击者显然不会。)
function resolveEntities(uri) {
var s = document.createElement('span')
, nestTally = uri.match(/&/) ? 0 : 1
, limitReached = false;
s.innerHTML = uri;
while (s.textContent.match(/&/)) {
s.innerHTML = s.textContent;
if(nestTally++ >= 5) {
limitReached = true;
break;
}
}
return encodeURI(s.textContent);
}
你以前不是已经问过几乎相同的问题吗?不管怎样,我的建议还是一样的:使用合适的HTML消毒剂。
我链接到的特定消毒剂会自动剥离javascript:
URL,但您也可以将其设置为只允许某些白名单URL方案,如Thomas建议的那样。正如他所指出的,这是一个好主意,因为只允许像http
和https
这样你知道是安全的方案会安全得多。
(特别是,给定的模糊URL方案是否安全,可能不仅取决于用户的浏览器,还取决于他们的操作系统和他们可能安装的第三方软件,许多程序喜欢将自己注册为自己URL方案的处理程序。)
与其指定要将哪些内容列入黑名单(例如javascript:
URI),不如指定要将什么内容列入白名单(例如仅限http
和https
)。像这样的东西怎么样:
function sanitizeUri(uri) {
if (!uri.match(/^https?:'/'//)) {
uri = "http://" + uri;
}
return uri;
}
相关文章:
- 可以't让我的if语句处理js中的html表单输入
- 如何设置html元素填充的动画
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 有更好的方法吗?(递归解析HTML unicode实体)
- 使用Javascript将Json中的unicode转换为HTML
- 如何使用JavaScript在HTML标题中正确插入unicode
- 将文本和html unicode字符添加到textarea元素中
- 在元素后插入html(unicode文本)
- 用 javascript 编写 html unicode 符号
- 如何将 unicode 转换为 html 标记
- CKEDITOR getData()返回html字符实体(unicode),但如何获得未翻译的字符
- 在呈现的HTML中显示特殊字符、HTML实体和unicode
- 如何将unicode从HTML输入转换为javascript中的希腊字符
- 十六进制html可以通过Javascript系统地转换为unicode吗?
- 使用AngularJS在HTML中显示Unicode
- 用HTML标记替换unicode
- Javascript 用 html unicode 替换制表符字符以进行 JSON 解析
- 无法让 unicode 字符正确显示 - Javascript 和 HTML
- Unicode在JS和HTML中转义时显示不一致