安全开发 php 三大用户验证 Cookie、Session、Token &&和相关安全问题

前言

以开发者的角度去理解用户验证机制。

cookie

定义:cookie就是一种出现在前端的,一种身份验证机制   (举例就类似于 你登陆一次qq之后下次就是不用重新登录了  这是为什么呢  这其实就是 cookie 产生之后就会储存(这个需要我们定义储存时间)   既然这个时间是有延迟的那就可能被捕捉然后被利用   就是比如你不小心点击了一个请求伪造网站 cookie 被获取了  然后你的勾选了(记住我的账号)就会被 获取信息,但是这个时候要是再有个验证那就不会让你丢失账号数据了 这个我们叫做唯一性  那这个让你账号保持唯一性的东西 呢我们就叫做token   这里就知道token让我们的账户或者是客户端只认识我们  )

那就让我们打开 VScode  开始敲吧 

这边我们为了便利先写一个  php连接数据库的 语句,然后要被使用的话就直接调用就可以了,

代码如下     (代码的意思注释我上个文章都有)

<?php 

$dbip="localhost";
$dbuser="root";
$dbpasswd="123456";
$dbname="demo01"

$con=mysqi_connect("localhost","root","123456","demo01")



?>

为什么创建这个文件   就是后边的一些数据库的执行 都需要这个$con为前提  msqli_query($con,'数据库操作命令')

然后我们创建3个  php  分别为   admin-c.php      index-c.php        logout-c.php

进入admin-c        复制一下下边这个AI写的登录页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>后台登录</title>
    <style>
        body {
            background-color: #f1f1f1;
        }
        .login {
            width: 400px;
            margin: 100px auto;
            background-color: #fff;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0,0,0,0.3);
            padding: 30px;
        }
        .login h2 {
            text-align: center;
            font-size: 2em;
            margin-bottom: 30px;
        }
        .login label {
            display: block;
            margin-bottom: 20px;
            font-size: 1.2em;
        }
        .login input[type="text"], .login input[type="password"] {
            width: 100%;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            font-size: 1.2em;
            margin-bottom: 20px;
        }
        .login input[type="submit"] {
            background-color: #2ecc71;
            color: #fff;
            border: none;
            padding: 10px 20px;
            border-radius: 5px;
            font-size: 1.2em;
            cursor: pointer;
        }
        .login input[type="submit"]:hover {
            background-color: #27ae60;
        }
    </style>
</head>
<body>
<div class="login">
    <h2>后台登录</h2>
    <form action="" method="post">
        <label for="username">用户名:</label>
        <input type="text" name="username" id="username" required>
        <label for="password">密码:</label>
        <input type="password" name="password" id="password" required>
        <input type="submit" value="登录">
    </form>
</div>
</body>
</html>

这里吧有几个用户输入值是需要进行 化为参数  进行后期传参的  

第一个就是username  第二个是  password

这里先说下 cookie的运作过程     1、接收账号密码  2、判断  3、储存   4、根据判断进行页面跳转

那我们就先传参吧  

<?php  

include  'config.php';     //先引用  连接文件
$user=$_post['username'];
$passwd=$_post['password'];    //把用户输入的账号密码  定义为参数  再进行   post  传输




?>

第二步判断   

//接上


<?php //登录文件
include 'config.php';

//接收
$user=$_POST['username'];
$passwd=$_POST['password'];


// 因为判断是从数据库中的信息 进行判断的  所以我们需要先把账号密码从数据库拿出来
$date-msqli_query($con,'select * from admin where name-'$user' and password='$passwd';');

