工具类方法:
public boolean ssrfCheck(URL urlObj){
//定义请求协议白名单列表
String[] allowProtocols = new String[]{"http", "https"};
//定义请求域名白名单列表,根据业务需求进行配置
String[] allowDomains = new String[]{"www.baidu.com"};
//定义请求端口白名单列表
int[] allowPorts = new int[]{80, 443};
boolean ssrfCheck = false, protocolCheck = false, domianCheck = false;
// 首先进行协议校验,若协议校验不通过,SSRF校验不通过
String protocol = urlObj.getProtocol();
for(String item : allowProtocols){
if(protocol.equals(item)){
protocolCheck = true;
break;
}
}
// 协议校验通过后,再进行域名校验,反之不进行域名校验,SSRF校验不通过
if(protocolCheck){
String host = urlObj.getHost();
for(String domain: allowDomains){
if(domain.equals(host)){
domianCheck = true;
break;
}
}
}
//域名校验通过后,再进行端口校验,反之不进行端口校验,SSRF校验不通过
if(domianCheck){
int port = urlObj.getPort();
if(port == -1) {
port = 80;
}
for (Integer item : allowPorts) {
if (item == port) {
ssrfCheck = true;
break;
}
}
}
if(ssrfCheck){
return true;
}else{
return false;
}
}
//使用校验方法
URL u = new URL("https://anquan.baidu.com");
boolean Safe = ssrfCheck(u);
if(Safe){
//继续执行业务
}else{
//拒绝
}