2024,3月第三周周报——通过PHP+MySql数据库+HTML+CSS实现用户的登录,注册,及密码的修改

一,完成事项

通过PHP+HTML+CSS+MySql实现用户的登录,注册,及修改密码;

二,未完成事项

python基础的查漏补缺,ctfshow

三,下周待做

补PHP,Python基础知识{我的基础一塌糊涂(TVT)},kali Linux的学习,及php代码的审计

四,本周学习内容

通过php与HTML+css+mysql实现用户的登录,注册

HTML页面能用就行(主要还是我的前端页面太丑了所以才没放出来,哭)

login.php(登录)

<?php
session_start();
//链接数据库
$root_sevsername="localhost";
$root_username="root";
$root_password="123456";
$root_dbname="users";

$conn= mysqli_connect($root_sevsername,$root_username,$root_password,$root_dbname);

// 验证表单 登录信息
//判断用户名和密码是否为空
$pusername = $_POST['username'] ?? "";
$ppassword = isset($_POST['password']) ? $_POST['password'] : "";
//二者作用相同
$whitepattern="/^[A-z\d]*$/i";         // 构造的白名单正则表达式,只允许输入的内容是字符串和数字的组合;/d:表示一个十进制的数字 [0-9]
$blackpattern="/\*|'|\"|#|;|,|or|\^|=|<|>|and|`|\(|\)|\ |%/i";// 构造的黑名单正则表达式

if(preg_match($blackpattern, $pusername)){ // preg_match:使用正则表达式对字符串进行正则匹配
    die("<script>alert('illegal input!,用户名中包涵敏感词汇,请重新输入!');location.href='login.html'</script>");//die:先输出内容,然后退出程序。
}
if(!preg_match($whitepattern, $ppassword)){
    die("<script>alert('illegal input!,密码中包涵敏感词汇,请重新输入!');location.href='login.html'</script>");
}

if($conn&&!empty($pusername) && !empty($ppassword)){//建立连接并判断用户名与密码是否为空
    $sql= "select username,password from `users` where username='$pusername' and password='$ppassword'";
    $result=$conn->query($sql);
    $row=mysqli_fetch_array($result);
//array内容赋予$row
    if($pusername==$row['username']&&$ppassword==$row['password']){//$row['username'],输出row数组中,username位置上的内容,并使它与pusername进行比较
        setcookie('username',$pusername,time()+10);
        echo"<script>alert('欢迎登录!$pusername');location.href='index.php'</script>";
//        header("Location:index.php");
        mysqli_close($conn);

    }else{
        echo"<script>alert('用户名或者密码错误,请重新输入!');location.href='login.html'</script>";
    }
}else{
    echo"<script>alert('用户名或者密码不能为空,请重新输入!');location.href='login.html'</script>";
}
漏洞
$sql= "select username,password from `users` where username='$pusername' and password='$ppassword'";
/*此sql语句存在sql注入,可以通过万能密码:1'or'1'='1 使其报错,并展示php所在路径*/
预防(1)
构建正则表达式与敏感字符进行匹配
$whitepattern="/^[A-z\d]*$/i";         // 构造的白名单正则表达式,只允许输入的内容是字符串和数字的组合;/d:表示一个十进制的数字 [0-9]
$blackpattern="/\*|'|\"|#|;|,|or|\^|=|<|>|and|`|\(|\)|\ |%/i";// 构造的黑名单正则表达式

if(preg_match($blackpattern, $pusername)){ // preg_match:使用正则表达式对字符串进行正则匹配
    die("<script>alert('illegal input!,用户名中包涵敏感词汇,请重新输入!');location.href='index.html'</script>");//die:先输出内容,然后退出程序。
}
if(!preg_match($whitepattern, $ppassword)){
    die("<script>alert('illegal input!,密码中包涵敏感词汇,请重新输入!');location.href='index.html'</script>");
}
预防(2)
通过构建php预处理
我这里没有弄明白,就不写了,怕误导别人(我是废物),悲(TvT)

enroll.php(注册)

<?php

$pusername=$_POST["username"];
$ppassword1=$_POST["password1"];
$ppassword2=$_POST["password2"];
if (strlen($pusername) < 1){
    echo '<script type="text/javascript">'; // 输出包含JavaScript的HTML片段
    echo 'alert("username不能为空!");'; // 弹窗提示
    echo 'window.location.href = "enroll.html";'; // 重定向到注册页
    echo '</script>';
    exit();
}
if (strlen($ppassword2&&$ppassword1) < 1) {
    echo '<script type="text/javascript">'; // 输出包含JavaScript的HTML片段
    echo 'alert("password不能为空!");'; // 弹窗提示
    echo 'window.location.href = "enroll.html";'; // 重定向到注册页
    echo '</script>';
    exit();
}
if(strlen($ppassword1==$ppassword2)){
    $ppassword3=$ppassword1;
}else{
    echo '<script type="text/javascript">'; // 输出包含JavaScript的HTML片段
    echo 'alert("两次密码不一样!");'; // 弹窗提示
    echo 'window.location.href = "enroll.html";'; // 重定向到注册页
    echo '</script>';
    exit();
}
isset($_POST['add']);
$sevsername="localhost";
$username="root";
$password="123456";
$dbname="users";

