07-开放式重定向缺陷
2025/1/1大约 3 分钟安全开发安全开发应用安全
开放式重定向缺陷 - 腾讯安全代码审计实战系列07
通过重定向,Web应用程序能够引导用户访问同一应用程序内的不同网页或访问外部站点。应用程序利用重定向来帮助进行站点导航,有时还跟踪用户退出站点的方式。当Web应用程序将客户端重定向到攻击者可以控制的任意URL时,就会发生Open Redirect漏洞。 攻击者可能通过Open Redirect漏洞诱骗用户访问某个可信赖的站点的URL,然后将他们重定向到恶意站点。即使攻击者对目标URL进行编码,最终用户也很难注意到重定向的恶意目标,从而导致用户被欺骗。Open Redirect通常被用作网络钓鱼诈骗的一部分,攻击者可以利用这种方式来获取最终用户的敏感数据。
修复建议
- 禁止未经验证的用户输入数据控制重定向机制中的目标URL。
- 实现白名单机制,仅允许重定向到预先定义的、可信的URL路径。
- 在执行重定向前,对输入的URL进行严格的格式和合法性校验。
- 使用间接方法:创建合法URL的列表,用户只能从中选择指定。
- 如果合法URL列表过于庞大,则限制用于重定向用户的域名。
示例代码
// bad:直接使用不受限制的用户输入进行重定向,存在开放重定向风险
public void redirectToUrl(String dest) {
pageContext.forward(dest); // 直接使用未经验证的URL参数
}
// good:使用白名单校验后进行重定向
public void redirectToUrlWithWhitelist(String dest) {
List<String> allowedUrls = Arrays.asList("/home", "/account", "/dashboard");
if (allowedUrls.contains(dest)) {
pageContext.forward(dest); // 请求安全的URL路径
} else {
throw new IllegalArgumentException("Unauthorized redirection attempt detected");
}
}
// good:对URL进行格式和合法性校验后进行重定向
public void redirectToUrlWithValidation(String dest) {
try {
URL parsedUrl = new URL(dest);
String host = parsedUrl.getHost();
if ("trusted.example.com".equals(host)) { // 仅允许请求特定域名
pageContext.forward(parsedUrl.getPath());
} else {
throw new IllegalArgumentException("Unauthorized redirection attempt detected");
}
} catch (MalformedURLException e) {
throw new IllegalArgumentException("Invalid URL format", e);
}
}