源代码如下:
if(isset($_POST['submit'])) {
if (empty($_POST['username'])) {
$html .= "<p class='notice'>用户名不能为空</p>";
} else {
if (empty($_POST['password'])) {
$html .= "<p class='notice'>密码不能为空</p>";
} else {
if (empty($_POST['vcode'])) {
$html .= "<p class='notice'>验证码不能为空哦!</p>";
} else {
// 验证验证码是否正确
if (strtolower($_POST['vcode']) != strtolower($_SESSION['vcode'])) {
$html .= "<p class='notice'>验证码输入错误哦!</p>";
//应该在验证完成后,销毁该$_SESSION['vcode']
}else{
$username = $_POST['username'];
$password = $_POST['password'];
$vcode = $_POST['vcode'];
$sql = "select * from users where username=? and password=md5(?)";
$line_pre = $link->prepare($sql);
$line_pre->bind_param('ss',$username,$password);
if($line_pre->execute()){
$line_pre->store_result();
//虽然前面做了为空判断,但最后,却没有验证验证码!!!
if($line_pre->num_rows()==1){
$html.='<p> login success</p>';
}else{
$html.= '<p> username or password is not exists~</p>';
}
}else{
$html.= '<p>执行错误:'.$line_pre->errno.'错误信息:'.$line_pre->error.'</p>';
}
}
}
}
}
}
下面进行代码审计:
isset($_POST['submit'])
当submit,也就是login按键按下
if()开始执行,首先判定用户名是否为空:
empty($_POST['username'])
empty()函数是用来测试变量是否已经配置。若变量已存在、非空字符串或者非零,则返回 false 值;反之返回 true值。
如果为空,则执行以下代码:
$html .= "<p class='notice'>用户名不能为空</p>";
如果不为空,则依次对密码、验证码是否为空进行判定
if (empty($_POST['username'])) {
$html .= "<p class='notice'>用户名不能为空</p>";
} else {
if (empty($_POST['password'])) {
$html .= "<p class='notice'>密码不能为空</p>";
} else {
if (empty($_POST['vcode'])) {
$html .= "<p class='notice'>验证码不能为空哦!</p>";
当验证码不为空时,执行else语句,判断验证码是否正确。
strtolower($_POST['vcode']) != strtolower($_SESSION['vcode'])
strtolower( ) 函数把字符串转换为小写
在PHP中,使用$_SESSION[]可以存储特定用户的Session信息。并且每个用户的Session信息都是不同的。
当用户请求网站中任意一个页面时,若用户未建立Session对象,则服务器会自动为用户创建一个Session对象,它包含唯一的SessionID和其他Session变量,并保存在服务器内存中,不同用户的Session对象存着各自指定的信息。
相关用法:
利用Session变量存储信息:
$_SESSION["Session名称"]=变量或字符串信息;
读取Session变量信息(可赋值给一个变量或者直接输出):
变量=$_SESSION["Session名称"];
这里的$_SESSION['vcode']是已经赋值好并存储在服务器中与验证码图片一一对应的值,即bf[vcode]
$_POST['vcode']是我们输入的验证码
!=的意思是不等于。
当$_POST['vcode']与$_SESSION['vcode']不相等时,执行:
$html .= "<p class='notice'>验证码输入错误哦!</p>";
若是相等,则执行else语句
$username = $_POST['username'];
$password = $_POST['password'];
$vcode = $_POST['vcode'];
$sql = "select * from users where username=? and password=md5(?)";
$line_pre = $link->prepare($sql);
$line_pre->bind_param('ss',$username,$password);
if($line_pre->execute()){
$line_pre->store_result();
//虽然前面做了为空判断,但最后,却没有验证验证码!!!
if($line_pre->num_rows()==1){
$html.='<p> login success</p>';
}else{
$html.= '<p> username or password is not exists~</p>';
}
}else{
$html.= '<p>执行错误:'.$line_pre->errno.'错误信息:'.$line_pre->error.'</p>';
}
这部分代码与第一关几乎相同,就不解释了。