所以我正在四处阅读并且对于拥有CSRF令牌感到困惑,我应该为每个请求生成一个新令牌,还是每小时或者其他什么?
$data['token'] = md5(uniqid(rand(), true));
$_SESSION['token'] = $data['token'];
Run Code Online (Sandbox Code Playgroud)
但是,假设每小时生成一个令牌更好,那么我需要两个会话:令牌,到期,
我将如何处理表格?只需将echo $ _SESSION ['token']放在隐藏的值表单上,然后在提交时进行比较?
我想知道这是否是一种设置令牌的安全方式,除非实际存在令牌,我生成一个令牌,并在整个应用程序和那些表单中使用它.每个会话一个令牌?
if (!isset($_SESSION['token'])) {
$data['token'] = uniqid(rand(), true);
session_regenerate_id();
$_SESSION['token'] = $data['token'];
}
Run Code Online (Sandbox Code Playgroud)
是否有必要在提交的表单上清除令牌?或者只是坚持下去,即使我提交了表格?
我正在构建一个Drupal网站,其中包含许多用户特定的信息,这些信息将使用jQuery/ajax发布.它本身的信息不是很敏感,重要的是验证表单数据没有被Firebug等工具篡改,以及确保指定用户真正请求信息.换句话说,我试图找出使用ajax发布时保护数据完整性和真实性的最佳方法.
理想情况下,我想使用一些众所周知的消息认证系统,如HMAC算法.但由于这包含了一个对称密钥,我不知道如何在不暴露我的javascript文件中的密钥的情况下加密POST数据(显然任何人都可以看到).
如果我对如何运作有错误的想法,请纠正我.
例如,我需要发送的信息
field1=x&field2=y&uid=10
Run Code Online (Sandbox Code Playgroud)
...然后计算数据的哈希值和密钥.这可能不在我的javascript代码中暴露哈希函数吗?
CHECKSUM: hash(postdata, "secret_key")
Run Code Online (Sandbox Code Playgroud)
...最后将校验和附加到原始postdata.
field1=x&field2=y&uid=1&c=CHECKSUM
Run Code Online (Sandbox Code Playgroud)
我可以选择使用登录用户的会话ID.然而,这不会检查消息的完整性......
使用PHP生成表单时,我可以使用以下内容生成隐藏的输入
CHECKSUM: hash(session id for the current user, "secretkey")
Run Code Online (Sandbox Code Playgroud)
然后我将使用ajax发布的是
field1=x&field2=y&uid=10&c=CHECKSUM
Run Code Online (Sandbox Code Playgroud)
有了它,验证适当的用户(再次伪代码)是相当安全的
ssid = SELECT ssid FROM sessions WHERE uid = $_POST[uid]
if(ssid && hash(ssid, "secretkey") == $_POST[c]) {
//User OK
} else {
//Invalid user
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个喜欢/不同的系统,当用户点击帖子时,他/她的用户ID(存储在会话中),并且帖子ID将通过ajax调用存储在数据库中.
然后我想如果一些用户在另一个域上创建一个带有隐形输入字段(其中有一个帖子ID)的html表单,并将其链接提供给检查后的用户,或者正在查看我的站点.
用户将单击该按钮,表单将POST post id发送到我的站点,session包含用户ID,这些将存储在数据库中.
我脑子里没有好的解决方案.有没有比HTTP引用更可靠的方法来防止这种情况?
提前致谢
我想在Go Web应用程序中实现CSRF预防.用户不登录,但他们填写表格并付款(通过Stripe Checkout).
发布内容会在会话变量(cookie)中设置一个键,以便以后可以编辑它们发布的内容,并且电子邮件中的URL允许它们在cookie过期时返回并在需要时再次编辑它.
从我所看到的情况来看,我可以使用https://code.google.com/p/xsrftoken/和"双提交cookie"方法来实施CSRF预防:
针对任意用户ID(uuid.V4()通过go-uuid)生成CSRF令牌,如下所示:
if session.Values["id"] == "" {
session.Values["id"] = uuid.NewV4()
}
csrfToken := xsrftoken.Generate(csrfKey, session.Values["id"], "/listing/new/post")
Run Code Online (Sandbox Code Playgroud)...并将其存储在会话中并将其呈现在模板中的隐藏字段中:
session.Values["csrfToken"] = csrfToken
...
<input type="hidden" id="_csrf" value={{ .csrfToken }}>
Run Code Online (Sandbox Code Playgroud)当用户提交表单时,我需要获取我生成的ID,确认csrfToken表单中提交的ID 与会话中的ID 匹配,如果是,请使用xsrf包验证它以确认它未过期:
userID := session.Values["id"]
if session.Values["csrfToken"] != r.PostFormValue("csrfToken") {
http.Redirect(w, r, "/listing/new", 400)
}
if !xsrftoken.Valid(session.Values["csrfToken"], csrfKey, userID, "/listing/new/post") {
http.Redirect(w, r, "/listing/new", 400)
}
Run Code Online (Sandbox Code Playgroud)我的相关问题是:
我有一个关于停止欺骗表单提交的问题.如果使用$_SERVER['HTTP_REFERER']我只允许提交来自我的网站的表格怎么样?那会有帮助吗?!谢谢!