登录流程
1、发送登录请求 账户密码
2、接收账号密码
3、判断账号密码的准确性
正确 - 成功登录 -跳转到成功页面
错误 - 登录失败- 重新登录
后台管理系统有多个文件页面,比如文章管理,用户添加等等各种页面,每个页面都需要登陆验证 (如果不验证的话,岂不是直接就能查看编辑各个页面了 )。为了方便验证,没有采取再次要求登录的方式, 一般采取cookie或者session进行验证,后台系统会包含一个验证文件,后台的每个页面都需要加载这个验证文件,要是验证不通过,则不允许加载这些页面
看下面的例子
<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.php');
$username=$_POST['user'];
$password=md5($_POST['pass']);
$sql="select * from sy_adminuser where username='$username'and password='$password'";
echo $sql;
$result=mysqli_query($conn,$sql);
if(mysqli_num_rows($result)){
echo "成功登录";
header("location: admin/add_news.php");
}else{
echo "failed";
header("location: login.php");
}
登录成功,则跳转到admin/add_news.php
这个页面。实践中会发现它确实会跳转到这个页面,但它直接执行了。我们所预期的是,只有在登录之后才能看到执行这个添加文章的页面的。但现在就相当于可以直接访问执行了。那登不登陆还有什么意义呢?(可能造成未授权访问) 所以这里需要加上登录验证代码,但是我们又不想每次老是登录它,于是可以用cookie验证文件
cookie - 身份验证 存储在客户端浏览器内
cookie安全 : cookie修改 cookie伪造 cookie盗取
session - 身份验证 存储在服务端服务器内
session安全: session劫持(会话劫持)
cookie修改
在login.php
中添加如下设置cookie代码,
if(mysqli_num_rows($result)){
echo "成功登录";
header("location: admin/add_news.php");
//设置cookie值
setcookie(user,$username);
}else{
echo "failed";
header("location: login.php");
}
在add_news.php
中添加验证cookie的代码
<?php
header("Content-Type:text/html;charset=utf-8");
//先要验证登录 才能进行代码操作
//1、 cookie 验证
$user=$_COOKIE['user'];
if($user != ''){
echo '就是这个页面了';
}else{
echo '登录失败,不能给你看这个页面';
}
?>
假如这个cookie值是可修改的,而且也没有进行其他验证,就可能出现了cookie修改漏洞。仅仅修改cookie值就有可能绕过验证。
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.php');
$username=$_POST['user'];
$password=md5($_POST['pass']);
$sql="select * from sy_adminuser where username='$username'and password='$password'";
echo $sql;
$result=mysqli_query($conn,$sql);
//if(mysqli_num_rows($result)){
// echo "成功登录";
// header("location: admin/add_news.php");
// setcookie('user',$username);
//}else{
// echo "failed";
// //header("location: login.php");
//}
while($row=mysqli_fetch_array($result)){//成功登录后
session_start();
$_SESSION['user']=$row['username']; //将查询结果赋值给 $_SESSION['user']
header("location: admin/add_news.php");
}
修改add_news.php
<?php
header("Content-Type:text/html;charset=utf-8");
//先要验证登录 才能进行代码操作
//1、 cookie 验证
//$user=$_COOKIE['user'];
//if($user != ''){
// echo '就是这个页面了';
//}else{
// echo '登录失败,不能给你看这个页面';
//}
session_start();
if($_SESSION['user']=='admin'){ // 将$_SESSION['user']的值与admin进行比较
echo 'you are admin';
}else{
echo 'you are not admin';
}
?>
再次进行登录查看cookie,与之前的单纯的cookie验证相比,多了phpsessid。这个sessid值几乎无法伪造。每次打开浏览器都不一样,且有很短的时效性,session是更加安全的验证方式。有session在,cookie类的攻击方式基本可以放弃了。
爆破攻击 - 验证码
如果爆破时,验证码可以一直抓包复用,那就等于没有验证码。如果每次都是动态验证码,不能复用,则考虑验证码识别插件,如果时动作型的验证码,比如 拖、拉、拽 等等,那就有点难了啊