目前我的java代码使用
response.sendRedirect(request.getRequestUrl().toString());
这是一个开放的重定向。
我必须解决此问题,但我不能列出白名单,因为有太多的网址与之关联。
我已经尝试过使用ESAPI的以下解决方案,但它对我不起作用。
ESAPI.httpUtilities().setCurrentHTTP(req, resp);
ESAPI.httpUtilities().sendRedirect(location);
ESAPI.httpUtilities().clearCurrent();
我是ESAPI的新手。
答案 0 :(得分:1)
[免责声明]
我是ESAPI的共同领导项目。
我必须解决这个问题但我不能列出白色,因为它也有 很多网址都与之相关联。
基本上,“我必须解决问题,但我限制自己从最简单的解决方案。”
Here are the best practices enumerated by @jww:
只需避免使用重定向和转发。
如果使用,请不要将url作为目标的用户输入。通常可以这样做。在这种情况下,您应该有一个验证URL的方法。
如果无法避免用户输入,请确保提供的值适用于应用程序,并且已获得用户授权。
建议将任何此类目标输入映射到值,而不是URL的实际URL或部分,并且服务器端代码将此值转换为目标URL。
通过创建可信URL列表(主机列表或正则表达式)来清理输入。
强制所有重定向首先浏览一个页面,通知用户他们要离开您的网站,并让他们点击链接进行确认。
这些都是您可以使用的所有解决方案。有些Web框架可以让您轻松实现,例如Spring MVC和Spring Security。
这些行:
ESAPI.httpUtilities().setCurrentHTTP(req, resp);
ESAPI.httpUtilities().sendRedirect(location);
ESAPI.httpUtilities().clearCurrent();
请勿工作,因为您必须在执行重定向之前检查用户输入。
答案 1 :(得分:1)
您肯定希望至少根据域名将此列入白名单。尽可能限制它。例如,如果您的应用程序托管在https://myApp.example.com/,重定向到您网站上的任何位置可能就可以了。 (我写的可能,因为如果它可以用作绕过授权检查的方式,比如说在多序列页面系列上,那么它可能不合适。但只要你的常规授权检查选择并验证重定向,你通常会没事的。)但是重定向到https://anotherApp.example.com/呢?那些可以吗?那个“example.com”域名中的内容怎么样?他们的其他第三方域名是否需要列入白名单?如果是这样,请务必列出这些网址。但是你要避免的一件事是完全开放的重定向,为此你需要某种类型的白名单。您可以使用ESAPI构建一些自定义验证器来执行此操作,但是在没有ESAPI的情况下编写它可能更容易。如果您有一堆必须列入白名单的URL,请将它们保存在不属于.war / .ear文件的配置文件中,这样您就可以轻松更新它而无需重新部署应用程序,只需(重新)读取配置文件更新时。
希望这有帮助。
-kevin
答案 2 :(得分:0)
感谢您的所有建议和意见。 我找到了行
ESAPI.httpUtilities().setCurrentHTTP(req, resp);
ESAPI.httpUtilities().sendRedirect(location);
ESAPI.httpUtilities().clearCurrent();
现在对我来说工作正常,经过长时间的努力,我发现我的代码使用了最新版本的commons-configuration.jar但是当我添加Esapi作为依赖时,Esapi使用了旧版本的相同而且不是与我的代码兼容所以我只是使用pom中的排除对Esapi依赖项排除了这个,它对我有用。