day15 个人博客项目&登录验证&Cookie&Session&验证码安全

知识点

1.后台验证-登录用户逻辑安全

2.后台验证-cookie和session

3.后台验证-验证码和万能密码

通常的后台验证登录都是,1.发送登录请求,账户密码;2.接受账号密码3.对账号密码进行判断

正确 -》跳转到成功登录界面

失败-》重新登录

而成功登录之后就会进入后台,后台会有多个管理项,而每一个管理项目如果挨个进行账户密码验证就太麻烦了,就产生了cookie和session,方便权限的验证

cookie:身份验证 存储到客户端浏览器内

cookie安全:cookie修改 伪造 盗取

session: 身份验证 存储到服务端服务器内

session安全: 会话劫持(session劫持)

开始构造代码

cookie验证

写一个登录的表单

复制代码
<form action="" method="POST">
​
    帐号:<input type="text" name="user">
    密码:<input type="password" name="pass">
    <input type="submit" value="提交">
​
</form>

<?php
header("Content-type: text/html; charset=utf-8");

在写好验证登陆代码

php 复制代码
<?php
include("config/data.php");
header("Content-type: text/html; charset=utf-8");
$username=$_POST['user']; //获取post提交的值user
$password=$_POST['pass'];
$sql="select * from user where name='$username' and password='$password' ";
$jieguo=mysql_query($sql,$data); //执行数据库语句
if(mysql_num_rows($jieguo)){ //mysql_num_rows判断数据库有没有回显结果
    echo '成功';
}else{
    echo '失败';
}

能进行一个登陆的验证即可

然后写一个后台在哪

输入正确的账户密码就可以登录到这里来,但是这就出现问题了,我直接访问目录也能进入后台啊,没有验证,这可怎么办,。这就用到了cookie

另一个后台文件

php 复制代码
<?php
header("Content-type: text/html; charset=utf-8");
//验证是不是登录进来了的
$user = $_COOKIE['user']; //获取cookie中user值
if($user !=''){
    echo "后台登录界面";

}else{
    echo "不对劲";
}

但是只要的cookie判断,如果对方猜到了逻辑,就可以进行cookie伪造绕过,cookie在浏览器是固定值,如果别人在登录状态触发了攻击者的xss漏洞,攻击者就会获取到别人的登录cookie

session判断

session就不会出现被盗取的问题

代码

php 复制代码
<form action="" method="POST">
​
    帐号:<input type="text" name="user">
    密码:<input type="password" name="pass" autocomplete="new-password">
    <input type="submit" value="提交" >
​
</form>

<?php
include("config/data.php");
header("Content-type: text/html; charset=utf-8");
$username=$_POST['user']; //获取post提交的值user
$password=$_POST['pass'];
$sql="select * from user where name='$username' and password='$password' ";
$jieguo=mysql_query($sql,$data); //执行数据库语句
//if(mysql_num_rows($jieguo)){ //mysql_num_rows判断数据库有没有回显结果
//    echo '成功';
//    header("Location: cookie/admin.php");//header重定向到别的php文件
//    setcookie('user',$username);//setcookie设置cookie值
//}else{
//    echo '失败';
//}
//2.session型判断

while($row=mysql_fetch_array($jieguo)){//成功登录后
    session_start();//产生创建一个会话。
    $_SESSION['user'] = $row['username'];//将查询结果的值进行赋值。
    header('Location: cookie/admin.php');//跳转url,----------这里要特定指向,形成前后关联啊。--------------
}

验证的代码

php 复制代码
<?php
//$user = $_COOKIE['user']; //获取cookie中user值
session_start();
$username=$_SESSION['user'];
if($username !=''){
    echo "后台登录界面";

}else{
    echo "不对劲";
}

为了更直观的看到,进行抓包

产生的session

而在访问一次,产生的cookie又不同

这就像打电话,打电话的是正常的,如果其中一方断了链接,比如关了浏览器,cookie值就又重写随机生成一个,这根本没办法伪造,不能猜解对接的cookie如何验证,或者根据代码去伪造

代码提供

php 复制代码
<form action="" method="POST">
​
    帐号:<input type="text" name="user">
    密码:<input type="password" name="pass" autocomplete="new-password">
    <input type="submit" value="提交" >
​
</form>

<?php
include("config/data.php");
header("Content-type: text/html; charset=utf-8");
$username=$_POST['user']; //获取post提交的值user
$password=$_POST['pass'];
$sql="select * from user where name='$username' and password='$password' ";
$jieguo=mysql_query($sql,$data); //执行数据库语句
//if(mysql_num_rows($jieguo)){ //mysql_num_rows判断数据库有没有回显结果
//    echo '成功';
//    header("Location: cookie/admin.php");//header重定向到别的php文件
//    setcookie('user',$username);//setcookie设置cookie值
//}else{
//    echo '失败';
//}
//2.session型判断
while($row=mysql_fetch_array($jieguo)){//这个是判断有没有返回数据
    session_start();//产生创建一个会话。
    $_SESSION['user'] = $row['name'];//将查询结果的值进行赋值。
    header('Location: cookie/admin.php');//跳转url,----------这里要特定指向,形成前后关联啊。--------------
}

