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

标签 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

如何使右键单击警报与左键单击警报相同?

最佳答案

如果要确保应用所有字符串转义,一种方法是使用 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/

相关文章:

sql - Postgresql 函数自动将 's' 字符添加到字符串的末尾

javascript - 如何使用javascript判断页面是否在iframe中?

javascript - iOS 自动化 JavaScript 是否支持 substring 功能?

java - 使用字符串的 IF 语句

python - 识别 input_string 中的唯一字母和相应的计数

java - 如何根据某些子串对字符串进行排序?

string - 在 golang 中正确拆分 rune

javascript - TinyMCE 包含元素?

单击后将 Javascript var 转换为 php

javascript - 我怎样才能只提供焦点输入?