web安全学习笔记(11)

记一下第十五节课的内容。

一、创建MySQL执行函数

我们在function.php中,自定义一个函数:

#SQL查询函数
function Qurey($sql)
{#连接数据库$db = @new mysqli('172.20.10.3', 'liuyan', '123456', 'liuyan', 3306);#判断是否连接成功if (mysqli_connect_errno() != 0) {echo 'MySQL连接产生错误';echo mysqli_connect_error();}#执行sql语句$result = $db->query($sql);#执行关闭语句$db->close();#判断SQL语句中是否包含select,如果包含则输出查询的结果否则直接输出obj数据格式if (strstr(strtolower($sql), 'select')) {return $result->fetch_all(MYSQLI_ASSOC);} else {return $result;}
}

这个函数的功能是执行SQL查询。

接下来我们去改写index.php文件。我们这节课做的内容是让登录和注册页面能够和我们的数据库相连接,并进行更贴合实际的注册、登录操作。

将登录接口部分改为:

其中end函数的作用是取二维数组的最后一个元素。因为这里我们只查询到了一个结果,所以使用end函数找到的最后一个元素,实际上就是唯一的那个元素。事实上,查询到的result是一个二维数组,并且这个二维数组的每一个元素又分别是一个键值数组,大致是如下形式(仅为示例):

这样我们就成功地将前端页面和数据库链接到了一起,通过判断数据库中是否存在我们的用户信息以及验证其正确性来判断是否能成功登陆。

接下来我们修改注册接口部分:

因为注册时涉及判断两次输入的密码是否一致、用户名是否已经存在等问题,在代码上实现起来比较繁琐,但是逻辑上是比较容易接受的。而需要注意的是,在判断是否执行成功时,此时我们执行的是insert语句,所以执行的结果只有成功(TRUE)和失败(FALSE),因此下面的判断才写了

if ($result == FALSE)

完整代码如下:

<?php
require_once("./function.php");
$a = !empty($_GET['a']) ? $_GET['a'] : 'login';$b = !empty($_GET['b']) ? $_GET['b'] : 'index';$f = $_SERVER['REQUEST_METHOD'];
switch ($a) {case 'login':switch ($b) {#登录接口:case 'index':switch ($f) {#请求登录页面case 'GET':require_once('./template/login.html');break;#验证账户密码正确性case 'POST':$username = $_POST['username'];$password = $_POST['password'];$sql = "SELECT * FROM member WHERE username = '$username' AND password = '$password'";$result = Qurey($sql);#end函数取二维数组中取最后一个元素$result = end($result);#判断是否查询到了数据if(empty($result)){alert('账户密码错误!','./index.php?a=login&b=index');}alert('账户登录成功!','./index.php?a=index&b=index');break;default:# code...break;}break;#注册接口:case 'reg':switch ($f) {#请求登录页面case 'GET':require_once('./template/reg.html');break;#验证账户密码正确性case 'POST':#用户名$username = $_POST['username'];#密码$password1 = $_POST['password1'];#二次输入密码$password2 = $_POST['password2'];#判断两次密码的一致性if($password1 != $password2){alert('输入的密码不一致!','');}#查询用户信息$sql = "SELECT * FROM member WHERE username='$username'";$result = Qurey($sql);#判断用户名是否已经存在if(!empty($result)){alert("注册的账户[$username]已经存在,请更换其他用户名!",'');}#添加用户sql语句$sql = "INSERT INTO member (username,password) VALUES ('$username','$password1')";#执行sql语句$result = Qurey($sql);#判断是否执行成功if ($result == FALSE){alert('注册失败!','');}#如何将用户名输出到弹窗中?alert($msg = $username . '注册成功!', $url = './index.php?a=login&b=index');// die('<script>alert("'.$username.'注册成功!");location.href="./index.php?a=login&b=index"</script>');break;default:# code...break;}break;default:# code...break;}break;default:# code...break;
}

二、JavaScript基础知识

我们还可以在前端实现检查两次密码是否一致的判断,我们修改reg.html:

首先自定义一个函数,这里使用的就是JavaScript语言:

<script>
//检查密码是否一致
function CheckPassword(params) {var password1 = document.getElementById('password1').valuevar password2 = document.getElementById('password2').valueif(password1 != password2){return alert("两次输入的密码不一致,请检查密码准确性!")}
}
</script>

有以下几点需要说明:

1.JavaScript中声明变量要使用关键字var

2.这里的alert函数是JavaScript自带的函数,要注意和前面我们自定义的alert函数区分开

3.document节点是文档的根节点,每张网页都有自己的document节点。window.document属性就指向这个节点。也就是说,只要浏览器开始载入HTML文档,这个节点对象就存在了,可以直接调用。而getElementById方法返回匹配指定ID属性的元素节点。如果没有发现匹配的节点,则返回null。注意,在搜索匹配节点时,id属性是大小写敏感的。比如,如果某个节点的id属性是main,那么document.getElementById("Main")将返回null,而不是指定节点。以上引用于JavaScript核心之Document对象详解(document属性,方法)_javascript document-CSDN博客

此外,我们还需要进行如下修改,对“密码”和“再次输入”栏添加id属性,以及对“立即注册”按钮添加onclick属性:

完整代码如下:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<form method = "post" action="http://172.20.10.3/index.php?a=login&b=reg">用户名:<input type = "text" name = "username" value="admin"><br><br>密  码:<input type = "password" name = "password1" id = "password1" value="123456"><br><br>再次输入:<input type = "password" name = "password2" id = "password2" value="123456"><br><br><input type = "submit" onclick="CheckPassword" value = "立即注册">
</form><script>
//检查密码是否一致
function CheckPassword(params) {var password1 = document.getElementById('password1').valuevar password2 = document.getElementById('password2').valueif(password1 != password2){return alert("两次输入的密码不一致,请检查密码准确性!")}
}
</script>

但是,虽然我们在前端判断密码是否一致,若不一致就不会成功注册,但是这样仍然会提交表单信息,这是因为form表单会自动提交数据包。

三、原生态AJAX

我们注意到,如果我们在注册时不小心填错了密码,那么在弹窗提示错误之后,返回注册页面时,我们发现原来填写的数据就已经消失了,造成了不便利。

我们把reg.html改为以下内容:


<form method = "post" action="./index.php?a=login&b=reg">用户名:<input type = "text" name = "username" id="username"><br><br>密  码:<input type = "password" name = "password1" id = "password1" ><br><br>再次输入:<input type = "password" name = "password2" id = "password2" ><br><br><input type = "submit" onclick="CheckPassword" value = "立即注册">
</form><script>
//检查密码是否一致
function CheckPassword() {var username = document.getElementById('username').valuevar password1 = document.getElementById('password1').valuevar password2 = document.getElementById('password2').valueif(password1 != password2){return alert("两次输入的密码不一致,请检查密码准确性!");}var xml = new XMLHttpRequest();//绑定事件xml.onreadystatechange=function(){if (xml.readyState == 4 && xml.status == 200) {var respText = xml.responseText;eval(respText);}}xml.open('post','./index.php?a=login&b=reg',false)xml.setRequestHeader('Content-Type','application/x-www-form-urlencoded')xml.send('username='+username+'&password1'+password1+'&password2'+password2)
}
</script>

这样仍旧解决不了问题,不会,不学了。有空再看吧。

玩转原生态AJAX_ajax原生态-CSDN博客

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

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

相关文章

redis的数据结构报错

文章目录 redis的数据结构报错Redis使用LocalDateTime报错问题 redis的数据结构报错 Redis使用LocalDateTime报错问题 SpringBoot整合Redis时&#xff0c;使用LocalDate以下报错 org.springframework.data.redis.serializer.SerializationException: Could not read JSON: C…

(八)Pandas窗口数据与数据读写 学习简要笔记 #Python #CDA学习打卡

一. 窗口数据(Window Functions) Pandas提供了窗口函数(Window Functions)用于在数据上执行滑动窗口操作&#xff0c;可以对数据进行滚动计算、滑动统计等操作。需要注意的是&#xff0c;在使用窗口函数时&#xff0c;需要根据实际需求选择合适的窗口大小和窗口函数&#xff0…

大数据------额外插件及技术------Git(完整知识点汇总)

Git 定义 它是分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;如&#xff1a;Java类、xml文件、html页面等&#xff09;&#xff0c;在软件开发过程中被广泛应用 作用 代码回溯&#xff1a;快速回到某一代码历史版本版本切换&#xff1a;同一个…

【嵌入式开发】SecureCRTPortable工具进行串口信息监听打印

SecureCRTPortable工具进行串口信息监听打印 一、什么是SecureCRT二、如何使用SecureCRT进行串口监听1、硬件连接2、驱动安装3、软件连接4、串口连接5、日志设置 近期发现许多小伙伴欠缺SSH工具使用基础&#xff0c;工欲善其事&#xff0c;必先利其器&#xff0c;这里奉上使用教…

股票战法课程之主力的痕迹

文章目录 1. 主力的操作痕迹2. 主力的建仓2.1 建仓的三种方式2.2 建仓的五个特点2.3 建仓的迹象2.4 建仓的成交量特征 1. 主力的操作痕迹 序号痕迹原因1不跟随大盘节奏筹码都在主力手中2突发利空消息&#xff0c;股价不跌反涨主力被套&#xff0c;不希望散户抛盘3很小的成交量…

【Spring】Spring MVC入门

Spring MVC入门 一、什么是Spring Web MVC&#xff1f; 1.1 MVC定义 MVC是Model View Controller的缩写&#xff0c;是一种软件架构的设计模式&#xff0c;将软件系统分为模型、视图、控制器三个部分。 示意图如下: 可以看到&#xff0c;Controller作为一个“粘合剂”处于M…

Go 单元测试之mock接口测试

文章目录 一、gomock 工具介绍二、安装三、使用3.1 指定三个参数3.2 使用命令为接口生成 mock 实现3.3 使用make 命令封装处理mock 四、接口单元测试步骤三、小黄书Service层单元测试四、flags五、打桩&#xff08;stub&#xff09;参数 六、总结6.1 测试用例定义6.2 设计测试用…

详细分析Mysql常用函数(附Demo)

目录 前言1. 聚合函数2. 字符串函数3. 日期函数4. 条件函数5. 数值函数6. 类型转换函数 前言 由于实战中经常运用&#xff0c;索性来一个总结文 创建一个名为 employees 的表&#xff0c;包含以下字段&#xff1a; employee_id&#xff1a;员工ID&#xff0c;整数类型 first…

Linux的图形资源及指令

一、火车 1.切换到超级用户 su 2.下载资源 yum install -y sl 3.输入指令 sl&#xff0c;得到火车图形 如果没有得到该图形&#xff0c;就将2处改为yum install -y epel-release。 二、Linux的logo 1.在超级用户模式下下载资源 yum install -y linux_logo 2.输…

物联网(iot)深度解析——FMEA软件

物联网即IoT&#xff0c;是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置与技术&#xff0c;实时采集任何需要监控、连接、互动的物体或过程&#xff0c;采集其声、光、热、电、力学、化学、生物、位置等各种需要的信息&#xff0c;通过…

C语言——字符函数与字符串函数

正文开始&#xff1a;在编程过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便操作字符和字符串&#xff0c;C语⾔标准库中提供了 一系列库函数&#xff0c;接下来我们就学习⼀下这些函数。 1. 字符分类函数 C语⾔中有⼀系列的函数是专门做字符分类的&#…

android远程更新下载apk

最近业务有涉及到&#xff0c;奈何是个app代码小白&#xff0c;遂记录一下 一&#xff1a;AndroidManifest.xml文件配置 application标签里面加上 android:networkSecurityConfig"xml/network_config" <!-- app下载更新配置--> <uses-permission andr…

【Qt 学习笔记】Qt常用控件 | 显示类控件Progress Bar的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件Progress Bar的使用及说明 文章编号&#xff…

网络防火墙技术知多少?了解如何保护您的网络安全

在当前以网络为核心的世界中&#xff0c;网络安全成为了至关重要的议题。网络防火墙是一种常见的保护网络安全的技术&#xff0c;用于监控和控制网络流量&#xff0c;阻止未经授权的访问和恶意活动。今天德迅云安全就带您了解下防火墙的一些相关功能和类型。 防火墙的五个功能…

(助力国赛)数学建模可视化!!!含代码1(折线图、地图(点)、地图(线)、地图(多边形)、地图(密度)、环形图、环形柱状图、局部放大图)

众所周知&#xff0c;数学建模的过程中&#xff0c;将复杂的数据和模型结果通过可视化图形呈现出来&#xff0c;不仅能够帮助我们更深入地理解问题&#xff0c;还能够有效地向评委展示我们的研究成果。   今天&#xff0c;作者将与大家分享8种强大的数学建模可视化图形及其在…

.Net RabbitMQ(消息队列)

文章目录 一.RabbitMQ 介绍以及工作模式1.RabbitMQ的介绍&#xff1a;2.RabbitMQ的工作模式&#xff1a; 二.RabbitMQ安装1.安装Erlang语言环境2.安装RabbitMQ 三.在.Net中使用RabbitMQ1.HelloWorld模式2.工作队列模式3.发布订阅模式4.Routing路由模式和Topics通配符模式 一.Ra…

使用Python工具库SnowNLP对评论数据标注(二)

这一次用pandas处理csv文件 comments.csv import pandas as pd from snownlp import SnowNLPdf pd.read_csv("C:\\Users\\zhour\\Documents\\comments.csv")#{a: [1, 2, 3], b: [4, 5, 6], c: [7, 8, 9]}是个字典 emotions[] for txt in df[sentence]:s SnowNLP(…

Kali Linux扩容(使用图形化界面)

因为今天在拉取vulhub中的镜像的时候报错空间不够&#xff0c;因为最开始只给了20GB的空间&#xff0c;所以现在需要扩容了&#xff0c;结合了一下网上的找到了简便的解决方法 1.首先虚拟机设置->磁盘->扩展 小插曲&#xff1a;在对虚拟机磁盘进行扩容以后&#xff0c;…

linux启动minicom、u-boot的常用命令、网络命令tftp、nfs/根文件系统、u-boot的bootargs环境变量

linux启动minicom sudo minicom -con进入minicom界面&#xff1a; 打开单片机 在打开之后&#xff0c;我们通过 printenv查看环境配置 在修改配置之前&#xff0c;我们最好先将环境初始化一下&#xff0c;初始化代码为 nand erase.chipu-boot的常用命令 尽管u-boot是一个…

ObjectMapper解析JSON数据

ObjectMapper的作用 1.背景&#xff1a; 当我们调用API的时候捕获的数据&#xff0c;往往需要结合文档所定义的类进行转换&#xff0c;也就是Java对象与JSON 字符串之间的转换 2.作用&#xff1a; ObjectMapper 是 Jackson 库中的一个关键类&#xff0c;它的作用是将 JSON 数据…