万能密码

数据库有与或非判

真和真=真。真和假=假

真或真=真。真或假=真

我们本来的账户密码判断sql语句时如下

"select * from user where name='username' and password='password' ";

这里#号是注释掉后面的sql语句

如果账户构造成这样

"select * from user where name=''or 1=1#' and password='$password' ";

1=1是真,会直接返回数据,也会直接登陆成功,这就是万能密码

口令爆破,验证码复用问题

如果没有验证,客户端可以一直尝试登录,就可能会存在爆破出admin密码的可能性,所以要添加一个验证码

验证码代码

php 复制代码
<?php
header("Content-type: text/html; charset=utf-8");
session_start();//必须位于脚本的最顶端
$image = imagecreatetruecolor(100, 30);//imagecreatetruecolor函数建一个真彩色图像
//生成彩色像素
$bgcolor = imagecolorallocate($image, 255, 255, 255);//白色背景     imagecolorallocate函数为一幅图像分配颜色
$textcolor = imagecolorallocate($image, 0, 0, 255);//蓝色文本
//填充函数,xy确定坐标,color颜色执行区域填充颜色
imagefill($image, 0, 0, $bgcolor);
$captch_code = "";//初始空值

//该循环,循环取数
for ($i = 0; $i < 4; $i++) {
    $fontsize = 6;
    $x = ($i * 25) + rand(5, 10);
    $y = rand(5, 10);//位置随机
    //  $fontcontent=$i>2?chr(rand(97,122)):chr(rand(65,90));//是小写,否则是大写
    $data = 'abcdefghijkmnpqrstuvwxyz3456789';
    $fontcontent = substr($data, rand(0, strlen($data) - 1), 1);
    $fontcolor = imagecolorallocate($image, rand(0, 100), rand(0, 100), rand(0, 100));//随机的rgb()值可以自己定

    imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor); //水平地画一行字符串
    $captch_code .= $fontcontent;
}
$_SESSION['authcode'] = $captch_code;//将变量保存再session的authcode变量中


//该循环,循环画背景干扰的点
for ($m = 0; $m <= 600; $m++) {

    $x2 = rand(1, 99);
    $y2 = rand(1, 99);
    $pointcolor = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));
    imagesetpixel($image, $x2, $y2, $pointcolor);// 水平地画一串像素点
}

//该循环,循环画干扰直线
for ($i = 0; $i <= 10; $i++) {
    $x1 = rand(0, 99);
    $y1 = rand(0, 99);
    $x2 = rand(0, 99);
    $y2 = rand(0, 99);
    $linecolor = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255));
    imageline($image, $x1, $y1, $x2, $y2, $linecolor);//画一条线段

}
header('content-type:image/png');
imagepng($image);
//销毁
imagedestroy($image);

主代码

php 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <!-- 简单的表单提交代码 -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>简单验证码的实现</title>
</head>
<body>
<form method="post" action="">
    帐号:<input type="text" name="user">
    密码:<input type="password" name="pass" autocomplete="new-password">
    <p>验证码图片:<img src="yanzm.php" onClick="this.src='code.php?nocache='+Math.random()" style="cursor:hand" alt="点击换一张"/>点击图片可更换验证码</p>
    <p>请输入图片中的内容:<input type="text" name="authcode" value=""/></p>
    <p><input type="submit" width="20px" height=19px value="提交"></input></p>
</form>

</body>
</html>

<?php
include('config/data.php');
header("Content-type: text/html; charset=utf-8");
// session 存值并匹配用户输入值
if (isset($_REQUEST['authcode'])) {
    session_start();
    if (strtolower($_REQUEST['authcode'])==$_SESSION['authcode']) {//strtolower转化为小写的函数
        echo"输入正确!";
        include("config/data.php");
        header("Content-type: text/html; charset=utf-8");
        $username=$_POST['user']; //获取post提交的值user
        $password=$_POST['pass'];
        $sql="select * from user where name='$username' and password='$password' ";
        $jieguo=mysql_query($sql,$data); //执行数据库语句
        if(mysql_num_rows($jieguo)){
            $row=mysql_fetch_array($result);
            echo '成功!';
            session_start();
            $_SESSION['user']=$row['name'];//讲查询结果的数据进行赋值
            header("Location: cookie/admin.php");
        }else{
            echo '失败!';
            //header("Location: login.php");
        }
        # code...
    }
    else{
        echo"输入错误!";
    }
    exit();
}
?>

在访问就多了一个验证,而这个验证也是验证码正确之后,才能进行账户密码的判断,验证码不正确就不直接返回输入错误,

但是验证码也有可能出现复用的问题,比如登录输入正确验证码,点提交的时候被抓包了。而这个数据包可能一直重发,不会提示验证码错误,密码可以修改,这就出现验证码复用的问题。

避免这个问题就会没发送一次数据包,验证码就变化一次

jian

kang

相关推荐
叶落阁主29 分钟前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954482 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机2 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机2 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954482 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star2 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954482 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher4 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行7 天前
网络安全总结
安全·web安全
red1giant_star7 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全