当前位置: 首页 > 面试题库 >

PHP表单令牌的使用和处理

包谭三
2023-03-14
问题内容

我是使用PHP登录脚本的初学者。到目前为止,这是表单令牌语句:

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

在用户指示他/她想要登录后立即发出该声明。

我有限的理解是令牌的目的是在唯一的时间点识别唯一的用户并掩盖表单令牌信息。

然后,一切变得模糊。这是我的3个未解决问题:

  1. 为了安全起见,什么时候才是“检查”表单令牌的最佳时间?

  2. 我该如何检查?

  3. 什么时候(如果有的话)我“销毁”表单令牌?(IOW,表单令牌会在用户注销之前保持“活动”状态吗?


问题答案:

无需做您正在尝试的事情。当您使用session_start()在PHP中启动会话时,已经为您生成了一个唯一的SESSIONID。你应该
被把这个形式。默认情况下,它通过cookie处理。也无需检查SESSIONID,也可以再次为您处理。

您负责验证用户身份并存储其验证身份(例如,SESSION中的$ _SESSION [‘user_id’] = $
userId)。如果用户注销,则使用session_destroy销毁其会话。

您应该确保session_start()是站点中所有页面的 首要 任务之一。

这是一个基本示例:

<?php
session_start(); // starts new or resumes existing session
session_regenerate_id(true); // regenerates SESSIONID to prevent hijacking

function login($username, $password)
{
    $user = new User();
    if ($user->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;
}

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



 类似资料:
  • 表单令牌可以放置重复提交,同时对机器人有一定的拦截作用,在 phpGrace 的支持下(利用 cookie),实现这样的功能是非常简单的,函数说明: 1、setToken() 设置token 在表单中使用隐藏域设置令牌,如: <form action="" method="post"> <input type="text" name="name" /> <input type="h

  • 验证规则支持对表单的令牌验证,首先需要在你的表单里面增加下面隐藏域: <input type="hidden" name="__token__" value="{$Request.token}" /> 或者 {:token()} 然后在你的验证规则中,添加token验证规则即可,例如,如果使用的是验证器的话,可以改为: protected $rule = [ 'name'

  • 我收到两个jwt:一个OpenID连接ID令牌(ID\u令牌)和一个访问令牌(Access\u令牌)。OpenID的情况或多或少是清楚的-我可以使用JWKSendpoint验证它:https://smth.com/JWKS. 如例(https://bitbucket.org/b_c/jose4j/wiki/JWT例): 问题是如何继续使用访问令牌。我可以从中提取userId和userDetails

  • 问题内容: 在PHP 3.0 SDK中,没有或没有来自Facebook api的会话处理可用。根据 此博客条目 和 此错误报告 ,几天前,facebook的开发人员还以某种方式更新了JavaScript sdk 。 在过去的几天中,托管的JS SDK进行了更改,从而破坏了它与当前PHP SDK(2.x和3.x)之间的所有兼容性。在其网站上同时使用JS和PHP SDK的开发人员可能会看到服务器端AP

  • 问题内容: 我在网站上启用了CSRF保护,但是CSRF令牌唯一一次放置在隐藏字段中的时间是何时使用。我正在通过ajax发布数据,并且也需要发送CSRF以防止出现500个错误。 我以为有一种方法可以将CSRF令牌显式地嵌入到页面中,但是我似乎找不到它。 如果页面上没有表单,如何获得CSRF令牌? 问题答案: 您可以通过安全性类获取CSRF令牌名称和值:

  • 我正在使用Symfony2。0和FOSUserBundle,并希望在我的登录表单上禁用csrf令牌。 我已经禁用了csrf保护全球在我的网站在我的config.yml: 这工作得很好,没有csrf字段添加到我的表单中。但是,这不适用于登录表单。仅在此表单上,如果我没有将令牌包含在表单中,则会出现“无效的CSRF令牌”错误: 如何在登录表单上禁用CSRF令牌?