当输入一个 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
。
如何使右键单击警报与左键单击警报相同?
最佳答案
如果要确保应用所有字符串转义,一种方法是使用 eval 执行字符串值的赋值。
eval("str = '" + str + "'")
或者,使用更新的语法(模板字符串)
eval(`str = '${str}'`)
如果不清楚,您正在构建字符串
str = 'abc\/def'
并通过将其传递给 eval
这种通用方法存在明显的风险;因为它似乎不适用于您的示例,所以我之前没有考虑过调用它;但根据您的实际用例,这可能非常重要:
如果字符串数据没有像代码中的字符串文字那样正确转义,这可能会产生意想不到的结果。如果该字符串来自不受信任的来源,那么这些意外结果可能会被利用,您可能会遇到灾难。基本上,如果您采用用户驱动的输入并从中构建 eval 字符串,那么您需要预先验证该字符串,原因与以这种方式构建 SQL 查询时的原因大致相同。
当然,在构建 SQL 查询的情况下,我们有更好的方法将用户输入插入查询中以避免该问题(因此将用户输入连接到查询字符串中通常被认为是不好的做法);但我想不出适合这个目的的类似工具。所以我只能说,如果您使用此技术并且输入可能来自不受信任的来源,请谨慎行事。
在您的示例中,很难注入(inject)真正危险的值,因为如果您尝试注入(inject) '
split
将拒绝它(如果您尝试注入(inject)一个 "
,它将从 href
属性中排除注入(inject)有效负载,这意味着即使您碰巧在 eval 字符串模板中使用了 "
你会没事的);但即便如此,也可能会导致 一些 HTML 代码片段如
<a href='\'>
这会导致您尝试评估字符串
str = '\'
(具有未终止的字符串文字)。
如果您对 HTML 的源代码有合理的控制,那么也许没问题;但是最好有更深思熟虑的代码来清理用作 eval 语句一部分的字符串
关于javascript - 如何解析 javascript 字符串,就像作为文本输入一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45243961/