【发布时间】:2020-02-08 16:33:14
【问题描述】:
我想使用用户提供的字符串作为 JavaScript 函数的参数,因此需要转义所有可能导致脚本中断的字符。
这是用于处理原始 JavaScript 的 WKWebView.evaluateJavaScript() 的 Swift 到 JavaScript 桥接器。
window.someObject.method( ... user provided string ... )
字符串可以包含任何内容、换行符、双引号、反引号、Unicode 转义序列、替换等。
目前我使用模板文字和转义:
- \ 带 \\(单反斜杠和双反斜杠)
- ${ 与 \${
- ` 带反斜杠+反引号
我试图让它与 String.raw 一起工作,但我不知道如何逃避替换。
潜在的用户输入:
hello ${1+1}
我想要那个确切的字符串作为我的 JavaScript 函数的参数,不处理任何替换。
这是我尝试过的:
// User input is: hello ${1+1}
console.log(String.raw`hello ${1+1}`)
console.log(String.raw`hello \${1+1}`) // So close, but not quite
console.log('I want: hello ${1+1}')
我想要的是这个:
window.someObject.method( String.raw`hello ${1+1}` ) → hello ${1+1}
这可能吗?
【问题讨论】:
-
用户的字符串如何进入Javascript?目前是直接在HTML中写成Javascript吗?
-
不,String 实际上是一个 Swift API 生成的 JSON 字符串。然后我即时生成一个 JavaScript sn-p 并通过调用
webView.evaluateJavaScript()将其注入页面,以便解析和评估 JavaScript。 -
好吧,根本不要使用
String.raw。只需对字符串进行 JavaScript 编码(类似于 JSON 对字符串值进行编码)
标签: javascript escaping template-literals