我正在编辑使用Apache Wicket制作的网页。我们希望为网站添加一些CSRF保护。想要它是无国籍的我们想要使用双提交模式。
对于表单,我们可能最终会使用一个包含csrf标记的隐藏字段。
但我们还需要将此添加到使用AjaxFallbackLink进行的某些GET请求中,这也会更改一些数据(我知道它不应该这样做,但我目前无法更改它)。 为此,我们正在考虑将CSRF令牌放在随请求发送的自定义标头中,但我还没有看到任何方法可以挂钩wicket使用的javascript方法(wicketAjaxGet似乎只采用了一个前提条件函数和一个通道功能)。对于我如何做到这一点有什么建议吗?
或者将令牌添加到网址是一个不错的选择?如果我们使用https传输,与在标题中设置相比,在这种情况下会出现什么问题。
或者关于如何为这些Ajax GET请求添加CSRF保护的任何其他想法?
答案 0 :(得分:3)
您可以使用packaged with Wicket
的6.x(和7.x)CsrfPreventionRequestCycleListener
您可以在应用程序的init-method中安装它:
@Override
protected void init()
{
// ...
getRequestCycleListeners().add(new CsrfPreventionRequestCycleListener());
// ...
}
然后,这将检查所有请求中的Origin头,包括AJAX。您需要为侦听器配置您希望它的行为方式,您想要允许的起源等等。
答案 1 :(得分:2)
如果您使用Ajax组件,那么Page将是有状态的。
如果您可以使用http会话,那么最简单的方法是使用CryptoMapper(注意:它在Wicket 6.x中有很多改进!)。
如果您希望页面是无状态的,那么您必须使用自己的自定义令牌 - 作为请求标头或参数。检查wicketstuff-stateless是否有无状态的Ajax组件和行为。