• web安全学习笔记(11)


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

    一、创建MySQL执行函数

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

    1. #SQL查询函数
    2. function Qurey($sql)
    3. {
    4. #连接数据库
    5. $db = @new mysqli('172.20.10.3', 'liuyan', '123456', 'liuyan', 3306);
    6. #判断是否连接成功
    7. if (mysqli_connect_errno() != 0) {
    8. echo 'MySQL连接产生错误';
    9. echo mysqli_connect_error();
    10. }
    11. #执行sql语句
    12. $result = $db->query($sql);
    13. #执行关闭语句
    14. $db->close();
    15. #判断SQL语句中是否包含select,如果包含则输出查询的结果否则直接输出obj数据格式
    16. if (strstr(strtolower($sql), 'select')) {
    17. return $result->fetch_all(MYSQLI_ASSOC);
    18. } else {
    19. return $result;
    20. }
    21. }

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

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

    将登录接口部分改为:

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

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

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

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

    if ($result == FALSE)

    完整代码如下:

    1. require_once("./function.php");
    2. $a = !empty($_GET['a']) ? $_GET['a'] : 'login';
    3. $b = !empty($_GET['b']) ? $_GET['b'] : 'index';
    4. $f = $_SERVER['REQUEST_METHOD'];
    5. switch ($a) {
    6. case 'login':
    7. switch ($b) {
    8. #登录接口:
    9. case 'index':
    10. switch ($f) {
    11. #请求登录页面
    12. case 'GET':
    13. require_once('./template/login.html');
    14. break;
    15. #验证账户密码正确性
    16. case 'POST':
    17. $username = $_POST['username'];
    18. $password = $_POST['password'];
    19. $sql = "SELECT * FROM member WHERE username = '$username' AND password = '$password'";
    20. $result = Qurey($sql);
    21. #end函数取二维数组中取最后一个元素
    22. $result = end($result);
    23. #判断是否查询到了数据
    24. if(empty($result)){
    25. alert('账户密码错误!','./index.php?a=login&b=index');
    26. }
    27. alert('账户登录成功!','./index.php?a=index&b=index');
    28. break;
    29. default:
    30. # code...
    31. break;
    32. }
    33. break;
    34. #注册接口:
    35. case 'reg':
    36. switch ($f) {
    37. #请求登录页面
    38. case 'GET':
    39. require_once('./template/reg.html');
    40. break;
    41. #验证账户密码正确性
    42. case 'POST':
    43. #用户名
    44. $username = $_POST['username'];
    45. #密码
    46. $password1 = $_POST['password1'];
    47. #二次输入密码
    48. $password2 = $_POST['password2'];
    49. #判断两次密码的一致性
    50. if($password1 != $password2){
    51. alert('输入的密码不一致!','');
    52. }
    53. #查询用户信息
    54. $sql = "SELECT * FROM member WHERE username='$username'";
    55. $result = Qurey($sql);
    56. #判断用户名是否已经存在
    57. if(!empty($result)){
    58. alert("注册的账户[$username]已经存在,请更换其他用户名!",'');
    59. }
    60. #添加用户sql语句
    61. $sql = "INSERT INTO member (username,password) VALUES ('$username','$password1')";
    62. #执行sql语句
    63. $result = Qurey($sql);
    64. #判断是否执行成功
    65. if ($result == FALSE){
    66. alert('注册失败!','');
    67. }
    68. #如何将用户名输出到弹窗中?
    69. alert($msg = $username . '注册成功!', $url = './index.php?a=login&b=index');
    70. // die('');
    71. break;
    72. default:
    73. # code...
    74. break;
    75. }
    76. break;
    77. default:
    78. # code...
    79. break;
    80. }
    81. break;
    82. default:
    83. # code...
    84. break;
    85. }

    二、JavaScript基础知识

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

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

    有以下几点需要说明:

    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属性:

    完整代码如下:

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

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

    三、原生态AJAX

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

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

    1. <form method = "post" action="./index.php?a=login&b=reg">
    2. 用户名:<input type = "text" name = "username" id="username"><br><br>
    3. 密 码:<input type = "password" name = "password1" id = "password1" ><br><br>
    4. 再次输入:<input type = "password" name = "password2" id = "password2" ><br><br>
    5. <input type = "submit" onclick="CheckPassword" value = "立即注册">
    6. form>
    7. <script>
    8. //检查密码是否一致
    9. function CheckPassword() {
    10. var username = document.getElementById('username').value
    11. var password1 = document.getElementById('password1').value
    12. var password2 = document.getElementById('password2').value
    13. if(password1 != password2){
    14. return alert("两次输入的密码不一致,请检查密码准确性!");
    15. }
    16. var xml = new XMLHttpRequest();
    17. //绑定事件
    18. xml.onreadystatechange=function(){
    19. if (xml.readyState == 4 && xml.status == 200) {
    20. var respText = xml.responseText;
    21. eval(respText);
    22. }
    23. }
    24. xml.open('post','./index.php?a=login&b=reg',false)
    25. xml.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
    26. xml.send('username='+username+'&password1'+password1+'&password2'+password2)
    27. }
    28. script>

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

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

  • 相关阅读:
    高效技巧揭秘:Java轻松批量插入或删除Excel行列操作
    基于51单片机pwm调光护眼台灯智能检测光强光控灯设计proteus仿真原理图PCB
    监控工具普罗米修斯(Prometheus)的介绍与安装
    WebDAV之葫芦儿·派盘+言叶
    2024中国网络安全产品用户调查报告(发布版)
    UGeek大咖说 | 顺丰科技:全链路压测中的可观测性实践
    Vue学习—vuex
    python基础—并发编程
    Juniper SRX UTM: Web Filtering (Local)
    leetcode 阶乘尾数
  • 原文地址:https://blog.csdn.net/m0_58875569/article/details/137886740