输入javascript字符串时,会对转义序列应用一些解析
例如,var foo = "ab\\cd";
将foo
的值ab\cd
。
我需要将一些javascript代码作为字符串,并从中提取变量值,但是当我这样做时,不会应用转义序列。如何重新应用文本解析,就像最初输入字符串值一样。
以下是fiddle的示例。这很简单,所以我在这里包含代码。
HTML:
<a href="javascript:alert('abc\/def');" oncontextmenu="log(this)">Click or right click</a>
使用Javascript:
function log(el){
var href = el.getAttribute('href');
var str = href.split("'")[1];
alert(str);
}
点击该链接会提醒abc/def
,但右键点击会输出abc\/def
。
如何点击左键单击右键点击提醒?
答案 0 :(得分:2)
一种方法是,如果要确保应用所有字符串转义,则使用eval来执行字符串值的赋值。
eval("str = '" + str + "'")
或使用较新的语法(模板字符串)
eval(`str = '${str}'`)
如果不清楚,你正在构建字符串
str = 'abc\/def'
并将其作为代码执行,方法是将其传递给eval
这种一般方法存在明显的风险;因为它似乎不适用于你的例子,我之前没有考虑过这个问题;但根据您的实际使用情况,这可能非常重要:
如果字符串数据没有正确转义,就像代码中的字符串文字一样,这可能会产生意外结果。如果字符串来自不受信任的来源,那么这些意外结果可能会被利用,您可能会遇到灾难。基本上,如果您正在使用用户驱动的输入并从中构建eval字符串,那么您需要预先验证字符串,这与以这种方式构建SQL查询时的原因相同。
当然,在构建SQL查询的情况下,我们有更好的方法将用户输入插入到查询中以避免问题(因此将用户输入连接到查询字符串通常被认为是不好的做法);但我想不出一个适合这个目的的类似工具。所以我能说的最好的是,如果您使用这种技术并且输入可能来自不受信任的来源,请谨慎行事。
在你的例子中,很难注入真正危险的值,因为如果你试图注入'
,split
会拒绝它(如果你试图注入{{1}这将从"
属性中排除注入有效负载,这意味着即使您恰好在您的eval字符串模板中使用href
,也可以。)但即便如此,人们可能会因为
"
会导致您尝试评估字符串
<a href='\'>
(它有一个未终止的字符串文字)。
如果您对HTML的来源有合理的控制权,那么也许没关系;但是,如果有更多有意识的代码来清理用作eval语句一部分的字符串
,那将是一种好习惯答案 1 :(得分:-1)
试试这个正则表达式:
href = href.replace("\/", "");