如何在Java中识别协议相对URL以避免开放重定向?
识别协议相对URL的Java解决方案
针对你需要识别协议相对URL(如//hackerone.com@www.example.com)以避免开放重定向风险的需求,以下几个成熟Java库可以替代原生URI的判断逻辑,无需依赖简单正则匹配:
1. Apache Commons Validator
Apache Commons Validator提供了完善的URL校验工具,能够识别协议相对URL。
依赖(Maven)
<dependency> <groupId>commons-validator</groupId> <artifactId>commons-validator</artifactId> <version>1.7</version> <!-- 使用最新稳定版本 --> </dependency>
示例代码
import org.apache.commons.validator.routines.UrlValidator; private static boolean isAbsoluteOrProtocolRelativeURL(String url) { // ALLOW_ALL_SCHEMES 允许协议相对URL,同时支持标准绝对URL UrlValidator validator = new UrlValidator(UrlValidator.ALLOW_ALL_SCHEMES); // 额外判断协议相对URL的情况:以//开头且后续有有效域名部分 boolean isProtocolRelative = url.startsWith("//") && url.length() > 2 && !url.substring(2).startsWith("/"); return validator.isValid(url) || isProtocolRelative; }
2. Spring Framework的UriComponentsBuilder
如果你已经使用Spring生态,UriComponentsBuilder可以解析协议相对URL,通过判断是否包含主机信息来识别这类URL。
示例代码
import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; private static boolean isAbsoluteOrProtocolRelativeURL(String url) throws IllegalArgumentException { try { UriComponents components = UriComponentsBuilder.fromUriString(url).build(); // 绝对URL有scheme,协议相对URL有host但无scheme return components.getScheme() != null || components.getHost() != null; } catch (IllegalArgumentException e) { return false; } }
3. OkHttp的HttpUrl
OkHttp的HttpUrl对URL的解析非常严格,能准确识别协议相对URL,同时自带安全校验,适合处理涉及重定向的场景。
依赖(Maven)
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.12.0</version> <!-- 使用最新稳定版本 --> </dependency>
示例代码
import okhttp3.HttpUrl; private static boolean isAbsoluteOrProtocolRelativeURL(String url) { HttpUrl parsedUrl = HttpUrl.parse(url); if (parsedUrl == null) { return false; } // 绝对URL有scheme,协议相对URL有host但scheme为null(OkHttp会保留相对协议的状态) return parsedUrl.scheme() != null || parsedUrl.host() != null; }
安全注意事项
无论使用哪个库,都需要额外校验URL的主机白名单,避免恶意构造的URL(如含@的混淆地址)导致开放重定向。例如在识别为合法URL后,检查主机是否在允许的列表内。
内容的提问来源于stack exchange,提问作者snakespan
相关产品推荐
相关产品推荐

