当前位置:  开发笔记 > 编程语言 > 正文

PHP表单令牌使用和处理

如何解决《PHP表单令牌使用和处理》经验,为你挑选了2个好方法。

我是一名初学者,正在研究PHP中的登录脚本.这是我到目前为止的表单令牌语句:

$_SESSION["form_token"] = md5(rand(time (), true)) ;

该声明是在用户表明他/她想要登录之后发出的.

我有限的理解是,令牌的目的是在唯一的时间点识别唯一用户并伪装表单令牌信息.

然后一切都变得模糊.以下是我的3个未解决的问题:

    何时是出于安全目的"检查"表单令牌的最佳时间?

    我该如何检查?

    什么时候,如果有的话,我"破坏"表单令牌?(IOW,在用户退出之前,表单令牌会保持"活动"状态吗?

jspcal.. 19

这是为了防止CSRF攻击

http://en.wikipedia.org/wiki/Cross-site_request_forgery

从理论上讲,恶意网站可以显示一个发布到您的应用程序的表单.表单可能包含导致数据泄露或某些不需要的操作的说明.用户可能会被欺骗提交应用程序可以接受的表单,因为用户已经登录.表单令牌确保表单是由您的站点而不是其他站点创建的.

检查HTTP_REFERER通常是足够好的,但不是完整的解决方案(例如https不会发送引用字符串).

如果你真的想要使用令牌保护所有表单,你可以创建一些便利函数,如emitToken()和checkToken(),它将使它在站点范围内工作.

一些例子:

http://phpsec.org/projects/guide/2.html

http://www.rodsdot.com/php/CSRF_Form_Protection.php



1> jspcal..:

这是为了防止CSRF攻击

http://en.wikipedia.org/wiki/Cross-site_request_forgery

从理论上讲,恶意网站可以显示一个发布到您的应用程序的表单.表单可能包含导致数据泄露或某些不需要的操作的说明.用户可能会被欺骗提交应用程序可以接受的表单,因为用户已经登录.表单令牌确保表单是由您的站点而不是其他站点创建的.

检查HTTP_REFERER通常是足够好的,但不是完整的解决方案(例如https不会发送引用字符串).

如果你真的想要使用令牌保护所有表单,你可以创建一些便利函数,如emitToken()和checkToken(),它将使它在站点范围内工作.

一些例子:

http://phpsec.org/projects/guide/2.html

http://www.rodsdot.com/php/CSRF_Form_Protection.php


HTTP_REFERER是不可信任的,从不依赖它,因为它可以很容易地编辑!

2> hobodave..:

没有必要做你正在尝试的事情.当您使用session_start()在PHP中启动会话时,已经为您生成了一个唯一的SESSIONID.你应该把它放在表格上.它默认通过cookie处理.也没有必要检查SESSIONID,再次为您处理.

您负责对用户进行身份验证并存储其身份验证身份(例如,在会话中使用$ _SESSION ['user_id'] = $ userId.如果用户注销,则使用session_destroy销毁其会话.

您应该确保session_start()是您网站中所有网页的首要内容之一.

这是一个基本的例子:

login($username, $password)) {
        $_SESSION['user_id'] = $user->getId();
        return true;
    }
    return false;
}

function logout()
{
    session_destroy();
}

function isLoggedIn()
{
    return isset($_SESSION['user_id']);
}

function generateFormHash($salt)
{
    $hash = md5(mt_rand(1,1000000) . $salt);
    $_SESSION['csrf_hash'] = $hash
    return $hash;
}

function isValidFormHash($hash)
{
    return $_SESSION['csrf_hash'] === $hash;
}

编辑:我误解了原来的问题.我添加了上面的相关方法来生成和验证表单哈希;

请参阅以下资源:

PHP会话处理

在session_start()

session_destroy()

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有