MENU

安全学习-01-PHP基础

August 24, 2021 • 网络安全

PHP表单验证

一、表单基础知识点;

表单标签:

<form action="URL" method="方法" target="_blank"> 
    <input name="name" type="text" />
</form>

input target:

  • _blank 在新的窗口打开
  • 默认为 _self

input type:

  • text 普通文本框
  • password 密码文本框
  • number 数字文本框
  • file 上传框
  • radio 单选
  • checkbox 多选
  • button 按钮
  • submit 提交
  • image 图片提交
  • reset 重置


二、过程思路;

  1. 首先规划好数据库的配置,表的字段类型;
  2. 从安全考虑,创建程序数据库账号仅仅是该数据库的权限,无mysql系统库权限;
  3. 考虑密码加盐,重新规划数据表字段,代码增加组合;
  4. 考虑如何结合前端页面,登录与注册按钮如何同时存在,考虑到为了方便解耦,注册使用一个按钮跳转,并不传值。

三、开始操作;

1、配置设计数据库;

<1>.创建数据库;

1.创建数据库


<2>.创建php程序使用的数据库用户;

为了方便我本地连接,所以没有使用仅本机。

2.创建一个程序使用的账户


<3>.创建用户表;

由于前期的规划没有做详细,导致字段长度取得过少,md5加密后并未全部存储,导致死活登录不上,找了半天才发现是字段的问题。3.创建用户表

CREATE TABLE user_center.user(
  id int(1) NOT NULL AUTO_INCREMENT,
  name varchar(20) NOT NULL,
  password varchar(35) NOT NULL,
  salt varchar(4) NOT NULL,
  PRIMARY KEY (id)
)default charset="utf8mb4";


2、前端默认页面设计;

index.php

<html>
<meta charset="utf8"/>
<center>
<h1>引导中心</h1>
<form action="login.php" method="POST" target="_self">
    帐号:<input name="name" type="text" />长度应为:3-15<br>
    密码:<input name="pwd" type="password" />长度应为:5-15<br>
    <br>
    <input type="submit" Value="登录">
</form>
<a href="register.php" target="_blank">
     <button>无账号,点此进行注册!</button>
</a>
</center>
</html>


效果图4.引导中心


3、后端PHP代码;

<1>.注册中心

register.php

<html>
<meta charset="utf8"/>
<center>
<h1>注册中心</h1>
<form action="register.php" method="POST" target="_self">
    帐号:<input name="name" type="text" />长度应为:3-15<br>
    密码:<input name="pwd" type="password" />长度应为:5-15<br>
    <input type="submit" Value="注册">
</form>
<?php
# 判断是否传递POST参数
if (is_array($_POST) && count($_POST) > 0) {
    # 判断是否传递POST中name参数且字符长度应大于2位
    if (isset($_POST['name']) && strlen($_POST['name']) > 2 && strlen($_POST['name']) < 15) {
        $name = addslashes($_POST['name']);
        # 判断是否传递POST中pwd参数且字符长度应大于4位
        if (isset($_POST['pwd']) && strlen($_POST['pwd']) > 4 && strlen($_POST['pwd']) < 15) {
            $password = addslashes($_POST['pwd']);
            # 连接数据库
            $connection = mysqli_connect("192.168.10.15:3306", "php", "123456@qq", "user_center");
            if (!$connection) {
                die("数据库连接错误!");
            }
            # 判断该用户名是否存在
            $usersql = "select name from user where name='$name'";
            $result = mysqli_query($connection, $usersql);
            if (mysqli_num_rows($result) > 0) {
                mysqli_close($connection);
                die("用户存在不予注册!<br>");
            }
            # 加入盐值
            $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';
            $randStr = str_shuffle($str);
            $salt = substr($randStr, 0, 4);
            # 拼接密码与盐值进行md5加密
            $pwd = md5($password . $salt);
            $sql = "insert into user(name,password,salt) values('$name','$pwd','$salt')";
            if (mysqli_query($connection, $sql)) {
                echo "用户注册成功:{$name},请移步到登录页面!<br>";
            } else {
                echo "注册失败: " . $sql . "<br>" . mysqli_error($conn);
            }
            mysqli_close($connection);
        } else {
            die("密码强度不满足,请输入长度大于4位且小于15位的密码!");
        }
    } else {
        die("用户名长度不满足,请重新输入长度位于2-15位的用户名!");
    }
}
?>
</center>
</html>


效果图

5.注册中心-1


5.注册中心-2


5.注册中心-3



<2>.登录中心

login.php

<html>
<meta charset="utf8"/>
<center>
<h1>登陆中心</h1>
<?php
# 判断是否传递POST参数
if (is_array($_POST) && count($_POST) > 0) {
    # 判断是否传递POST中name参数且字符长度应大于2位
    if (isset($_POST['name']) && strlen($_POST['name']) > 2 && strlen($_POST['name']) < 15) {
        $name = addslashes($_POST['name']);
        # 判断是否传递POST中pwd参数且字符长度应大于4位
        if (isset($_POST['pwd']) && strlen($_POST['pwd']) > 4 && strlen($_POST['pwd']) < 15) {
            $password = addslashes($_POST['pwd']);
            # 连接数据库
            $connection = mysqli_connect("192.168.10.15:3306", "php", "123456@qq", "user_center");
            if (!$connection) {
                die("数据库连接错误!");
            }
            # 判断该用户名是否存在,并获取盐值
            $usersql = "select salt from user where name='$name';";
            if ($result = mysqli_query($connection, $usersql)) {
                // 返回记录数
                $rowcount = mysqli_num_rows($result);
                if ($rowcount == 1) {
                    while ($row = mysqli_fetch_assoc($result)) {
                        $salt = $row['salt'];
                    }
                } else {
                    mysqli_close($connection);
                    die("该用户不存在!");
                }
                // 释放结果集
                mysqli_free_result($result);
            }
            # 判断用户输入用户名密码是否正确
            $pwd = md5($password . $salt);
            $sql = "select name from user where name='$name' and password='$pwd';";
            if ($login = mysqli_query($connection, $sql)) {
                $loginRows = mysqli_num_rows($login);
                if ($loginRows == 1) {
                    echo "欢迎 {$name} 回来!<br>";
                } else {
                    echo "密码错误,请重试!<br>";
                }
            }
            mysqli_close($connection);
        } else {
            die("密码强度不满足,请输入长度大于4位且小于15位的密码!");
        }
    } else {
        die("用户名长度不满足,请重新输入长度位于2-15位的用户名!");
    }
}
?>
</center>
</html>


效果图

6.登录中心-1


6.登录中心-2



登录错误处理

6.登录中心-3


6.登录中心-4


至此,所有操作就做完了,总体上注册与登录还是都满足了,目前对php操作数据库的函数还不太了解,还需要多学习。


四、过程中遇到的问题;

  1. 前期对数据库字段的规划不准确,导致字符串长度长但是数据库的字段较短导致存储进数据库部分字符串丢失,从而导致注册成功,但无法登录,后修改数据库字段解决;
  2. 未做参数为空判断,导致空用户名或空密码也能注册,修改判断传参的字符串长度限制后解决;
Last Modified: August 26, 2021