哆啦A梦 50周年应援

使用Token进行CSRF漏洞防御

1、登录验证成功之后,在会话SESSION["user_token"]中保存Token。

2、在后台操作中,增删改表单中添加隐藏域hidden,设置value为Token。

3、提交之后进行验证Token是否正确。

简化代码演示:

Token验证过程,从实践中理解Token防御CSRF的过程。


 1、session的工作原理

(1)首先使用session_start()函数进行初始换

(2)当执行PHP脚本时,通过使用$_SESSION超全局变量注册session变量。

(3)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中, 这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。

session_start()做了哪些初始化工作

(1)读取名为PHPSESSID(如果没有改变默认值)的cookie值,假使为abc123

(2)若读取到PHPSESSID这个COOKIE,创建$_SESSION变量,并从相应的目录中(可以再php.ini中设置)读取SESS_abc123(默认是这种命名方式)文件,将字符装在入$_SESSION变量中; 若没有读取到PHPSESSID这个COOKIE,也会创建$_SESSION变量,同时创建一个sess_abc321(名称为随机值)的session文件,同时将abc321作为PHPSESSID的cookie值返回给浏览器端。

 2、$_SESSION变量基本用法

通过为每个独立用户分配唯一的会话 ID,可以实现针对不同用户分别存储数据的功能。 会话通常被用来在多个页面请求之间保存及共享信息。 一般来说,会话 ID 通过 cookie 的方式发送到浏览器,并且在服务器端也是通过会话 ID 来取回会话中的数据。 如果请求中不包含会话 ID 信息,那么 PHP 就会创建一个新的会话,并为新创建的会话分配新的 ID。

会话的工作流程很简单。当开始一个会话时,PHP 会尝试从请求中查找会话 ID (通常通过会话 cookie), 如果请求中不包含会话 ID 信息,PHP 就会创建一个新的会话。 会话开始之后,PHP 就会将会话中的数据设置到 $_SESSION 变量中。 当 PHP 停止的时候,它会自动读取 $_SESSION 中的内容,并将其进行序列化, 然后发送给会话保存管理器来进行保存。

默认情况下,PHP 使用内置的文件会话保存管理器(files)来完成会话的保存。 也可以通过配置项 session.save_handler 来修改所要采用的会话保存管理器。 对于文件会话保存管理器,会将会话数据保存到配置项 session.save_path 所指定的位置。

可以通过调用函数 session_start() 来手动开始一个会话。 如果配置项 session.auto_start 设置为1, 那么请求开始的时候,会话会自动开始。

PHP 脚本执行完毕之后,会话会自动关闭。 同时,也可以通过调用函数 session_write_close() 来手动关闭会话。


开始tmp文件夹空

原始用户提交

提交后,session会话,生成的see文件

修改内容,利用修改的poc的html提交(本次使用scrf漏洞提交)

使用构造poc的html提交,服务器,返回失败。

因为此时的token值 与 原用户$_SESSION [ "user_token"]对不上。

提交后,session会话,都会在tmp文件夹上创建的see文件

参考资料:

https://blog.csdn.net/cs23405/article/details/81297698

https://www.php.net/manual/zh/function.session-start.php

https://www.php.net/manual/zh/session.examples.basic.php

posted @ 2021-10-21 21:34  秋泊ソース  阅读(875)  评论(0编辑  收藏  举报