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
在 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");
参考资料¶
Android 文档:WebSettings.setAllowFileAccess。
Android 文档:WebSettings.setAllowFileAccessFromFileURLs。
Android 文档:WebSettings.setAllowUniversalAccessFromFileURLs。
Android 文档:WebViewAssetLoader。
常见弱点枚举:CWE-200。