唯一的表单令牌禁用用户的多任务处理

2024-03-26

如果我想保护我的网站和用户免受跨站伪造 (CSRF) 攻击,我可以生成一个唯一的令牌$token = md5( time() * rand ); on 每一页有一个形式。令牌在隐藏的输入字段中提交echo '<input type="hidden" name="token" value="'.$token.'">';并同时存储在会话变量中$_SESSION['token'] = $token;.

我会检查任何提交的表格上是否有if($_POST['token'] == $_SESSION['token'])并进行相应的操作。

然而,有些用户可能会同时执行多项任务。这是我在发布此内容时实际上正在做的事情。

在撰写文章时,我会打开不同的窗口/选项卡来可能研究信息或查看有关堆栈溢出的其他一些问题。堆栈溢出让我可以毫无问题地提交表单。

但是,如果我要在我的网站上这样做 - 意思是浏览其他页面,同时仍然撰写帖子/表格 - 我的$token每次我从网站上拉出不同的页面时都会重新生成。制作隐藏的input我正在处理并最终想要提交的表单上的令牌不正确,因为它不会匹配$_SESSION['token']变量不再存在,当我访问不同的页面时已重新生成......

有什么好的想法可以防止这个问题,或者有更好的解决方案来阻止 CSRF?

我希望允许我的用户执行多项任务并希望免受 CSRF 的侵害...


由于单个 CSRF,我也遇到了与您所说的相同的问题,除非他们提交最新页面,否则它会被替换,但如果您使用带有会话的数组,它应该可以解决您的问题。另外,您可能想添加验证码,我推荐 Google 的 Recaptcha。

session_start();
function createToken(){
    $token = sha1(uniqid(mt_rand(), true));
    $_SESSION['Tokens']['Token'][] = $token;
    $_SESSION['Tokens']['Time'][] = time() + (10 * 60); #10 min limit
    #you can omit/change this if you want to not limit or extend time limit
    return $token;
}

function checkToken($token){
    clearTokens();
    foreach($_SESSION['Tokens']['Token'] as $key => $value){
        if($value === $token){
            return true;
        }
    }
    return false;
}

function clearTokens(){
    foreach($_SESSION['Tokens']['Time'] as $key => $value){
        if($value <= time()){
            unset($_SESSION['Tokens']['Token'][$key], $_SESSION['Tokens']['Time'][$key]);
            #remove last parameter if you aren't using token time limit
        }
    }
}

你的HTML:

<input type="hidden" name="token" value="<?php createToken(); ?>">

PHP 令牌检查器

