JavaScript 注入¶
ID: swift/unsafe-js-eval
Kind: path-problem
Security severity: 9.3
Severity: warning
Precision: medium
Tags:
- security
- external/cwe/cwe-094
- external/cwe/cwe-095
- external/cwe/cwe-749
Query suites:
- swift-security-extended.qls
- swift-security-and-quality.qls
评估包含来自远程来源的子字符串的 JavaScript 可能导致远程代码执行。攻击者编写的代码可以执行未经授权的操作,包括通过第三方 Web 服务泄露本地数据。
建议¶
将 JavaScript 加载到 Web 视图时,只评估已知的本地定义源代码。如果部分输入来自远程来源,不要将其注入要评估的 JavaScript 代码。相反,使用 API(例如 WKWebView.callAsyncJavaScript
)通过 arguments
字典将它作为数据发送到 Web 视图以传递远程数据对象。
示例¶
在以下(不良)示例中,对 WKWebView.evaluateJavaScript
的调用评估了包含远程数据的 JavaScript 源代码,这可能导致代码注入漏洞。
let webview: WKWebView
let remoteData = try String(contentsOf: URL(string: "http://example.com/evil.json")!)
...
_ = try await webview.evaluateJavaScript("console.log(" + remoteData + ")") // BAD
在以下(良好)示例中,我们通过使用 WKWebView.callAsyncJavaScript
的 arguments
字典传递它来清理远程数据。这确保了不受信任的数据不能作为 JavaScript 源代码进行评估。
let webview: WKWebView
let remoteData = try String(contentsOf: URL(string: "http://example.com/evil.json")!)
...
_ = try await webview.callAsyncJavaScript(
"console.log(data)",
arguments: ["data": remoteData], // GOOD
contentWorld: .page
)
参考¶
Apple 开发者文档:WKWebView.callAsyncJavaScript(_:arguments:in:contentWorld:)
常见弱点枚举:CWE-94.
常见弱点枚举:CWE-95.
常见弱点枚举:CWE-749.