//数据取出来之后  再进行   进行判断看看查到内容没有  如果没有内容说明 用户输入的账号密码不对  然后给他提示    用  msqli_num_row  (这个语句可以获取输出结果的行数)  去判断 如果对了就去执行下一步,不对就让他回退
if($_SEVER['REQUEST_METHOD']=='POST')   //
{if(msqli_num_row($date) !=0 ){
    setcookie ('username','$user',time()+3600,'/');    //建立cookie的语句  第一位就是用户输入的数据   第二位就是给数据赋值,  time()+3600  表示  默认的存活时间 单位是秒
    setcookie('password','$passqd',time()+3600,'/');
    header('Location: index-c.php');         //这个表示重定向  到index-c.php  这个一会说这个其实就是我们的一会登录之后的页面
 
}else{ echo "<script>alert('登录失败')</script>";   

}
}

但是你要是试试了这个代码你就会发现  哎呀你妹的 什么情况啊我一登陆  就给我弹窗失败啊

这个的原因就是这个判断没有什么限制 所以我们一进去他就会判断 那我们什么也没干还当然报错了  这个的解决就是 我们创建一个逻辑让我们点击登录才显示就是在  if上边再加一个 if   判断传输方式  因为登录的按钮就是以post传输。

因为说到了login定向到 index-c  但是在这个里边其实还要进行一次判断(上边这个是数据库和php的判断)这个是两个php跳转的判断   实际上就是为了让cookie一致

index-c  的判断

<?php   if($_COOKIE['username']=='admin' && $_COOKIE['password']=='123456')  //判断上个页面传来的cookie是不是和真实的cookie相同   这个其实我建议 在上个页面定义一个function  就是从数据库拿出 user,passwd那一块    然后在这直接调用 用数据库的值来对比 
{

}else{

header('Location:admin-c.php')  //重定向到admin-c
}
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>后台首页</title>
</head>
<body>
<h1>后台首页</h1>
<p>欢迎您,<?php echo $_COOKIE['username']; ?>!</p>
<p><a href="logout-c.php">退出登录</a></p>
</body>
</html>

运行一下吧

这边就会发现  用户名admin  可以网页检测看看cookie  就会有admin   123456

那就展现个cookie的漏洞  :  就是我们上边说的cookie被窃取了   攻击者就可以直接用我们的cookie登录

现在我们换个 浏览器(浏览器其实就是客户端) 登录一下  发现

然后就是cookie清除系统

我们知道 当我们退出的时候  cookie就是清空 下次就得我们 重新输入密码

打开 logout  开始写吧

//两种方法
//1、 赋值为空型
setcookie("username","", time()+0,"/");   //给与username 为空而让cookie清空   '/'  表示作用于本窗口
setcookie("password","", time()+0,"/");   //
header("Location:admin-c.php");

//2、函数去cookie

// unset($_COOKIE["username"]);
// unset($_COOKIE["password"]);
// header("Loaction:admin-c.php");

运行一下  

那cookie这一块就完事了  源码:

Session 的建立   这两个的区别在我们完成这个实例之后再说

session的单词意思就是会话,那我们说悄悄话不能让别人知道吧  那这个就是在服务器端的

其实是在服务器的

也是创建3个  admin-s,index-s,logout-s

也是先弄admin 前边的一样的就直接粘贴上 , 直接到cookie加密那里

 session_start();    //只要是后边涉及到 session就得开启会话  记住不开启会话就无法进行 session
$_SESSION['username']=$user;  //不设置时间   表示他没有使用后延迟的特性(你开着这个网站  再玩会游戏就发现 过了一会就自动退出了)   你要是想伪造session就得 进入服务器  但是你都进入服务器了 还要这个有个鸟用啊
$_SESSION['password']=$passwd;

index  页面验证session值

session_start();

if($_SESSION['username']=='admin' && $_SESSION['password']== '123456') {
} else {  header('Location:admin-s.php');}  //进行验证  这个和cookie差不多

那我们进行运行演示一下  (这里有个技巧就是如果你 跳转不了其他页面  我建议  用phpstudy去 建立一个本地域名的 网站)  这个演示就得用到这个

登录进去  然后  我们去为了验证这个session和服务器的关系

