因为Web安全PHP网站居多 所以找了一个PHP入门的教程 以这里为笔记根据地
之前我们已经把config.php配置文件中连接数据库的操作完成了
接下来我们要开始制作后台登录的界面
后台登录界面
登录框的样式为Html的内容 所以这里不做过多的记录
<html>
<head>
<title>用户登录</title>
<style>
.login{
width: 400px;
margin: 0px auto;
}
</style>
</head>
<div class="login">
<form method="post">
<table>
<tr><td><label for="username">用户</label></td><td><input type="text" name="username" id="username"></td></tr>
<tr><td><label for="password">密码</label></td><td><input type="password" name="password" id="password"></td></tr>
<tr><td colspan="2"><input type="submit" value="登录" name="sub"></td></tr>
</table>
</form>
</div>
</html>
接下来就开始写我们的PHP登录处的代码
初步的一个逻辑判断
代码块为以下这一段
<?php
include_once 'init.php';
$username = $_POST['username'];
$password = md5($_POST['password']);
$result = $conn->query("select * from users where username='$username' and password='$password'");
?>
首先使用$_POST来接收form表单的数据
再此之前需要把form标签给一个POST传输的模式
将POST接收到的username参数给$username变量
将接收到的password参数给$password变量 但是现在密码基本都不再是明文存储 所以我们在$password处使用了md5()进行加密
之后就可以将两个变量的参数丢入SQL语句中执行
我们引用了config.php文件 数据库连接的函数 给到了$conn变量
所以我们在这个页面中可以直接使用$conn这个变量来执行SQL语句
$result = $conn->query("select * from users where username='$username' and password='$password'");
这里为执行的SQL语句
因为SQL语句执行完之后我们需要进行判断 所以我们这里将执行的结果给$result变量
接收到这个变量之后我们进行判断
if($result->num_rows>0){
echo "登录成功";
}else{
echo "登录失败";
}
这里的num_rows函数为PHP5+版本
他的作用是返回结果集中行的数量
当这个SQL语句执行成功时 必定返回大于0的数量,所以我们只需要判断num_rows返回的数字即可
我们可以将其他的语句注释掉 我们输出num_rows返回的值
可以看到当没有传入参数时 上面的SQL语句执行错误 num_rows返回的是0
当我们提交正确的值时 num_rows返回的则是1
完整的登录判断代码如下
<?php
include_once 'init.php';
$username = $_POST['username'];
$password = md5($_POST['password']);
$result = $conn->query("select * from users where username='$username' and password='$password'");
if($result->num_rows>0){
echo "登录成功";
}else{
echo "登录失败";
}
?>
但是我们打开这个页面之后 可以看到并没有输入账号和密码就提示了登录失败
因为我们的PHP代码会自动执行 那么我们在PHP最前面判断是否有执行过来
我们在开头使用if判断sub是否提交过来 sub是登录的提交按钮
<?php
include_once 'init.php';
if($_POST['sub']){
$username = $_POST['username'];
$password = md5($_POST['password']);
$result = $conn->query("select * from users where username='$username' and password='$password'");
if ($result->num_rows > 0) {
echo "登录成功";
} else {
echo "登录失败";
}
}
?>
现在我们访问就不会直接提示登录错误了
一般我们很少是这样进行判断的
因为在这里我们并没有将$username的参数进行处理,直接就丢入了SQL语句中执行,那么就很容易造成注入
这里密码随便输入123也能登录成功,SQL注入的原理在这里不做过多的解释
所以我们需要在判断中再判断一次密码是否正确
if ($result->num_rows > 0) {
$row=$result->fetch_assoc();
var_dump($row);
} else {
echo "登录失败";
}
这里的fetch_assoc()函数是获取结果集,为了更直观的看到,可以使用var_dump($row)将他输出出来
可以看到输出了返回的键和值,这里我们就可以进行判断了
我们只需要取出他的其中一个键
$row=$result->fetch_assoc();
if($row['password']==$password){
echo "登录成功";
}else{
echo "账号或者密码错误";
}
这样可以判断返回的值跟我们输入进去的值是否一致
这就是我们想要的效果
<?php
include_once 'init.php';
if($_POST['sub']){
$username = $_POST['username'];
$password = md5($_POST['password']);
$result = $conn->query("select * from users where username='$username' and password='$password'");
if ($result->num_rows > 0) {
$row=$result->fetch_assoc();
if($row['password']==$password){
echo "登录成功";
}else{
echo "账号或者密码错误";
}
} else {
echo "登录失败";
}
}
?>
这样我们仅仅闭合$username处并不能够进行登录成功 因为登录成功还需要判断密码
但是这样并不能够完全的避免SQL注入
还是会存在注入,因为$username变量还是可以执行SQL语句
所以我们还需要一个判断,我们可以写在函数的文件中
<?php
function filter_str($value){
if(!get_magic_quotes_gpc()){
$value==addcslashes(trim($value));
return $value;
}
return $value;
}
这里要素过多,一 一讲解。
首先是 function filter_str($value) 这是定义一个函数,函数的名字为filter_str,函数的参数为$value变量
if(!get_magic_quotes_gpc()){
$value==addcslashes(trim($value));
return $value;
}
这里首先是进行判断是否开启 get_magic_quotes_gpc() 功能
当 magic_quotes_gpc 打开时,所有的 ‘ (单引号), ” (双引号), (反斜线), and, 空字符会自动转为含有反斜线的溢出字符。
addcslashes() 函数返回在指定的字符前添加反斜杠的字符串。
trim() 函数将空格过滤
如果没有开启的话 我们就将$value变量使用 addcslashes() 将$value变量中的特殊字符进行转义并再赋值给$value变量
如果开启了 get_magic_quotes_gpc() 就直接返回$value变量
最终的形式就是这样
首先在init.php文件中将login.php需要的文件进行引用 这样login.php就需要引用init.php这一个文件了
其次就是在POST接受数据之前进行 filter_str() 函数的数据处理 去除空格、存在特殊字符就进行转义 ’ = \’ , " = \" 将特殊符号左边添加一个反斜杠
<?php
include_once 'init.php';
if($_POST['sub']){
$username = filter_str($_POST['username']);
$password = md5(filter_str($_POST['password']));
$result = $conn->query("select * from users where username='$username' and password='$password'");
if ($result->num_rows > 0) {
$row=$result->fetch_assoc();
if($row['password']==$password){
echo "登录成功";
}else{
echo "账号或者密码错误";
}
} else {
echo "登录失败";
}
}