在遗留应用程序中使用 url 重写来改造 csrf
Posted
技术标签:
【中文标题】在遗留应用程序中使用 url 重写来改造 csrf【英文标题】:retrofitting csrf with url rewriting in a legacy application 【发布时间】:2015-01-10 14:48:48 【问题描述】:我正在使用一个遗留 Java 应用程序(13 岁以上),它没有防止 CSRF 攻击的机制。
在前端它使用多种技术,dwr、jquery 和请求来自各种来源、AJAX、表单提交帖子、获取请求。使用 Get 请求完成的一些非安全操作应受 CSRF 保护。
在后端,一切都通过 Struts Actions。
没有适当的自动化功能测试,应用程序很大,没有人知道它是如何工作的,因此无法轻易引入更改。
很难更改应用程序以将秘密令牌添加到每个获取链接和每个表单提交。对于 DWR 和 jquery 来说事情更简单,因为所有请求都有一个入口点。
该应用程序不需要使用浏览器书签,它在内部提供了一个收藏夹菜单,其中保留了特定于它的书签。 此外,作为表单操作或链接的 url 始终通过 struts 或标准 taglib 呈现。因此,如果我将 JSESSIONID 更改为通过 url 重写而不是 cookie,则应用程序可能会进行细微的更改...
这给了我以下想法,将 CSRF 保护引入应用程序,而无需大量开发工作:
*使用 URL 重写而不是 cookie 来传递 JSESSIONID。 *为了克服在标头中显示 JSESSIONID 的问题,为 http 会话引入了第二个秘密 cookie。因此,当首次建立会话时,将包含随机值的 HttpOnly cookie 发送回客户端,并将其也放入 HTTP 会话中。 *在所有struts Actions的父级中,检查这个秘密cookie的值与HTTP会话上的值,如果不相等则抛出异常。
与重写应用程序以在每个请求中引入令牌的巨大努力相比,这似乎是一种简单的方法。也许太容易了……我的想法有谬误吗????
【问题讨论】:
【参考方案1】:在上一篇文章中,我考虑使用 jsessionid 作为 csrf 令牌并重写 Url 并使用第二个自定义 HttpOnly cookie 进行身份验证。 但最后我决定:
不使用 jsessionid 作为 csrf 令牌,而是将其保留用于身份验证,因为它是默认设计的。
使用 Origin 标头保护表单提交和 ajax 调用。这不包括执行非安全操作的 get 请求。此外,它仅适用于较新的浏览器。
使用 csrf 令牌保护 get 请求。应用程序中的 URL 由标签 c:url、html:rewrite 组成,因此只需使用包含 csrf 令牌的自定义标签覆盖这些标签。
【讨论】:
以上是关于在遗留应用程序中使用 url 重写来改造 csrf的主要内容,如果未能解决你的问题,请参考以下文章