1.添加白名单验证的时机
1.loadurl
2.shouldOverRideUrlLoading
3.如果需要对白名单进行安全等级划分,还需要在JavascriptInterface中加入校验函数,JavascriptInterface中需要使用webview.getUrl()来获取webview当前所在域
风险提示:
上面这些都做了还有可能被攻击,比如白名单中的服务器存在XSS漏洞,或者白名单中的服务器被攻击者控制,或者webview访问没有采用安全的传输通道导致被中间人劫持等,都可以在白名单信任域中注入恶意JavaScript
2.代码实现
private boolean checkDomain(String inputUrl) throws URISyntaxException {
if (!inputUrl.startsWith("http://")&&!inputUrl.startsWith("https://")) {
//重要提醒:建议只使用https协议通信,避免中间人攻击
return false;
}
String[] whiteList=new String[]{"site1.com","site2.com"};
java.net.URI url=new java.net.URI(inputUrl);
String inputDomain=url.getHost();
//提取host,如果需要校验Path可以通过url.getPath()获取
for (String whiteDomain:whiteList)
{
if (inputDomain.endsWith("."+whiteDomain)||inputDomain.equals(whiteDomain)) //www.site1.com app.site2.com
return true;
}
return false;
}
可以总结为如下几条开发建议:
不要使用indexOf这种模糊匹配的函数;
不要自己写正则表达式去匹配;
尽量使用Java封装好的获取域名的方法,比如java.net.URI,不要使用java.net.URL;
不仅要给域名设置白名单,还要给协议设置白名单,一般常用HTTP和HTTPS两种协议,不过强烈建议不要使用HTTP协议,因为移动互联网时代,手机被中间人攻击的门槛很低,搭一个恶意WiFi即可劫持手机网络流量;
权限最小化原则,尽量使用更精确的域名或者路径。
当然上述代码可能不完全符合业务开发需求,这里只是给大家一个参考,大家可以参考本文的案例自己开发出更适合的校验方法。
本博是学习自这篇博客
https://blog.youkuaiyun.com/weixin_33816946/article/details/94607053