if(isset($_POST['token']) && checkToken($_POST['token'])){
    #valid token
}else{
    #create error message saying that they tried to repost data or session token expired
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

唯一的表单令牌禁用用户的多任务处理 的相关文章

  • gmail 不断阻止 PHPmailer 登录

    我将在接下来的 8 小时内部署一个网站 而 Gmail 刚刚停止接受 PHPmailer 登录我的帐户 起初 它在测试过程中工作了几个小时 然后 它就停止工作了 我已经允许所有允许不太安全的应用程序从 gmail 登录 但它仍然不允许 ph
  • 检查php中位字段是否打开的正确方法是什么

    检查位字段是否打开的正确方法是什么 在 php 中 我想检查来自 db mysql 的位字段是否打开 这是正确的方法吗 if bit 1 还有其他方法吗 我看到有人使用代码ord http jameslow com 2008 08 12 m
  • 单词之间没有空格的语言(例如亚洲语言)中的断词?

    我想让 MySQL 全文搜索适用于日语和中文文本以及任何其他语言 问题在于这些语言以及可能其他语言通常在单词之间没有空格 当您必须键入与文本中相同的句子时 搜索没有用 我不能只在每个字符之间添加空格 因为英语也必须有效 我想用 PHP 或
  • Yii 使用 ajax 进行分页

    我需要使用ajax启用分页 我的代码 控制器 更新内容ajax function actionIndex dataProvider new CActiveDataProvider News array pagination gt array
  • 如何从父类函数访问子类中定义的常量?

    我从 php net 看到这个例子 但 c MY CONST 仅在 5 3
  • 蛋糕控制台 2.2.1:烘焙错误

    运行 MAMP 的 OSX 机器 CakePHP 2 2 1 已正确安装和配置 这意味着当我浏览到 Index php 文件时 所有绿色条都显示出来 我已经完成了博客教程 并且正在开发我的第二个应用程序 其中脚手架已启动并运行 现在我第一次
  • 为什么我需要结束 ob_start()?

    php 文档建议我应该用 ob end flush 结束每个 ob start 我在网站的每个页面上使用一个 只是为了允许我在应用程序中的任何位置使用 firephp 日志方法 该应用程序运行良好 但我想知道是否有任何我不知道的东西可能有害
  • preg_match_all 查询仅显示有问题的外部组

    我无法弄清楚如何只显示 preg 查询的外部组级别 我会给你一个例子 preg match all start end input matches 这个输入start1 start2 2end 1end产生这个输出start1 start2
  • “使用未定义常量”注意,但该常量应该被定义

    共有三个文件 common php controller php 和 user php 文件 common php 如下所示 文件controller php看起来像 文件 user php 如下所示 执行脚本时 会给出通知 注意 使用未定
  • 交换关联数组中的两个项目

    Example arr array apple gt sweet grapefruit gt bitter pear gt tasty banana gt yellow 我想调换一下柚子和梨的位置 这样数组就变成了 arr array ap
  • 使用 SSL 证书验证 Web 浏览器

    是否可以使用 ssl 证书对 Web 浏览器进行身份验证 假设我在应用程序中存储私钥 有什么方法可以从浏览器读取密钥并尝试基于该私钥进行身份验证 您可以使用 SSL TLS 客户端证书身份验证来对浏览器 用户进行身份验证 服务器必须请求客户
  • 随机组合 MySQL 数据库中的两个单词

    我有一个包含名词和形容词的数据库 例如 id type word 1 noun apple 2 noun ball 3 adj clammy 4 noun keyboard 5 adj bloody ect 我想创建一个查询 它将抓取 10
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • Doctrine EntityManager 清除嵌套实体中的方法

    我想用学说批量插入处理 http doctrine orm readthedocs org en latest reference batch processing html为了优化大量实体的插入 问题出在 Clear 方法上 它表示此方法
  • CURL 中的 data-urlencode 是什么意思?

    我搜索了很多个小时试图弄清楚 php curl 中的 data urlencode 是什么 我尝试过这个 但我认为这是不对的 xmlpost object1 file https www lob com goblue pdf 在文档中是 d
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • 如何使用 PHPExcel 库从 Excel 获取日期

    我正在尝试使用 PHPExcel 从 Excel 获取日期 但我没有得到日期 我得到的字符串值不是 1970 以来的秒数 我尝试过的代码是 InvDate trim excel gt getActiveSheet gt getCell B
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐

  • Hadoop 2.2.0 配置弃用

    我设置了 Hadoop 2 2 0 集群 现在运行我的 java 客户端来处理数据 运行我的 java 程序后 我注意到输出显示如下 13 11 18 11 44 44 INFO Configuration deprecation user
  • 理解“排序!”块

    现在我有一个数组 letter a b c a b c a b b 有人可以解释一下以下返回值吗 letter sort x letter count x gt b b a c c a b b a 当你定义一个sort or sort 阻止
  • 如何自定义 Flask admin QuerySelectMultipleField 选择?

    我在用flask admin允许管理员用户访问数据库 其中呈现一对多关系 编辑条目时 我希望下拉菜单仅显示满足条件的选项 我虽然query factory可以做到这一点 以下是我现在拥有的最小示例 class OneSideObj db M
  • 如何在L2E或EF中使用外键?

    我有一个User表有一个PrivilegeId外键指向aPrivilege表 并且是那里的主键 在Entity Framework中 VS不会生成PrivilegeId下的变量User为你 它将生成一个Privilege财产和Privile
  • 何时使用 numpy 与统计模块

    在使用一些统计分析工具时 我发现至少有 3 种 Python 方法可以计算平均值和标准差 不包括 自己动手 技术 np mean np std ddof 0 或 1 statistics mean statistics pstdev 和 或
  • 如何使 Visual Studio 立即窗口提供纯字符串输出?

    如果我在 Immediate 中评估生成长而复杂的字符串的内容 则调试器会对 C 字符串转义中的所有内容进行编码 因此我最终会得到一团乱麻 n t等等 然后我必须手动修复整个文本 这在以下情况下尤其令人烦恼 n 因为大多数文本编辑器无法进行
  • TinyXML:将文档保存为 char * 或字符串

    我尝试使用 TinyXML 从内存中读取和保存 而不是仅读取文件并将其保存到磁盘 看来文档的解析函数可以加载一个char 但是当我完成后 我需要将文档保存到 char 中 有人知道这件事吗 编辑 打印和流媒体功能不是我想要的 它们以可视格式
  • 如何检查传递的迭代器是否是随机访问迭代器?

    我有以下代码 它执行一些迭代器算术 template
  • Damas-Hindley-Milner 类型推理算法实现

    我正在寻找有关知名人士的信息Damas Hindley Milner 算法 https en wikipedia org wiki Hindley E2 80 93Milner type system为函数式语言进行类型推断 尤其是有关实现
  • npm 错误!错误:EPERM:不允许操作,取消链接

    操作系统 Windows 10 npm 版本 6 9 0 节点版本 12 4 0 我正在开发一个博览会应用程序 我想在我的 expo 应用程序上安装所有软件包 npm install 但是 发生了错误 17254 error Operati
  • Firestore 查询成本

    在Firestore上 我有一个社交应用程序 它将每个用户存储为文档 并根据一定距离内的用户进行查询 例如 如果用户启动了该应用程序 并且 50 英里内有 1 000 个用户 那么我是否需要为下载附近所有配置文件的 1000 次读取付费 如
  • 为什么此批处理脚本中的 FOR /f 循环评估空行?

    我正在尝试编写一个批处理脚本 该脚本获取 除其他外 计算机拥有的所有磁盘驱动器的列表 基本代码如下所示 REM Build the list of disk drives to monitor SETLOCAL enabledelayede
  • 如何将自定义对象传递到不同片段中的列表?

    所以我有我的MainActivity其中有一个BottomNavigationView 其中有 3 个不同的选项卡 当我单击它们时 它们会将我重定向到 3 个不同的片段 In FragmentA我有一个RecyclerView对于项目 每个
  • Java 线程 Random.nextLong() 返回相同的数字

    我正在使用一个 OAuth 库 它调用 new Random nextLong 来生成随机数 但它在异步调用上生成相同的随机数 我已将其范围缩小到线程 Random nextLong 以便经常返回相同的确切数字 有谁知道这是否是 Java
  • 将 OpenPGP 签名添加到已签名的文档中? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我们想要实现一个需要多人对文档进行数字签名的工作流程 如果我自己的钥匙串中有多个秘密密钥 我可以做一些简单的事情 gpg sign u userid1
  • 函数不接受 1 个参数 C++

    我的代码有问题 因为我无法弄清楚为什么会收到错误 这是代码 using namespace std void presentValue bool stringChar bool stringVal double futureValConv
  • 如何在 Makefile.am 中指定我想要 C++0x?

    目前我的项目有以下简单的树 Makefile am configure ac README src main cpp src Makefile am bin 我正在尝试遵循以下教程 http www gnu org software aut
  • window.onload = init(); 和有什么区别和 window.onload = init;

    根据我收集的信息 前者将函数返回语句的实际值分配给 onload 属性 而后者分配实际函数 并将在窗口加载后运行 但我还是不确定 感谢任何可以详细说明的人 window onload init 将 onload 事件分配给任何returne
  • 如何在sparkR中创建一个新的DataFrame

    在sparkR中我有data作为数据框 我可以附加一个条目data像这样 newdata lt filter data data column 1 我怎样才能附加多个 假设我想附加向量中的所有元素list lt c 1 6 10 11 14
  • 唯一的表单令牌禁用用户的多任务处理

    如果我想保护我的网站和用户免受跨站伪造 CSRF 攻击 我可以生成一个唯一的令牌 token md5 time rand on 每一页有一个形式 令牌在隐藏的输入字段中提交echo