目录
4.php开发-个人博客项目&登录验证&cookie&session&验证码安全
知识点
本节大纲思路
——这里以我自己的为例——
cookie验证——————>
login1.php-登录后台界面
login_check.php-检查,作为包含文件
add_news.php-后台界面
php编码
如何创建 Cookie?--setcookie()
语法
实例 1
php header跳转
演示案例-cookie验证脆弱问题
session验证——————>
session/login.php-管理员登录界面
session/index.php-后台界面
验证码——————>
万能密码
验证码
?
知识点
1-后台验证-登录用户逻辑安全
2-后台验证-cookie&session
3-后台验证-验证码&万能密码等
本节大纲思路
?
?
——这里以我自己的为例——
cookie验证——————>
login1.php-登录后台界面
——根目录下
————这里注意输入密码的时候一般就进行了MD5加密,——不管怎么样,提交的数据要与数据库中的一样!!!
——这里我就先不加密了(密码)
<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"); header("Content-type: text/html; charset=utf-8"); include('config/conn.php'); ? $username=$_POST['user']; $password=($_POST['pass']);//注意MD5加密—————与数据库里的一样就行!!! //echo $password; $sql="select * from admins where username='$username' and password='$password'"; //echo $sql; $result=mysql_query($sql,$conn); if (mysql_num_rows($result)){ echo '成功'; header('Location: admin/add_news.php'); setcookie('user',$username); } else{ //echo '失败登录'; } ?>
?
——cookie设置的时候,在数据包里会携带账号密码;不然直接访问没有携带。
login_check.php-检查,作为包含文件
——放config下,检验用户的身份(为admin还是普通用户)
后台页面——先验证登录,才进行代码操作(防止直接访问)
<?php $user=$_COOKIE['user']; if($user != ''){ //单个验证,cookie可以修改,伪造,进行攻击。 echo '这里就是后台文章添加的页面'; } else{ echo '你妹的,不能进入'; } ?>
add_news.php-后台界面
———放admin目录下,admin登录时验证(包含了验证文件)
<?php header("Content-Type:text/html;charset=utf-8"); //先验证登录,再进行代码操作。 //1-cookie验证 //2-session验证 ? //cookie验证 include("../config/login_check.php"); ?>
?
?
php编码
php 编码 ---解决乱码问题
php utf-8编码:(php页面为url) header("Content-type: text/html; charset=utf-8"); php gbk编码: header("Content-type: text/html; charset=gb2312"); php big5编码 (繁体): header("Content-type: text/html; charset=big5");
如何创建 Cookie?--setcookie()
PHP Cookie | 菜鸟教程
setcookie() 函数用于设置 cookie。
注释:setcookie() 函数必须位于 <html> 标签之前。
语法
setcookie(name, value, expire, path, domain);
实例 1
在下面的例子中,我们将创建名为 "user" 的 cookie,并为它赋值 "runoob"。我们也规定了此 cookie 在一小时后过期:
<?php setcookie("user", "runoob", time()+3600); ?> ? <html> .....
注释:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码。(为防止 URL 编码,请使用 setrawcookie() 取而代之。)
php header跳转
php的header函数_php header-CSDN博客
header('Location: RM新时代-首页'); //跳转到一个新的地址
演示案例-cookie验证脆弱问题
(熊海cms)
抓包后在cookie上面修改
——登录后,发现地址栏出现了传参,————所以我们给他修改一下——r=index————直接跳转到登录成功的界面。
————显然不行,可能cookie没有通过,
——抓包之后——看cookie
源代码:
——————呵呵,这里直接修改一下cookie就行了
——进入后台。
白盒嘿嘿嘿~
黑盒测试就在cookie上面不断伪造就行了........
————注意cookie的存活时间,他是储存到浏览器里面的。
cookie盗取:
人家登录状态,伪造一下,xss利用盗取cookie。
无痕浏览不会储存...
?
?
session验证——————>
(打电话一样,一方挂了就没了,变了。)一旦PHPSESSID断了,就没了,
会话劫持。————人家正在浏览器浏览,没有断,才能干到。
——登录一次就产生一次,储存在服务器。
xxxSESSIONID --->session验证,和cookie没联系了;专注session!
session/login.php-管理员登录界面
<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"); include('../config/conn.php'); $username=$_POST['user']; $password=$_POST['pass'];//注意密码加密 $sql="select * from admins where username='$username' and password='$password'"; $result=mysql_query($sql,$conn); while($row=mysql_fetch_array($result)){//成功登录后 session_start();//产生创建一个会话。 $_SESSION['user'] = $row['username'];//将查询结果的值进行赋值。 header('Location: index.php');//跳转url,----------这里要特定指向,形成前后关联啊。-------------- } ?>
session/index.php-后台界面
<?php ? header("Content-Type:text/html;charset=utf-8"); session_start(); $username=$_SESSION['user']; ? if($username=='admin'){ echo '欢迎登陆管理员首页!'; }else{ echo "session,您不是管理员"; } ?>
?
?
?
验证码——————>
万能密码
万能密码大全-CSDN博客
' ' OR 1=1#
注释符(过滤掉后边的) ---> #
or 或者 ,两边只要有一个真就行。
验证码
code.php ---生成验证码
<?php 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); ?>
f.php ---引用了验证码code.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"> <p>验证码图片:<img src="code.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/conn.php'); header("Content-type: text/html; charset=utf-8"); // session 存值并匹配用户输入值 if (isset($_REQUEST['authcode'])) { session_start(); if (strtolower($_REQUEST['authcode'])==$_SESSION['authcode']) {//strtolower转化为小写的函数 echo"输入正确!"; $username=$_POST['user']; $password=md5($_POST['pass']); $sql="select * from sy_adminuser where username='$username' and password='$password'"; $result=mysql_query($sql,$conn); if(mysql_num_rows($result)){ $row=mysql_fetch_array($result); echo '成功!'; session_start(); $_SESSION['user']=$row['username'];//讲查询结果的数据进行赋值 header("Location: admin/add_news.php"); }else{ echo '失败!'; //header("Location: login.php"); } # code... } else{ echo"输入错误!"; } exit(); } ?>
——验证码正确才能进入循环——再看账号密码
防爆破攻击 ------每一次登录验证码都要变!!!
抓包,看看验证码是否为一次性~
验证码识别———