相关疑难解决方法(0)

每个请求或不是新的CSRF令牌?

所以我正在四处阅读并且对于拥有CSRF令牌感到困惑,我应该为每个请求生成一个新令牌,还是每小时或者其他什么?

$data['token'] = md5(uniqid(rand(), true));
$_SESSION['token'] = $data['token'];
Run Code Online (Sandbox Code Playgroud)

但是,假设每小时生成一个令牌更好,那么我需要两个会话:令牌,到期,

我将如何处理表格?只需将echo $ _SESSION ['token']放在隐藏的值表单上,然后在提交时进行比较?

php csrf

34
推荐指数
2
解决办法
2万
查看次数

这是设置令牌CSRF的安全方法吗?

我想知道这是否是一种设置令牌的安全方式,除非实际存在令牌,我生成一个令牌,并在整个应用程序和那些表单中使用它.每个会话一个令牌?

if (!isset($_SESSION['token'])) {
    $data['token'] = uniqid(rand(), true);
    session_regenerate_id();
    $_SESSION['token'] = $data['token'];
}
Run Code Online (Sandbox Code Playgroud)

是否有必要在提交的表单上清除令牌?或者只是坚持下去,即使我提交了表格?

php security

11
推荐指数
2
解决办法
999
查看次数

CSRF令牌的生命周期应该是多长时间?

我的CSRF令牌的生命周期应该短吗?或者我可以在会话期间持续使用它吗?

security session csrf

8
推荐指数
1
解决办法
3545
查看次数

保护ajax请求完整性的最佳方法

我正在构建一个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)

javascript php security ajax drupal

6
推荐指数
1
解决办法
5312
查看次数

如何防止欺骗性发布到PHP喜欢/不同的系统

我正在尝试制作一个喜欢/不同的系统,当用户点击帖子时,他/她的用户ID(存储在会话中),并且帖子ID将通过ajax调用存储在数据库中.

然后我想如果一些用户在另一个域上创建一个带有隐形输入字段(其中有一个帖子ID)的html表单,并将其链接提供给检查后的用户,或者正在查看我的站点.

用户将单击该按钮,表单将POST post id发送到我的站点,session包含用户ID,这些将存储在数据库中.

我脑子里没有好的解决方案.有没有比HTTP引用更可靠的方法来防止这种情况?

提前致谢

php security post csrf

4
推荐指数
1
解决办法
284
查看次数

Go Web Applications中的CSRF

我想在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)

我的相关问题是:

  • 我应该在每次呈现表单时生成令牌吗?或者是否可以为单个用户会话重用未过期的令牌? 更新:根据这个答案,我应该只为每个会话生成一个新令牌(即同一个用户在同一个表单上获取相同的令牌,直到令牌过期)

  • 鉴于更新的问题,如何处理创建的令牌在用户请求表单然后提交表单之间到期的情况?(也许还有10分钟左右,他们alt +标签一段时间)重新指导他们回到表格(当然重新填充!)并生成一个新的会话ID + csrf令牌?

  • 有没有不同的方法来做到这一点?Coding …

security csrf go

4
推荐指数
1
解决办法
2016
查看次数

停止欺骗表单提交

我有一个关于停止欺骗表单提交的问题.如果使用$_SERVER['HTTP_REFERER']我只允许提交来自我的网站的表格怎么样?那会有帮助吗?!谢谢!

php forms security

2
推荐指数
1
解决办法
2288
查看次数

标签 统计

security ×6

php ×5

csrf ×4

ajax ×1

drupal ×1

forms ×1

go ×1

javascript ×1

post ×1

session ×1