场景:获取 url query string 中的参数 url 作为 标签 href 属性的值
大致代码:
// 获取参数
s = urlQuery("url");
// url decode 一次
url = decodeURIComponent(s);
// 字符串拼接
back = '';
e.html(back);
这里的 escapeURL 函数会对 &<>'" 符号进行html实体编码
{&: "&", <:>: ">", ": """, ': "'"}
所以无法闭合,但是可以通过 javascript: 伪协议来执行 js 代码
javascript: alert(document.domain)
某开发想的 正则修复方案 ,大致代码如下:
function check(e) {
var t = /(javascript|data)(:|:)/i;
return t.test(e) ? "" : e
}
即忽略大小写匹配 javascript: 字符串
但浏览器有一个特性,在解析时,会忽略换行,比如下列代码,仍会执行
所以 url 参数设置为 j%0d%0aavascript: alert(document.domain) &