如何解析javascript字符串,就像输入文本一样

时间:2017-07-21 17:59:01

标签: javascript string

输入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

如何点击左键单击右键点击提醒?

2 个答案:

答案 0 :(得分:2)

一种方法是,如果要确保应用所有字符串转义,则使用eval来执行字符串值的赋值。

eval("str = '" + str + "'")

或使用较新的语法(模板字符串)

eval(`str = '${str}'`)

如果不清楚,你正在构建字符串

str = 'abc\/def'

并将其作为代码执行,方法是将其传递给eval

这种一般方法存在明显的风险;因为它似乎不适用于你的例子,我之前没有考虑过这个问题;但根据您的实际使用情况,这可能非常重要:

如果字符串数据没有正确转义,就像代码中的字符串文字一样,这可能会产生意外结果。如果字符串来自不受信任的来源,那么这些意外结果可能会被利用,您可能会遇到灾难。基本上,如果您正在使用用户驱动的输入并从中构建eval字符串,那么您需要预先验证字符串,这与以这种方式构建SQL查询时的原因相同。

当然,在构建SQL查询的情况下,我们有更好的方法将用户输入插入到查询中以避免问题(因此将用户输入连接到查询字符串通常被认为是不好的做法);但我想不出一个适合这个目的的类似工具。所以我能说的最好的是,如果您使用这种技术并且输入可能来自不受信任的来源,请谨慎行事。

在你的例子中,很难注入真正危险的值,因为如果你试图注入'split会拒绝它(如果你试图注入{{1}这将从"属性中排除注入有效负载,这意味着即使您恰好在您的eval字符串模板中使用href,也可以。)但即便如此,人们可能会因为

这样的HTML代码段而导致某些问题
"

会导致您尝试评估字符串

<a href='\'>

(它有一个未终止的字符串文字)。

如果您对HTML的来源有合理的控制权,那么也许没关系;但是,如果有更多有意识的代码来清理用作eval语句一部分的字符串

,那将是一种好习惯

答案 1 :(得分:-1)

试试这个正则表达式:

href = href.replace("\/", "");