打开看看

是我们的账号密码   那这又个和cookie的区别其实就是成本   这个虽然登录失败不会产生但是 也会极大的占用服务器资源

这里还涉及一个威胁  就是加入  我们捉到的用户正在和当前的服务器进行数据交互  我们可以用 正在使用的 sessionid  去登录(置换session id)

session的清除

//session的清除和别的不太一样

sesion_start();

//session_unset();    //删除会话的所有变量

session_destory();   //销毁数据
header('Location:admin-s.php')

cookie  session的区别

#具体安全知识点:

-Cookie和Session都是用来在Web应用程序中跟踪用户状态的机制

1、存储位置不同:

Cookie是存储在客户端(浏览器)上的,而Session是存储在服务器端的。只要能对目标服务器进行渗透成功就不需要session

2、安全性不同:

Cookie存储在客户端上,可能会被黑客利用窃取信息,而Session存储在服务器上,更加安全。

3、存储容量不同:

Cookie的存储容量有限,一般为4KB,而Session的存储容量理论上没有限制,取决于服务器的硬件和配置。

4、生命周期不同

Cookie可以设置过期时间,即便关闭浏览器或者重新打开电脑,Cookie仍然存在,直到过期或者被删除。而Session一般默认在浏览器关闭后就会过期。   会话终端  就是你挂着和服务器的交流 一段时间之后你就会发现 你需要重新登录了

5、访问方式不同:

Cookie可以通过JavaScript访问,而Session只能在服务器端进行访问。

6、使用场景不同

Cookie一般用于存储小型的数据,如用户的用户名和密码等信息。而Session一般用于存储大型的数据,如购物车、登录状态等信息。

总之,Cookie和Session都有各自的优缺点,选择使用哪一种方式,取决于具体的应用场景和需求。一般来说,如果需要存储敏感信息或者数据较大,建议使用Session;如果只需要存储少量的数据,并且需要在客户端进行访问,可以选择使用Cookie。

token的设置

发明token的真是个天才   token 的特点就是 可以结合 cookie  session进行双重验证

建立2个文件   token(前端)    token-check(前端后台 或者说是前一个点击之后的)

  这里要用到session   前边我们提到了token的唯一性  就是他是唯一的(通过一个随机函数产生的)  所以为了跳转   我们需要把这个产生的token  先存起来   为什么不用cookie存,其实也需要用cookie   而session 就是比较安全然后与后边我们在html页面插入的token(这个是存了cookie里的)一一对应

<?php   
session_start();
$token=bin2hex(random_bytes(16));   //产生token  是个32进制的数据
// 这边我们可以打印一下  
echo  '$token';
//然后把token存储在   session   cookie中去

$_SESSION['token']=$token;     //储存的目的就是为了和我们跳转的页面进行  一次验证


setcookie('token',$token,time()+ 3600,'/');   //这个在前端产生也是为了防爆破   就是每登陆一次 就会产生一个token在cookie里





?>

演示一下  

这个就是把token放在 cookie的目的    除了防爆破   其实还放着  跨站请求伪造  :别人把一个更改数据的请求以url的形式传给你    然后你一点哎呀我去 我的密码怎么被改了     但是有了这个cookie  token  联动   就是你点它的请求的时候  就发现你直接推到了主页 并显示了 修改失败

这里还有个就是token需要给到html中

写这个的目的就是为了把token化参  和后边的后台验证 对比一下

这边化参数的话   建议是用  cookie['token']传输

直接看后台验证

这里的session token就是一开始藏起来的最初是的token   然后cookie token  就是我们哪个html定义传过来的   一对比是相同的说明找对了    判断完token在判断账号密码(session 双重验证)

源码:

还有个点忘了说  就是action  把这个界面呈现给谁   

运行一下

session  储存了token   

     源码文件:            蓝奏云优享版

总结学习的目的就是为了了解三种验证对渗透测试的影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值