CodeQL 文档

Android WebSettings 文件访问

ID: java/android/websettings-file-access
Kind: problem
Security severity: 6.5
Severity: warning
Precision: medium
Tags:
   - security
   - external/cwe/cwe-200
Query suites:
   - java-security-extended.qls
   - java-security-and-quality.qls

点击查看 CodeQL 存储库中的查询

在 Android WebView 中允许文件访问会将设备的文件系统暴露给在该 WebView 中运行的 JavaScript。如果 JavaScript 包含漏洞或 WebView 加载了不受信任的内容,则文件访问会允许攻击者窃取用户数据。

建议

如果可能,请勿允许文件访问。默认情况下禁用文件访问设置。您可以通过将以下设置设置为 false 来显式禁用文件访问

  • setAllowFileAccess

  • setAllowFileAccessFromFileURLs

  • 如果您的应用程序需要访问文件系统,最好避免使用 file:// 网址。 而是使用通过 HTTPS 加载文件的替代方案,例如 androidx.webkit.WebViewAssetLoader

示例

在以下(错误)示例中,WebView 配置为允许本地文件访问。

WebSettings settings = view.getSettings();

settings.setAllowFileAccess(true);
settings.setAllowFileAccessFromURLs(true);
settings.setAllowUniversalAccessFromURLs(true);

在以下(正确)示例中,WebView 配置为禁止文件访问。

WebSettings settings = view.getSettings();

settings.setAllowFileAccess(false);
settings.setAllowFileAccessFromURLs(false);
settings.setAllowUniversalAccessFromURLs(false);

如前所述,资源加载器可以在不访问文件系统的情况下加载文件。 在以下(正确)示例中,资源加载器配置为通过 HTTPS 加载资源。

WebViewAssetLoader loader = new WebViewAssetLoader.Builder()
    // Replace the domain with a domain you control, or use the default
    // appassets.androidplatform.com
    .setDomain("appassets.example.com")
    .addPathHandler("/resources", new AssetsPathHandler(this))
    .build();

webView.setWebViewClient(new WebViewClientCompat() {
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        return assetLoader.shouldInterceptRequest(request.getUrl());
    }
});

webView.loadUrl("https://appassets.example.com/resources/www/index.html");

参考资料

  • ©GitHub 公司
  • 条款
  • 隐私