思路:
利用PHP来编写网页进而测试cookie
环境:
RHEL7.2 安装有httpd,(即Apache),php
说明:
Php语言的编译位置为/var/www 在其下创建了三个页面,用于测试时的页面跳转 代码在文末
测试:
1.在登录的主页面输入代码中设置好的用户名与密码字段并勾选自动登录
2.点击确定后,页面会跳转至cookie.php,其显示的内容是用于测试的内容,文末代码中的注释留有解释
3.点击确定后,页面跳转至success.php,再次确定,页面显示用户登录页面的次数
刷新本页面,无需登录,直接显示结果,这是因为cookie的作用
下面将详细分析cookie的作用与意义
当页面跳转至cookie.php后这个页面会制作一个cookie值存储在客户端的本地,在页面右键打开开发者模式可以看到cookie的值,其中key就是cookie值,文末代码中有解释,不同的浏览器打开此页面的key值是相同的,是因为key是将用户名、密码、种子随机值进行MD5运算得来的,虽然不可逆,但是其确是唯一的一个值
通过wireshark抓取这个HTTP报文,也可以看出这个cookie的制作与验证的详细过程,访问cookie.php后,该页面将制作好的cookie传给客户端本地,客户端下次访问时,就会携带这个cookie,并且不需要输出用户名与密码字段
结论:
Cookie就是一个存储在客户端的本地的一个标识信息,进行识别下次登录的请求,如果比对成功,那就直接登录,不需要用户再次输入用户名与密码。
三个页面其内容代码如下
login.php 登录的主页面
源码:
<HTML>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<body>
<h2>登录页面<hr></h2>
<form action="cookie.php" method="post">
<h3>登录,请输入正确的用户名与密码:</h3>
<h4>
<p>
username:
<input type="text" name="user" ><br>
password:
<input type="text" name="pawd" ><br>
<input Type=Submit value="确定">
<input type="checkbox" name="check" value=1>自动登录
</p>
</h4>
</form>
</body>
</html>
cookie.php 制作cookie的页面
源码:
<?php
ob_start(); #缓存
header("content-type: text/html; charset=utf-8");
$un=$_POST['user']; #根据user这个键,利用_POST取得其中的值,即 将用户输入的用户名取出并赋给un这个变量
$pw=$_POST['pawd']; #同上
$ck=$_POST['check'];#同上
echo '用户名:'.$un.' ,密码:'.$pw.' ,是否点击自动登陆:'.$ck; #测试代码 打印用户输出的用户名与密码
if($un=="Eichi" && $pw=="123")
{
if($ck==1)
{
setcookie('username',$un,time()+60,'/'); #uesrname是键,变量 $un 是值
setcookie('password',$pw,time()+60,'/'); # 同上
$seed='yichen'; #设置种子值 随机
$key=md5($un.$pw.$seed); #md5运算这三个变量,用于后期比对cookie中是否存在记录
setcookie('key',$key,time()+60);
echo 'username:'.$_COOKIE['username'];
}
else
{
setcookie('username',$un,time()+60);
}
exit("<script>
alert('登录成功');
location.href='success.php';
</script>"
);
}
else
{
exit('用户名或密码错误');
}
ob_end_flush();
?>
success.php 成功登录后的显示页面
源码:
<?php
ob_start();
header("Content-type: text/html; charset=utf-8");
# 这里判断username这个键 中有没有 值 是因为防止攻击者直接访问success.php页面 进而绕行输入用户与密码的流程
# 只需判断用户名栏有无文本是因为
if(!isset($_COOKIE['username'])|| !isset($_COOKIE['password']))
{
exit("<script>
alert('请先登录!');
location.href='login.php';
</script>"
);
}
if(isset($_COOKIE['key']))
{
if($_COOKIE['key']==md5('Eichi'.'123'.'yichen')) #md5验证成功,即账号与密码的cookie验证成功
{
echo"<script>
alert('再一次登录成功');
</script>";
}
else #验证失败,即密码输入错误
{
exit("<script>
alert('请重新登录!');
location.href='login.php';
</script>"
);
}
}
session_start();
if(isset($_SESSION['num']))
{
$_SESSION['num']=$_SESSION['num']+1;
}
else
{
$_SESSION['num']=1;
}
# cookie.php中已经将 $un 赋给 username
echo "这是".$_COOKIE['username']."第".$_SESSION['num']."次光临本页面!";
?>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<body>
<h1>这是<?php echo $_COOKIE['username']; ?>的主页!</h1>
</body>
</html>