【PHP】系统的登录和注册

一、为什么要学习系统的登录和注册

系统的登录和注册可能存在多种漏洞,这些漏洞可能被恶意攻击者利用,从而对用户的安全和隐私构成威胁。通过学习系统的登录和注册理解整个登录和注册的逻辑方便后续更好站在开发的角度思考问题发现漏洞。以下是一些常见登录和注册可能出现的漏洞:

  1. 逻辑漏洞
    • 返回凭证泄露:在找回密码等功能中,验证码或其他敏感信息可能直接显示在URL、页面源码或网络请求中,攻击者可以通过这些方式获取并利用这些信息。
    • 暴力破解:如果登录系统没有有效的验证机制,如验证码、错误次数限制等,攻击者可以使用暴力破解方法尝试登录,并通过不断的尝试猜解用户密码。
    • 验证码绕过:某些系统中,验证码的验证逻辑可能存在缺陷,使得攻击者可以在不知道验证码的情况下绕过验证,直接进行登录尝试。
    • 短信轰炸:如果系统在发送短信验证码时未对发送数量进行限制,攻击者可以利用这一漏洞对目标手机号进行短信轰炸,导致用户骚扰和经济损失。
    • Session覆盖:攻击者可能通过伪造请求来覆盖用户Session,从而获取其他用户的会话和权限。
    • Cookie伪造:通过修改Cookie中的参数,攻击者可以尝试冒充其他用户登录系统。
  2. 任意用户注册
    • 未验证邮箱/手机号:攻击者可以填写未验证的邮箱或手机号进行注册,可能导致一个邮箱或手机号对应多个账户,增加用户混淆和安全风险。
    • 批量注册:缺乏有效的验证机制可能导致攻击者批量注册账号,用于发送垃圾邮件、进行DOS攻击等恶意行为。
    • 个人信息虚假伪造:在一些需要填写身份证信息的注册环节中,攻击者可以伪造身份证信息进行注册,绕过防沉迷系统等安全措施。
    • 前端验证审核绕过:通过篡改服务器响应或利用验证码机制的缺陷,攻击者可以绕过前端验证进行注册。
    • 用户名覆盖:如果系统允许新用户注册已被其他用户使用的用户名,可能导致老用户的用户名被覆盖,从而泄露或篡改用户信息。
  3. 密码重置漏洞
    • 短信验证码爆破:攻击者可以尝试爆破短信验证码,从而重置其他用户的密码。
    • 验证码和手机号不匹配:攻击者可以使用自己的手机号接收的验证码重置其他用户的密码,这是因为系统没有严格验证手机号和验证码的匹配性。
    • 平行越权:在某些系统中,用户登录后可以更改自己的密码,但如果没有严格验证用户身份,攻击者可以通过修改请求参数来重置其他用户的密码。

二、使用表单的方式进行登录

1.前端页面代码

