CodeQL 文档

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

点击查看 CodeQL 仓库中的查询

评估包含来自远程来源的子字符串的 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.callAsyncJavaScriptarguments 字典传递它来清理远程数据。这确保了不受信任的数据不能作为 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
)

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私