PHP入门第二天

因为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 "登录失败";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a7xq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值