如何配置 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 中的主要内容,如果未能解决你的问题,请参考以下文章
jsp页面提示“Multiple annotations found at this line: - The superclass "javax.servlet.http.HttpServl