如何修复 java 中的打开重定向问题

How to fix open redirect issue in java

目前我的 java 代码使用

response.sendRedirect(request.getRequestUrl().toString());

这是一个开放的重定向。

我必须解决这个问题,但我无法将其列入白名单,因为有太多 URL 与之关联。

我已经尝试过以下使用 ESAPI 的解决方案,但它对我不起作用。

ESAPI.httpUtilities().setCurrentHTTP(req, resp);
ESAPI.httpUtilities().sendRedirect(location);
ESAPI.httpUtilities().clearCurrent();

我是 ESAPI 的新手。

[免责声明]

我是 ESAPI 的项目联合负责人。

I have to fix this but I can not white list it since there are too many URL's are associated with it.

本质上,"I have to fix the problem, but I am restricting myself from the easiest solution."

Here are the best practices enumerated by @jww:

  1. 简单地避免使用重定向和转发。

  2. 如果使用,则不允许 url 作为目标的用户输入。这通常可以做到。在这种情况下,您应该有一个方法来验证 URL.

  3. 如果无法避免用户输入,请确保提供的值有效、适用于应用程序并且已获得用户授权。

  4. 建议将任何此类目标输入映射到一个值,而不是实际的 URL 或 URL 的一部分,并且服务器端代码会转换此值目标值 URL.

  5. 通过创建可信 URL 列表(主机列表或正则表达式)来净化输入。

  6. 强制所有重定向首先经过一个页面,通知用户他们将离开您的站点,然后让他们单击 link 进行确认。

这些实际上是您可以使用的所有解决方案。一些 Web 框架可以让您轻松实现这一点,例如具有 Spring 安全性的 Spring MVC。

这些行:

 ESAPI.httpUtilities().setCurrentHTTP(req, resp);
 ESAPI.httpUtilities().sendRedirect(location);
 ESAPI.httpUtilities().clearCurrent();

不起作用,因为您必须在执行重定向之前检查用户输入。

您肯定会希望根据域名将其列入白名单,至少至少是这样。尽可能地限制它。例如,如果您的应用托管在 https://myApp.example.com/ redirecting to anywhere on your site is probably okay. (I write probably, because if it can be used as a way to bypass authorization checks, say on a multi-sequence page series, then it might not be okay. But as long as your regular authorization checks pick up and validate the redirect, you generally will be okay.) But what about redirects to https://anotherApp.example.com/?那些可以吗? "example.com" 域中的任何内容呢?您需要将他们的其他第 3 方域列入白名单吗?如果是这样,请务必也列出这些 URL。但是您要避免的一件事是完全开放的重定向,为此您需要某种类型的白名单。您可以使用 ESAPI 构建一些自定义验证器来执行此操作,但在没有 ESAPI 的情况下编写它可能更容易。如果您有一堆必须列入白名单的 URL,请将它们保存在不属于您的 .war / .ear 文件的配置文件中,这样您就可以轻松更新它而无需重新部署您的应用程序,只需(重新部署) )更新配置文件时读取配置文件。

希望对您有所帮助。

-凯文

感谢您提出的所有建议和意见。 我发现行

ESAPI.httpUtilities().setCurrentHTTP(req, resp);
ESAPI.httpUtilities().sendRedirect(location);
ESAPI.httpUtilities().clearCurrent();

现在对我来说工作正常,经过长时间的努力我发现我的代码使用的是最新版本的 commons-configuration.jar 但是当我添加 Esapi 作为依赖项时 Esapi 使用相同的旧版本这与我的代码不兼容,所以我只是使用 pom 中的排除将 this 从 Esapi 依赖项中排除,它对我有用。