在索引页面上设置 PHP 会话以进行 XSRF 检查

2024-01-05

我遇到了以下有关 XSRF 令牌的问题。

客户端:AngularJS 服务器:PHP

当index.php被点击时,PHP生成一个XSRF令牌并将其保存在会话中。 cookie 设置为相同的值。

AngularJS 读取 cookie 并存储值。

在后续的 POSTS 中,XSRF 令牌作为标头发送,其想法是将存储的会话令牌与发送的标头进行比较。

一切看起来都很好,没有任何问题。

但是:问题是,PHP 无法读取在index.php 中注册的会话,因为从技术上讲,没有页面重新加载!如果我按 F5 并重新加载所有内容,会话就会很好地读取。

如何在index.php 上设置XSRF 会话令牌并使其可用于客户端的后续ajax 请求?我正在为此抓狂……感谢反馈。

UPDATE

更改会话标识符名称后,一切突然正常了!

在index.php中:

// Create token and set session
session_start();
$token = hash('sha256', uniqid(mt_rand(), true));
$_SESSION['XSRF']=$token; 

后来,也在index.php中:

/* Give token to Angular client */
<script>
angular.module("app").constant("CSRF_TOKEN", '<?=$_SESSION['XSRF'];?>'); 
</script>

请注意,我没有使用 cookie,而是设置了一个常量,然后该常量可供 Angular 中的 .run 方法使用:

在角度上:

