如何配置 Tomcat 在调用 HttpServletResponse.encodeURL() 时不将会话 ID 编码到 URL 中

Posted

技术标签:

【中文标题】如何配置 Tomcat 在调用 HttpServletResponse.encodeURL() 时不将会话 ID 编码到 URL 中【英文标题】:How to configure Tomcat to not encode the session id into the URL when HttpServletResponse.encodeURL() is invoked 【发布时间】:2011-01-17 15:05:00 【问题描述】:

似乎是一个愚蠢的问题,答案是“不要使用 encodeURL()!”但我正在使用在 JSP 中使用 netui 锚标记的代码库,我需要禁用将 JSESSIONID 写入 URL,因为它存在安全风险。

在 WebLogic 中,您可以通过在 weblogic.xml 中配置 url-rewriting-enabled 来进行配置(我知道是因为我在 WebLogic 服务器中编写了该功能!)。但是,我找不到 Tomcat 的等效配置选项。

【问题讨论】:

如果您认为 URL 上的会话 ID 存在安全风险,那么依赖 cookie 中的相同信息如何降低风险? 一个人可以(不小心/不小心)从地址栏中复制粘贴带有jsessionid 的 URL 并将其提供给其他人。另一个 - 不自觉地或有意识地带着不良意图 - 可以请求带有此 URL 的页面,就好像它是原始用户一样。使用 cookie,最终用户无法直接看到 jsessionid。另见en.wikipedia.org/wiki/Session_fixation 这听起来不像是安全问题,这更像是一个安全问题。如果安全性受到攻击,那么 cookie 肯定不会比重写的 URL 更安全。 是的,这更像是一个安全问题。安全和泄漏的责任也完全在客户端,而不是服务器端。 另一个与 URL 中会话 ID 相关的问题是引用 URL。如果您单击指向外部站点的链接,旧 URL 将被发送到 Referer 字段中的新 HTTP 服务器,从而使恶意目标站点能够接管会话。添加机器人生成的评论帖子,您的用户就会处于危险之中。 【参考方案1】:

没有想到任何设置。但这很容易通过创建第一个条目Filter 监听感兴趣的url-pattern(可能是/* ?)并将ServletResponse 替换为HttpServletResponseWrapper 实现,其中encodeURL() 返回相同的论点未修改。

启动示例:

public void doFilter(ServletRequest request, ServletResponse response) throws ServletException, IOException 
    chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) 
        public String encodeURL(String url) 
            return url;
        
    );

【讨论】:

打败我吧......不过请记住,响应中有 4 种不同的 url 重写方法,其中部分或全部可能需要“禁用”。 正确。然而,其中 2 个已被弃用(以 Url 而不是 URL 结尾)。您可能还想覆盖的另一个是encodeRedirectURL()。另见java.sun.com/javaee/5/docs/api/javax/servlet/http/… 谢谢!这正是我为 Tomcat 所做的,我可以确认它有效。【参考方案2】:

Tomcat 6 支持 disableURLRewriting 属性,可以在 Context 元素中设置为 true

http://tomcat.apache.org/tomcat-6.0-doc/config/context.html#Common_Attributes

【讨论】:

另一个要考虑的属性是 httpOnly,它可以防止客户端脚本访问会话 ID。 如果您使用的是 http 而不是 https 并且在 tomcat 连接器上设置了 secure="true",那么将 disableURLRewriting 设置为 true 将不起作用。【参考方案3】:

在https://fralef.me/tomcat-disable-jsessionid-in-url.html 中找到 - 有一个 servlet 规范功能可以做到这一点

<session-config>
   <tracking-mode>COOKIE</tracking-mode>
</session-config>

【讨论】:

以上是关于如何配置 Tomcat 在调用 HttpServletResponse.encodeURL() 时不将会话 ID 编码到 URL 中的主要内容,如果未能解决你的问题,请参考以下文章

Servlet

struts2在tomcat中的配置

Tomcat7配置及其servlet调用详解

tomcat接口调用时延开关

jsp页面提示“Multiple annotations found at this line: - The superclass "javax.servlet.http.HttpServl

每当页面重新加载时如何使用tomcat身份验证