目前,我被要求阻止我们的 Web 应用程序中的 CSRF 附加。 我是网络应用程序的新手。
谁能帮我解决这个问题
我已获得指导
实现此修复的一个简单方法是使用几个额外的隐藏变量呈现每个页面。
var1 = hmac_sha256(timestamp+session_id, secret)
var2 = timestamp
在后端,您获取时间戳并通过使用时间戳创建服务器端 secret 的 hmac 来验证它。如果有效,并且时间尚未过去,您可以允许请求继续。这允许您设置页面过期并验证其创建,从而减轻跨站点请求伪造攻击。不应两次使用同一个有效 token 。
我已经确定了执行相同操作的步骤。
- 在java脚本中生成 session id。
- 在服务器端(servlet)生成 key 。
- 将 key 从服务器发送到客户端(可能位于登录页面)。
通过时间戳、seesion id 和 key 生成来隐藏 csrf token 。
var $csrfToken = hmac_sha256($timestamp +$seesionId + $mySecretKey)
如果获取到,则在服务器端解密相同的内容
var $stringToHash = request.get('key')
var $isValidToken = hmac_sha256($timestamp +$seesionId + $mySecrtKey) == request.get('csrfToken')
然后在 servlet 中继续处理请求。
任何人都可以帮我编写代码片段吗?
最佳答案
我们使用的过程是存储csrf token (由服务器生成,这是生成它的地方,而不是在客户端中。这是一种跨站请求伪造预防机制,因此服务器需要能够验证这是一个真正的 token ,而不是客户端)在 <meta name="csrf-token" value="...">
元素(这是一个 W3C 验证名称),然后在使用 jQuery 进行 AJAX 调用时将其作为请求 header 传递 beforeSend
:
var csrf_token = $("meta[name='csrf-token']").attr("content");
...
$.ajax({
type: "POST",
url: ...,
data: {
...
},
beforeSend: function(request) {
request.setRequestHeader('X-CSRF-Token', csrf_token);
},
...
});
在这种情况下,服务器需要的 header 为 X-CSRF-Token
因为我们将 NodeJS 与 Express 一起使用,而 Express 使用 Connect,这需要特定的字符串。
关于javascript - 如何在JavaScript中获取 session ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20364334/