Javascript 将CSRF保护头添加到wicket ajax调用

Javascript 将CSRF保护头添加到wicket ajax调用,javascript,ajax,wicket,wicket-1.5,Javascript,Ajax,Wicket,Wicket 1.5,我正在编辑一个使用ApacheWicket制作的网页。我们想给网站增加一些CSRF保护。要使其无状态,我们需要使用双重提交模式 对于表单,我们可能会使用一个包含csrf令牌的隐藏字段 但我们还需要将此添加到使用AjaxFallbackLink发出的一些GET请求中,这也会更改一些数据(我知道它不应该这样做,但我目前无法更改它)。 为此,我们正在考虑将CSRF令牌放入随请求一起发送的自定义头中,但我还没有看到任何方法可以连接到wicket使用的javascript方法(wicketAjaxGet似

我正在编辑一个使用ApacheWicket制作的网页。我们想给网站增加一些CSRF保护。要使其无状态,我们需要使用双重提交模式

对于表单,我们可能会使用一个包含csrf令牌的隐藏字段

但我们还需要将此添加到使用AjaxFallbackLink发出的一些GET请求中,这也会更改一些数据(我知道它不应该这样做,但我目前无法更改它)。 为此,我们正在考虑将CSRF令牌放入随请求一起发送的自定义头中,但我还没有看到任何方法可以连接到wicket使用的javascript方法(wicketAjaxGet似乎只接受一个前提条件函数和一个通道函数)。有没有关于我如何做到这一点的建议

或者将令牌添加到url是一个好的选择吗?如果我们使用https传输,与在报头中设置相比,在这种情况下会有什么问题


或者关于如何向这些Ajax GET请求添加CSRF保护的其他想法?

如果使用Ajax组件,那么页面将是有状态的

如果您可以使用http会话,那么最简单的方法就是使用CryptoMapper(注意:Wicket 6.x中有很多改进!)

如果您希望页面是无状态的,那么您必须使用您自己的自定义令牌-作为请求头或参数。检查wicketstuff无状态以查看无状态Ajax组件和行为。

您可以使用6.x(和7.x)
CsrfPreventionRequestCycleListener
,即

您可以在应用程序的init方法中安装它:


@凌驾
受保护的void init()
{
// ...
getRequestCycleListeners().add(新的CsrfPreventionRequestCycleListener());
// ...
}

这将检查所有请求(包括AJAX)中的源标题。您需要将侦听器配置为您希望它的行为方式、您希望允许的来源等。

加密映射器如何帮助抵御CSRF攻击?据我所见,wicket只向url添加了一个会话id(一个整数,每个请求的页面都会增加1),我猜它只会加密这个url。难道攻击者不能“猜测”这个会话id并自己加密它以使攻击生效吗?CryptoMapper可以加密整个url,而不仅仅是查询字符串中的请求参数。加密的密钥是每个用户(即每个http会话)的,因此攻击者无法猜到。由于CVE-2014-7808,请确保您使用Wicket 1.5.13。尽管您从6.20中提取Wicket 1.5.13,并在以前的6.xB版本中使用它,但您不应该这样做,而是在6.24或6.25可用时升级到6.24或6.25。在以后的版本中有许多安全问题得到了解决。@Martjin你是对的……但有时升级起来并不容易。您是否也有连接到SpringSecurity4的exp?