点击页脚社交链接触发CSP 'unsafe-eval'错误的解决咨询
问题根因
该报错仅出现在SDK26(Android 8.0)设备的核心原因是该版本预装的系统WebView内核版本较低,跨域跳转第三方站点时会错误复用当前本地页面的Content Security Policy(CSP)规则进行校验,第三方社交平台的页面脚本逻辑触发了unsafe-eval校验规则。更高版本的WebView内核优化了跨域跳转后的CSP作用域判定逻辑,因此不会出现该报错,和应用目标SDK30的配置无直接冲突。
安全解决方案(无需添加
unsafe-eval,符合谷歌Play上架要求) 优先按优先级选择方案:
- 方案1:站外链接跳转系统浏览器打开(最安全,首选)
给应用内WebView配置跳转拦截逻辑,所有非自身站点的链接直接跳转到系统浏览器加载,既不需要调整CSP规则,也完全规避了应用内WebView加载第三方站点的XSS风险,适配代码示例如下:webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); // 替换为你自身站点的域名前缀,站内链接继续在WebView加载 if (url.startsWith("https://www.your-site-domain.com/")) { return false; } // 站外链接调用系统浏览器打开 Intent browseIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); view.getContext().startActivity(browseIntent); return true; } }); - 方案2:调整本地页面CSP规则,补充第三方域名白名单
如果业务要求必须在应用内WebView加载第三方社交站,可修改本地HTML页面的CSP响应头/meta标签,补充第三方站点的脚本白名单,无需添加unsafe-eval即可解决报错:<meta http-equiv="Content-Security-Policy" content="script-src 'self' https://twitter.com https://*.twitter.com https://instagram.com https://*.instagram.com https://facebook.com https://*.facebook.com;"> - 方案3:针对SDK26做单独兼容
仅对Android 8.0设备开放WebView的对应脚本权限,高版本保持原有严格配置,尽可能降低安全风险:WebSettings settings = webView.getSettings(); // 仅SDK26单独配置,其余版本保持原有规则 if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O) { settings.setJavaScriptEnabled(true); // 禁用不必要的权限降低风险 settings.setAllowFileAccess(false); settings.setAllowContentAccess(false); }
内容的提问来源于stack exchange,提问作者Bubba
相关产品推荐
相关产品推荐