文件名称:login.html

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登录页面</title><script type="text/javascript" src="./jquery-3.7.1.min.js"></script><style>body {font-family: Arial, sans-serif;background-color: #f0f2f5;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.login-container {background-color: #fff;border-radius: 5px;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);width: 400px;padding: 30px;}.login-container h1 {text-align: center;margin-bottom: 30px;}.form-group {margin-bottom: 15px;}.form-group label {display: block;margin-bottom: 5px;}.form-group input {width: 100%;padding: 10px;border: 1px solid #ccc;border-radius: 3px;}.submit-btn {width: 100%;padding: 10px;background-color: #007bff;color: #fff;border: none;border-radius: 3px;cursor: pointer;}</style>
</head>
<body><div class="login-container"><h1>登录</h1><form action="login.php" method="post" ><div class="form-group"><label for="username">用户名</label><input type="text" id="username" placeholder="请输入用户名" name="username"></div><div class="form-group"><label for="password">密码</label><input type="password" id="password" placeholder="请输入密码" name="password"></div><input type="submit" value="登录" class="submit-btn"></form></div>
</body>
</html>

2.构造数据库

  • 创建数据库learn
create database learn;
  • 创建user表
create table user(id int,name varchar(30),password varchar(30));
  • 构造数据
insert into user values(1,'zs','123456');
insert into user values(2,'ls','123123');
insert into user values(3,'ww','456456');

3.后端代码

文件名称:login.php

<?php
$username = $_POST['username'];
$password = $_POST['password'];$conn = mysqli_connect('127.0.0.1','root','root','learn') or die('数据库连接失败');
$sql = "select * from user where name='$username' and password='$password'";
$result = mysqli_query($conn,$sql);
if (mysqli_num_rows($result) == 1){echo 'login-sucess';
}else{echo 'login-fail';
}?>

三、使用ajax的方式进行登录

1.前端代码

文件名称:login_ajax.html

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登录页面</title><script type="text/javascript" src="./jquery-3.7.1.min.js"></script><script>function do_post(){var username = $("#username").val();var password = $("#password").val();var param = "username=" + username +"&password=" + password;$.post('login_ajax.php',param,function(data){//window.alert(data);if (data == 'login_success'){window.alert('登录成功');}else{window.alert('登录失败');}});}</script><style>body {font-family: Arial, sans-serif;background-color: #f0f2f5;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.login-container {background-color: #fff;border-radius: 5px;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);width: 400px;padding: 30px;}.login-container h1 {text-align: center;margin-bottom: 30px;}.form-group {margin-bottom: 15px;}.form-group label {display: block;margin-bottom: 5px;}.form-group input {width: 100%;padding: 10px;border: 1px solid #ccc;border-radius: 3px;}.submit-btn {width: 100%;padding: 10px;background-color: #007bff;color: #fff;border: none;border-radius: 3px;cursor: pointer;}</style>
</head>
<body><div class="login-container"><h1>登录</h1><div class="form-group"><label for="username">用户名</label><input type="text" id="username" placeholder="请输入用户名" name="username"></div><div class="form-group"><label for="password">密码</label><input type="password" id="password" placeholder="请输入密码" name="password"></div><input type="submit" value="登录" class="submit-btn" onclick="do_post()"></div>
</body>
</html>

2.后端代码

文件名称:login_ajax.php

<?php
$username = $_POST['username'];
$password = $_POST['password'];$conn = mysqli_connect('127.0.0.1','root','root','learn') or die('数据库连接失败');
$sql = "select * from user where name='$username' and password='$password'";
$result = mysqli_query($conn,$sql);
if (mysqli_num_rows($result) == 1){echo 'login_success';
}else{echo 'login_fail';
}?>

四、使用表单的方式提交注册

构造数据库,数据库名为learn,有一个user表,表里有name、password、user_head、create_time字段。

1.前端代码

文件名称:reg.html

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>注册</title><script type="text/javascript" src="./jquery-3.7.1.min.js"></script><style>body {font-family: Arial, sans-serif;background-color: #f0f2f5;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.login-container {background-color: #fff;border-radius: 5px;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);width: 400px;padding: 30px;}.login-container h1 {text-align: center;margin-bottom: 30px;}.form-group {margin-bottom: 15px;}.form-group label {display: block;margin-bottom: 5px;}.form-group input {width: 100%;padding: 10px;border: 1px solid #ccc;border-radius: 3px;}.submit-btn {width: 100%;padding: 10px;background-color: #007bff;color: #fff;border: none;border-radius: 3px;cursor: pointer;}</style>
</head>
<body><div class="login-container"><h1>注册</h1><form action="reg.php" method="post" enctype="multipart/form-data"><div class="form-group"><label for="username">用户名</label><input type="text" id="username" placeholder="请输入用户名" name="username"></div><div class="form-group"><label for="password">密码</label><input type="password" id="password" placeholder="请输入密码" name="password"></div><div class="form-group"><label for="again_password">再次输入密码</label><input type="password" id="again_password" placeholder="重新输入密码" name="again_password"></div><div class="form-group"><label for="user_head"> </label><input type="file" name="user_head" ></div><input type="submit" value="提交" class="submit-btn"></form></div>
</body>
</html>

2.后端代码

文件名称:reg.php

<?php
error_reporting(E_ALL & ~E_NOTICE); //屏蔽notic报告
//设置北京时间作为时区
date_default_timezone_set("PRC");
$username = $_POST['username'];
$password = $_POST['password'];
$again_password = $_POST['again_password'];
$tmp_path = $_FILES['user_head']['tmp_name']; //获取文件临时路径
$file_name = $_FILES['user_head']['name']; //获取文件的原始文件名#echo $tmp_path;
#echo $file_name;
if ($password == $again_password){$conn = mysqli_connect('127.0.0.1','root','root','learn') or die('数据库连接失败');$sql = "select * from user where name='$username' ";$result = mysqli_query($conn,$sql);if (mysqli_num_rows($result) == 1){echo 'user-esxit';}else{//echo end(explode(".",$file_name));$new_name = date('Ymd_His.') . end(explode(".",$file_name));// echo $new_name;move_uploaded_file($tmp_path,'./upload/'.$new_name) or die('upload_fail');$now = date('Y-m-d H:i:s');#echo $now;$sql = "insert into user (name,password,user_head,create_time) values('$username','$password','$new_name','$now')";#echo $sql;mysqli_query($conn,$sql) or die('reg_fail');echo 'reg_success';mysqli_close($conn);}}else{die('two secret is no same');
}?>

五、使用ajax的方式提交注册

1.前端代码

文件名称:reg_ajax.html

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>注册</title><script type="text/javascript" src="./jquery-3.7.1.min.js"></script><style>body {font-family: Arial, sans-serif;background-color: #f0f2f5;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.login-container {background-color: #fff;border-radius: 5px;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);width: 400px;padding: 30px;}.login-container h1 {text-align: center;margin-bottom: 30px;}.form-group {margin-bottom: 15px;}.form-group label {display: block;margin-bottom: 5px;}.form-group input {width: 100%;padding: 10px;border: 1px solid #ccc;border-radius: 3px;}.submit-btn {width: 100%;padding: 10px;background-color: #007bff;color: #fff;border: none;border-radius: 3px;cursor: pointer;}</style><script>function do_reg(){var username = $("#username").val();var password = $("#password").val();var again_password = $("#again_password").val();var data = new FormData(); //带附件上传data.append("username", username);data.append("password", password);data.append("again_password", again_password);data.append("user_head", $("#user_head").prop("files")[0]);$.ajax({url:'reg.php',type:'POST',data: data,cache: false,processData: false,contentType: false,success : function(data){if (data === 'reg-reg_success') {window.alert("注册成功");location.href="login_ajax.html";}else if (data === 'user_esxit') {window.alert("用户名已经注册");}else {window.alert(data);// window.alert("注册失败");}}});}</script>
</head>
<body><div class="login-container"><h1>注册</h1><div class="form-group"><label for="username">用户名</label><input type="text" id="username" placeholder="请输入用户名" ></div><div class="form-group"><label for="password">密码</label><input type="password" id="password" placeholder="请输入密码" ></div><div class="form-group"><label for="again_password">再次输入密码</label><input type="password" id="again_password" placeholder="重新输入密码" ></div><div class="form-group"><label for="user_head"> </label><input type="file" id="user_head"  ></div><input type="submit" value="提交" class="submit-btn" onclick="do_reg()"></div>
</body>
</html>

2.后端代码

文件名称:reg_ajax.php

<?php
//设置北京时间作为时区
date_default_timezone_set("PRC");
$username = $_POST['username'];
$password = $_POST['password'];
$again_password = $_POST['again_password'];
$tmp_path = $_FILES['user_head']['tmp_name']; //获取文件临时路径
$file_name = $_FILES['user_head']['name']; //获取文件的原始文件名error_reporting(E_ALL & ~E_NOTICE); //屏蔽notic报告
#echo $file_name;
if ($password == $again_password){$conn = mysqli_connect('127.0.0.1','root','root','learn') or die('数据库连接失败');$sql = "select * from user where name='$username' ";$result = mysqli_query($conn,$sql);if (mysqli_num_rows($result) == 1){echo 'user_esxit';}else{$file_extend = explode(".", $file_name);//echo end(explode(".",$file_name));$new_name = date('Ymd_His.') . end($file_extend);move_uploaded_file($tmp_path,'./upload/'.$new_name) or die('upload_fail');$now = date('Y-m-d H:i:s');#echo $now;$sql = "insert into user (name,password,user_head,create_time) values('$username','$password','$new_name','$now')";#echo $sql;mysqli_query($conn,$sql) or die('reg_fail');echo 'reg_success';mysqli_close($conn);}}else{die('two secret is no same');
}?>

每篇一言:我要做一颗星星,有棱有角,还会发光。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/50431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux取消U盘自动挂载

Ubuntu 或其他GNOME桌面环境 打开“设置”&#xff1a; 点击桌面右上角的系统菜单&#xff0c;然后点击“设置”。 找到“可移动媒体”&#xff1a; 在设置窗口中&#xff0c;点击左侧的“可移动媒体”选项&#xff08;有些版本中&#xff0c;这个选项可能在“设备”或“文件”…

Husky 入门

Husky 是一个流行的 Node.js 工具&#xff0c;用于管理 Git 钩子。Git 钩子是在特定 Git 操作&#xff08;如提交、推送等&#xff09;发生时自动触发的脚本。Husky 允许你轻松地为你的项目添加这些钩子&#xff0c;以便在代码提交或推送之前自动执行检查、测试或其他任务。 安…

Eslint从安装到Vue项目配置

ESLint是一个静态代码分析工具&#xff0c;用于识别JavaScript代码中的模式&#xff0c;帮助开发者发现并修复代码中的问题。以下是从安装到在Vue 2项目中整合使用ESLint的详细步骤&#xff1a; 一、ESLint的安装 1. 全局安装&#xff08;可选&#xff09; 虽然全局安装ESLi…

JDK 21 中的虚拟线程与 Future

在 JDK 21 中&#xff0c;虚拟线程与 Future 的结合为异步编程提供了更强大和高效的解决方案。 Future 代表了异步计算的结果&#xff0c;通过它可以获取计算的状态和最终的结果。当与虚拟线程一起使用时&#xff0c;可以更灵活地管理和协调异步任务。 例如&#xff0c;在一个数…

C++第二十七弹---优先级队列的高级应用:结合仿函数优化性能

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1 priority_queue的介绍和使用 1.1 priority_queue的介绍 1.2 priority_queue的使用 2 仿函数的介绍和使用 2.1 仿函数的介绍 2.2 仿函数的…

Python升级打怪—Django入门

目录 一、Django简介 二、安装Django 三、创建Dajngo项目 (一) 创建项目 (二) 项目结构介绍 (三) 运行项目 (四) 结果 一、Django简介 Django是一个高级Python web框架&#xff0c;鼓励快速开发和干净、实用的设计。由经验丰富的开发人员构建&#xff0c;它解决了web开…

【文件fd】文件描述符fd | 文件描述表

目录 1.文件描述符fd 2.系统调用的0/1/2 3.C语言的stdin/stdout/stderr 4.系统调用的0/1/2和C语言的stdin/stout/stderr二者的关系❓ 5.文件描述表 5.1 文件描述符概念 5.3 文件对象strcut file 5.4 进程和文件对应关系 5.5 文件描述符理解 5.6 源码查看 1.文件描述…

谷粒商城实战笔记-55-商品服务-API-三级分类-修改-拖拽数据收集

文章目录 一&#xff0c;拖拽后结点的parentCid的更新二&#xff0c;拖拽后结点的父节点下所有结点的sort排序属性的变化更新排序的逻辑代码分析 三&#xff0c;拖拽后结点及其子节点catLevel的变化判断是否需要更新 catLevel获取拖动后的新节点 更新 catLevel完整代码 这一节的…

mysql特殊字符、生僻字存储设置

mysql utf-8模式下&#xff0c;分为ut8mb3,utf8mb4&#xff0c;mb4是支持特殊字符、emoji表情的&#xff0c;mb3是不支持的。 报错信息&#xff1a; 1### Error updating database. Cause: java.sql.SQLException: Incorrect string value: \xF0\xA8\x92\x82\xE6\x95... fo…

MongoDB教程(二十):MongoDB正则表达式

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、正则表…

【ESP32 idf 硬件I2C驱动MPU6050获取六轴数值】

目录 I2C介绍配置安装驱动通信创建&删除命令链接容器起始时序写数据读数据结束时序开始命令 mpu6050 硬件i2c驱动代码&调试代码调试 I2C 介绍 介绍部分可以看我写的【ESP32 idf 软件模拟I2C驱动MPU6050实现六轴加速度的获取】&#xff0c;这个是使用软件模拟的I2C时序…

python在类中手动定义标准化输出函数

在深度学习等训练框架中&#xff0c;有时候需要对模型的名称、参数量、训练进度、中间结果等进行标准化输出&#xff0c;从而方便实时查看代码运行情况&#xff0c;这时&#xff0c;可以在类中手动定义如下标准化的输出函数&#xff0c;然后在需要输出的地方进行调用即可。 首…

鸿蒙北向开发 DevEco Studio 4.1 下载安装傻瓜式教程

开篇 由于鸿蒙处于快速发展中,鸿蒙的api快速迭代更新,老版本的DevEco studio无法支持更新版本的api,因此华为官网放弃了老版本的维护.直接从华为开发者官网无法下载老版本,当前华为开发者官网已经推出next版本了 DevEco studio3.1安装教程 上述教程提供的华为开发者官网地址已经…

分布式事务-基本信息

文章目录 前言分布式事务-基本信息1. 两阶段提交&#xff08;2PC&#xff09;2. 三阶段提交&#xff08;3PC&#xff09;3. TCC模式4. 可靠消息最终一致性5. 优缺点与应用场景5.1. 两阶段提交&#xff08;2PC&#xff09;5.2. 三阶段提交&#xff08;3PC&#xff09;5.3. TCC模…

*算法训练(leetcode)第三十一天 | 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

刷题记录 *1049. 最后一块石头的重量 II*494. 目标和474. 一和零 *1049. 最后一块石头的重量 II leetcode题目地址 本题与分割等和子集类似&#xff0c;要达到碰撞最后的石头重量最小&#xff0c;则尽可能把石头等分为两堆。 时间复杂度&#xff1a; O ( m ∗ n ) O(m * n)…

【ffmpeg命令入门】视频的旋转与翻转

文章目录 前言什么时候需要使用旋转与翻转1. 视频拍摄方向不正确2. 视频编辑特效使用什么参数1. 旋转视频 - transpose2. 水平翻转视频 - hflip3. 垂直翻转视频 - vflip 总结 前言 在视频编辑的过程中&#xff0c;我们经常会遇到需要旋转或翻转视频的情况。无论是因为拍摄时相…

如何在Ubuntu20.04上安装adb和fastboot

如何在Ubuntu20.04上安装adb和fastboot 步骤1.首先&#xff0c;通过apt在终端中运行以下以下命令&#xff0c;确保所有系统软件包都是最新的。 sudo apt update sudo apt upgrade 步骤2.在Ubuntu 20.04上安装ADB和Fastboot。 运行以下命令以在Ubuntu系统上安装ADB Fastboot二进…

linux怎么创建python

第一步&#xff0c;创建一个test文件夹。 第二步&#xff0c;打开终端进入该文件。 第三步&#xff0c;vim test.py。 第四步&#xff0c;编写代码。 第五步&#xff0c;编辑好之后&#xff0c;按Esc键切换到命令模式&#xff0c;然后输入:wq&#xff0c;再按回车键即可自动保存…

探索 SPL-404 协议标准:NFT 与 DeFi 的融合

在快速发展的数字资产领域中&#xff0c;NFT 协议标准持续演变&#xff0c;改变了我们对数字所有权和互动方式的理解。从 Art 到 Gamefi 等等&#xff0c;NFT 已经演变成数字经济的重要组成部分&#xff0c;吸引了广泛关注。遵循 ERC404 协议&#xff0c;SPL404 概念在 Solana …

动态预测的艺术:Mojo模型与实时调整的融合

动态预测的艺术&#xff1a;Mojo模型与实时调整的融合 在机器学习领域&#xff0c;模型的推理速度和准确性往往需要在实际应用中不断调整以达到最优状态。Mojo模型&#xff0c;作为ONNX&#xff08;Open Neural Network Exchange&#xff09;的一部分&#xff0c;提供了一种高…