angular.module('app').run(['CSRF_TOKEN','$http',function(CSRF_TOKEN,$http) {

   $http.defaults.headers.common['CSRF_TOKEN'] = CSRF_TOKEN;

对服务器的所有请求都会路由到一个公共 php 文件。该文件检查是否设置了标头,并比较两个标记:

// Only POST requests are checked (I don't use PUT/DELETE)
if($_SERVER['REQUEST_METHOD']=="POST"){
   session_start();
   $headerToken = $_SERVER['HTTP_CSRF_TOKEN'];
   $sessionToken = $_SESSION['XSRF'];
   if($headerToken!=$sessionToken){
      header('HTTP/1.0 401 Unauthorized');
      exit;
   }
}

这就是我在 PHP/AngularJS 项目中所做的事情:

索引.php

session_start();
if (!isset($_SESSION['XSRF-TOKEN'])) {
    $uniqueValues = md5($_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']); //add more/less/any "unique" values, see comments
    $_SESSION['XSRF-TOKEN'] = sha1(uniqid(microtime() . $uniqueValues, true));
    setcookie('XSRF-TOKEN', $_SESSION['XSRF-TOKEN']);
}

AngularJS $http 调用的任何脚本:

(AngularJS 使用 cookie XSRF-TOKEN 的值,并将其作为 X-XSRF-TOKEN 自定义标头在每个请求中发送,因此我们需要将此值与会话中存储的值进行比较。)

function verifyXSRF() {

    /*
    $headers = apache_request_headers();
    $headerToken = "";
    foreach ($headers as $header => $value) {
        if ($header == "X-XSRF-TOKEN") {
            $headerToken = $value;
            break;          
        }
    }
    */

    //more efficient, see comments
    $headerToken = $_SERVER['HTTP_X_XSRF_TOKEN'];

    if ($headerToken != $_SESSION['XSRF-TOKEN']) return false;
    return true;
}

session_start();
if (!verifyXSRF()) die("XSRF error");

欢迎反馈,因为我不确定这是否足够 XSRF 保护。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在索引页面上设置 PHP 会话以进行 XSRF 检查 的相关文章

  • mysql_result 与 mysql_array_assoc

    使用 mysql result 和 mysql array assoc 循环遍历大型 SQL 选择结果之间是否存在性能差异 来自mysql result 手册页 http php net mysql result 当处理大型结果集时 您 应
  • PDO 限制和偏移量[重复]

    这个问题在这里已经有答案了 可能的重复 LIMIT 中的 PHP PDO 绑定值 https stackoverflow com questions 2269840 php pdo bindvalue in limit 我在prepare语
  • switch 语句中的 continue 2 和break

    我是 PHP 新手 在网上看到了下面的代码 它有continue 2 and break一起在switch case陈述 这是什么意思 foreach elements as element switch element type case
  • ZF2 路线参数带斜杠

    是否可以使用包含正斜杠的参数来组装路由 Config someroute gt array type gt Zend Mvc Router Http Segment options gt array route gt someroute p
  • PHP - 按后退按钮时 Session_Destroy

    这是我的问题 我有一个名为login php 的登录页面 不包含HTML 代码 当用户正确输入其凭据时 他会被重定向到特定页面 在本例中我们将使用 test php 该页面上的唯一链接会注销当前会话 并将用户返回到index html 我的
  • 如何从继承的方法中获取派生类的路径?

    如何从继承的方法中获取当前类的路径 我有以下内容 and
  • PHP - 解析具有固定列宽的文本文件

    我是 PHP 和 Laravel 的新手 我需要打开文件并解析内容以将它们传递到数据库 文本文件具有固定的列宽 它没有分隔符或标题 我认为使用子字符串并将每个子字符串分配给变量将是正确的方法 但我仍在学习该语言的过程中 我不知道如何实现这一
  • 将选定的日期值从 datepicker 传递到 php

    我在这里发现了类似的问题 但大多数解决方案对我不起作用 我有一个带有日期选择器的表单 我想将所选日期传递到我的 php 文件 但它似乎不起作用 我的 html 是这样的
  • 对于MySQL查询中的每个结果,推送到数组(复杂)

    好吧 这就是我想做的 我正在运行 MySQL 查询来获取最新的帖子 对于每个返回的行 我需要将行的 ID 推送到数组 然后在数组的该 ID 内 我需要从行中添加更多数据 多维数组 到目前为止 这是我的代码 query SELECT FROM
  • 插入前检查数据库中是否存在行

    DBH new PDO dsn username password opt DBH gt setAttribute PDO ATTR ERRMODE PDO ERRMODE EXCEPTION DBH gt setAttribute PDO
  • 传递多个数组以在 codeigniter 中查看

    我的模型是这个 两个函数view和spl function view result this gt db gt get tb ourcity return result gt result array query this gt db gt
  • 限制检索的行数 MySql、Laravel

    问题 我的问题是使用 Mysql 或 Laravel 通过查询返回的行数是否有限制 首先 我使用 Laravel 5 2 我试图从日志表中检索数据 该表最近已超过 10k 行 现在从那时起 或大约那个时候 用于检索数据的常用 Laravel
  • Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException 没有消息 Laravel 5.5

    这让我很头疼 尝试从表单登录时出现此错误 Symfony 组件 HttpKernel 异常 MethodNotAllowedHttpException 没有消息 登录控制器 php
  • 如何使用mb_detect_encoding检测编码是否正确?

    我想检测编码是否正确 但我发现 mb detect encoding 总是得到错误结果 并且我添加了很多encoding list UTF8 ISO 8859 你试图做的事情只是有时作品 编码检测并不是一门精确的 科学 因此您能做的最好的事
  • 如何向 DOM 添加支持 Angular 的元素?

    我想以编程方式添加一些支持 Angular 的 DOM 元素 实际上 我可能需要添加自定义组件 我该怎么做 这是一个简单的小提琴来演示这个问题 http jsfiddle net ZJSz4 2 http jsfiddle net ZJSz
  • 错误:无法检索请求的 URL

    我在 CodeIgniter 中有一个项目并托管在子域中 它有一个错误 所请求的网址无法检索 这是它的图片 Error https i stack imgur com ltBZB png 我在新安装 CodeIgniter 时遇到了同样的错
  • 以编程方式将礼品消息设置为现有订单[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在寻找一些代码 以便在 Mage
  • AngularJS:如何缓存从 $http 调用返回的 json 数据?

    如何缓存从 http 调用返回的 json 数据 我使用以下风格的 http 调用 http url SomeWebMethodUrl method POST data query somevalue headers Content Typ
  • 如何更改 angularjs $http.jsonp 的标头

    我读了document http docs angularjs org api ng 24http 但我想我一定是误解了 http defaults headers jsonp Accept application json http js
  • 404 路由无法匹配请求的 URL

    我刚刚开始学习zend 框架 questions tagged zend framework并遵循此用户指南 http framework zend com manual 2 3 en index html 我能够成功安装zend skel

随机推荐

  • 如何取消注册设置为 jQuery.ajaxStart() 函数的处理程序?

    我尝试做 ajaxStart function 但它不是取代它 而是附加的 如果我理解的话 你想删除ajaxStart来自元素的处理程序 如果是这样 只需使用 jQueryunbind 因为处理程序是作为事件附加的 selector unb
  • 将 Xpath 转换为 CSS 选择器

    我正在努力将以下 Xpath 转换为 CSS form id giftcard form div 3 div button 我知道我可以将 Xpath 用于我的 selenium JS 但由于某些奇怪的原因 它在我的情况下不起作用 我成功地
  • 私有继承、友元和异常处理

    当类 A 私有地继承自类 B 时 意味着 B 是 A 的私有基类子对象 但对于友元来说不是这样 对于友元来说 它是公共子对象 当有多个 catch 处理程序时 第一个匹配的处理程序 即 如果异常类型可以隐式转换为处理程序的参数类型 将被调用
  • Excel 在 CSV 导出中导出数百个空列

    在开始之前 我使用的是 Excel for Mac 2011 我在使用特定的 Excel 电子表格时遇到问题 当我将任何活动工作表导出为 CSV Windows CSV 格式 时 它会导出约 200 个空白列以及 7 或 8 个填充列 我过
  • 使用 jquery 从复选框列表附加文本

    我正在从事 ASP NET 项目 我的任务是附加Checkbox文本到TextBox 复选框的文本从数据库值绑定复选框列表 protected void prbtn Click object sender EventArgs e strin
  • C# 中的 WinForms Aero 向导?

    我正在寻找在 WinForms 中实现一个向导 C notWPF 我希望它符合 Aero Wizard 指南 谁能指点我一些示例代码吗 Codeplex 上有两个项目 航空玻璃供应商 http aeroglassprovider codep
  • 有没有类似Solr分析工具的Elasticsearch插件?

    Solr 内置了 分析画面 https cwiki apache org confluence display solr Analysis Screen 这有助于调试特定字段类型的分词器和过滤器之间的相互作用 ElasticSearch 有
  • 如何使用 AngularJS 指令中的编译函数来重复服务中的元素

    请有人告诉我需要做什么才能在指令中呈现存储在服务中的数组中的新元素 在下面的示例中 来自服务的警报显示每个新元素都已添加到 elements 数组中 但是如何使指令在页面上显示这些新元素呢 我尝试阅读有关的所有内容compile指令中的函数
  • 如何找出 .NET Windows 窗体中哪个控件具有焦点?

    如何找出哪个控件具有焦点Windows 窗体 http en wikipedia org wiki Windows Forms Form ActiveControl http msdn microsoft com en us library
  • 如何通过 super 关键字调用基类方法

    class base public void superMethod System out println Hello i m a super class method class der extends base super superM
  • DELETE FROM `table` AS `alias` ... WHERE `alias`.`column` ...为什么语法错误?

    我用 MySQL 尝试过 DELETE FROM contact hostcommands relation AS ContactHostCommand WHERE ContactHostCommand chr id 999999 LIMI
  • 配方还产生需要包装的本地输出

    我有一个配方 可以成功调用遗留构建命令来交叉编译目标 作为副作用 它会生成一些在构建中使用的自定义本机工具 我想将这些工具转化为 tools native包允许其他食谱依赖主包来访问工件 并使用 tools native包以进一步处理这些工
  • 如何在 Fabric.js 中的画布之间拖放

    据我所知 Fabric js 内置了对同一画布内拖放操作的支持 我们怎样才能让它适用于多个画布 或者来自非画布 html 元素 例如表格中的图像 在 Fabric js 中可以在画布之间进行拖放 但涉及对私有属性的一些操作 为此原因不保证它
  • 错误代码 128 是什么?

    什么是 git remote http 错误代码 128 当我尝试推送到需要身份验证的存储库时 它从不要求输入密码 就会发生这种情况 是否有一些中心位置可以找出错误代码的含义 128是默认的致命错误代码 这并不意味着它一定与身份验证有关 这
  • 使用 QIODevice 的阻塞接口(QTcpSocket 和 QFile)时何时检查错误

    出于学习目的 我制作了通过网络发送文件的应用程序 这对我来说非常有效 这里我将发布主要部分的代码 实际发送字节的代码 我认为这就足够了 我的主要问题是 我应该何时 何地 为何以及如何检查错误 看起来不止一个问题 正如您所看到的 我通过检查每
  • 选择显示输入 AngularJS 中的值

    我需要做这样的事情 当你选择 ex 登录 然后在输入文本中显示login from scope logins与password JS scope logins login log password pass HTML
  • 在java中展平嵌套数组

    我想展平嵌套数组 例如 1 2 3 4 gt 1 2 3 4 在java中手动我找不到线索 S 我尝试过手动java脚本指南 但没有得到解决方案 public static void main String args Object arr
  • 如何在 next.js 中使用 tailwind 背景图片? [复制]

    这个问题在这里已经有答案了 我在公共文件夹中有一张背景图片 名为bg png 在页面文件夹的index js页面中 我想使用该图像作为背景图像 我已经按照他们的官方网站的文档安装了 tailwind 我已经尝试过这个 但它不起作用 从 pu
  • 获取 Twitter API 搜索结果的关注者数量

    我想做的是提取一些搜索结果 并按用户对它们进行排序 现在我正在使用 to gt OAuthRequest http search twitter com search json http search twitter com search
  • 在索引页面上设置 PHP 会话以进行 XSRF 检查

    我遇到了以下有关 XSRF 令牌的问题 客户端 AngularJS 服务器 PHP 当index php被点击时 PHP生成一个XSRF令牌并将其保存在会话中 cookie 设置为相同的值 AngularJS 读取 cookie 并存储值