$conn= mysqli_connect($sevsername,$username,$password,$dbname);

$whitepattern="/^[a-z\d]*$/i";         // 构造的白名单正则表达式,只允许输入的内容是字符串和数字的组合
$blackpattern="/\*|'|\"|#|;|,|or|\^|=|<|>|and|`/i";// 构造的黑名单正则表达式

if(preg_match($blackpattern, $pusername)){ // preg_match:使用正则表达式对字符串进行正则匹配
    die("<script>alert('illegal input!,用户名中包涵敏感词汇,请重新输入!');location.href='enroll.html'</script>");
}
if(!preg_match($whitepattern, $ppassword3)){
    die("<script>alert('illegal input!,密码中包涵敏感词汇,请重新输入!');location.href='enroll.html'</script>");
}

//if(!$conn){
//    die("连接失败:<br>".$conn->connect_error);
//}
$sql = "INSERT INTO users (username,password)
VALUES ({$pusername},{$ppassword3})";
if(mysqli_query($conn,$sql))
{
    echo "<script>alert('注册成功,欢迎您$pusername!');location.href='login.html'</script>";
}else{
    echo "<script>alert('注册失败,用户名不合规,请重试!');location.href='enroll.html'</script>";
}
?>

index.php(主页):

​

<?php
if(isset($_COOKIE['username'])){
    echo "帐户信息:<br/>";
    echo "用户名:".$_COOKIE['username']."<br/>";
    echo '<a href="out.php">退出登录</a><br>';
    echo '<a href="floget.html">修改密码</a>';
}else {
    echo '未登入用户不允许访问,<a href="login.html">请登入</a>';
}


​

out.php(登出)

<?php
setcookie("username",time()-3600);//删除cookie
header('Refresh:3; url="login.html"');
echo "<h2>三秒后返回登入页面</h2>";
?>

forget.php(修改密码)

<?php
session_start();
//$root_sevsername="localhost";
//$root_username="root";
//$root_password="123456";
//$root_dbname="users";

//$conn= mysqli_connect($root_sevsername,$root_username,$root_password,$root_dbname);
$conn=mysqli_connect("localhost","root","123456","users");
//获取用户名,旧密码,新密码
$p_username = $_POST['username'];
$p_oldpassword = $_POST['oldpassword'];
$p_nowpassword1 = $_POST['nowpassword1'];
$p_nowpassword2 = $_POST['nowpassword2'];
//判断两次密码是否相等
$p_nowpassword3=0;
if($p_nowpassword1==$p_nowpassword2){
    $p_nowpassword3=$p_nowpassword1;
}else{
    echo "<script>alert('两次新密码输入不一致');location.href='floght.html'</script>";
}
if($p_oldpassword==$p_nowpassword3&&!empty($p_nowpassword3)){
    echo "<script>alert('新旧密码相同');location.href='floght.html'</script>";
}
if(empty($p_oldpassword)||empty($p_nowpassword3)){
    echo "<script>alert('新旧密码不得为空');location.href='floght.html'</script>";
}

$whitepattern="/^[A-z\d]*$/i";         // 构造的白名单正则表达式,只允许输入的内容是字符串和数字的组合;/d:表示一个十进制的数字 [0-9]
$blackpattern="/\*|'|\"|#|;|,|or|\^|=|<|>|and|`|\(|\)|\ |%/i";// 构造的黑名单正则表达式

if(!preg_match($whitepattern, $p_nowpassword3)||preg_match($blackpattern,$p_nowpassword3)){
    die("<script>alert('illegal input!,密码中包涵敏感词汇,请重新输入!');location.href='floght.html'</script>");
}
if(preg_match($blackpattern,$p_username)){
    die("<script>alert('illegal input!,用户名中包涵敏感词汇,请重新输入!');location.href='floght.html'</script>");
}
if(!empty($p_oldpassword)&&!empty($p_nowpassword3)){

    $sql_search = "SELECT password, username FROM `users` WHERE password='$p_oldpassword' AND username='$p_username'";
    $result=$conn->query($sql_search);
    $row=mysqli_fetch_array($result);

    //ps:此处为调试错误使用
//    foreach($row as $key => $value):
//        echo $key."-".$value."<br/>";
//    endforeach;

    //将查询到的数据赋予以数组赋予row
    if ($p_nowpassword3!==$row['password']/*新密码与旧密码不等*/&&$p_username==$row['username']/*判断用户名是否正确*/){
        $sql_write = "UPDATE `users` SET `password` = '$p_nowpassword3' WHERE `users`.`username` = '$p_username'";
        $conn->query($sql_write);//执行sql语句
        echo "<script>alert('修改成功,即将返回登录页');location.href='index.html'</script>";
    }
} else {
        echo "<script>alert('旧密码错误,请重试');location.href='floght.html'</script>";
}