【第28课】安全开发-JS应用&原生开发&JQuery库&Ajax技术&前端后端&安全验证 ...

莱莱  论坛元老 | 2024-10-19 03:09:11 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1023|帖子 1023|积分 3069

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明

  本文发布的工具和脚本,仅用作测试和学习研究,禁止用于商业用途,不能保证其正当性,精确性,完备性和有效性,请根据情况自行判定。
  如果任何单元或个人以为该项目标脚本大概涉嫌侵犯其权利,则应实时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关内容。
  文中所涉及的技术、思路及工具等相关知识仅供安全为目标的学习利用,任何人不得将其应用于非法用途及红利等目标,间接利用文章中的任何工具、思路及技术,我方对于由此引起的法律效果概不负责。
  1. JS知识点:
  2. 功能:登录验证,文件操作,商品购买,数据库操作,云应用接入,框架开发等
  3. 技术:原生开发,DOM树,常见库使用(JQuery),框架开发(Vue,Nodejs)等
  4. 参考:
  5. 1、原生JS教程
  6. https://www.w3school.com.cn/js/index.asp
  7. 2、jQuery库教程
  8. https://www.w3school.com.cn/jquery/index.asp
复制代码

JS原生开发-文件上传-变量&对象&函数&事件

   1 、布置前端页面
  2、JS获取提交数据
  3、JS对上传格式判定
  4、后端对上传数据处理
  前端JS进行后缀过滤,后端PHP进行上传处理
  架构:html js php - upload.php
  安全问题:
  1、过滤代码能看到分析绕过 
  2、禁用JS或删除过滤代码绕过
  upload.html:文件上传交给前端实现
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <title>文件上传页面</title>
  6.   <style>
  7.     body {
  8.       font-family: Arial, sans-serif;
  9.       background-color: #f2f2f2;
  10.       padding: 20px;
  11.     }
  12.     h1 {
  13.       text-align: center;
  14.       margin-top: 50px;
  15.     }
  16.     form {
  17.       background-color: #fff;
  18.       border-radius: 10px;
  19.       padding: 20px;
  20.       margin-top: 30px;
  21.       max-width: 600px;
  22.       margin: 0 auto;
  23.     }
  24.     input[type="file"] {
  25.       margin-top: 20px;
  26.       margin-bottom: 20px;
  27.     }
  28.     button {
  29.       background-color: #4CAF50;
  30.       color: #fff;
  31.       padding: 10px 20px;
  32.       border: none;
  33.       border-radius: 5px;
  34.       cursor: pointer;
  35.     }
  36.     button:hover {
  37.       background-color: #3e8e41;
  38.     }
  39.   </style>
  40. </head>
  41. <body>
  42. <h1>文件上传</h1>
  43. <form action="upload.php" method="POST" enctype="multipart/form-data">
  44.   <label for="file">选择文件:</label>
  45.   <br>
  46.   <input type="file" id="file" name="f" onchange="CheckFileExt(this.value)">
  47.   <br>
  48.   <button type="submit">上传文件</button>
  49. </form>
  50. <script>
  51.   function CheckFileExt(filename){
  52.     var flag=false;
  53.     //规定白名单上传后缀
  54.     var exts=['png','gif','jpg'];
  55.     //1.php 1.php.jpg 接受传递的后缀名
  56.     var index=filename.lastIndexOf(".");
  57.     var ext = filename.substr(index+1);
  58.     //进行后缀检测
  59.     for(i=0;i<exts.length;i++){
  60.       if(ext==exts[i]){
  61.         var flag=true;
  62.         alert('文件后缀正确!');
  63.         break;
  64.       }
  65.     }
  66.     if(!flag){
  67.       alert('文件后缀错误!')
  68.       location.reload(true);
  69.     }
  70.   }
  71.   
  72. </script>
  73. </body>
  74. </html>
复制代码

upload.php:后端处理上传
  1. <?php
  2. $name=$_FILES['f']['name'];
  3. $type=$_FILES['f']['type'];
  4. $size=$_FILES['f']['size'];
  5. $tmp_name=$_FILES['f']['tmp_name'];
  6. $error=$_FILES['f']['error'];
  7. if(move_uploaded_file($tmp_name,'upload/'.$name)){
  8.     echo '<script>alert("上传成功!")</script>';
  9. }
复制代码
<srcipt></script>里面包罗的是JS代码
  1. <input type="file" id="file" name="f" onchange="CheckFileExt(this.value)">
复制代码
这一行代码是一个HTML中的JavaScript事件处理器,用于在文件选择框内容发生变革(用户选择文件)时触发相应的查抄函数。详细来说:


  • onchange: 这是一个HTML事件属性,表示在元素内容变革时触发。
  • CheckFileExt(this.value): 这是一个JavaScript函数调用,当文件选择框内容变革时,会调用名为 CheckFileExt 的函数,并将选择的文件路径(this.value 表示当前元素的值,即文件路径)作为参数转达给该函数。
这段 JavaScript 代码用于获取文件名中末了一个点(.)后面的部分,即文件的扩展名。
  1. var index = filename.lastIndexOf(".")
复制代码
lastIndexOf("."): 这是 JavaScript 字符串对象的方法,用于返回字符串中末了一个出现的点的索引位置。
  1. var ext = filename.substr(index+1);
复制代码
substr(index+1): 这是 JavaScript 字符串对象的方法,用于从字符串的指定位置(在这里是 index+1,即点的后一个位置)开始提取子字符串。这里的 ext 变量将包罗文件的扩展名。
这是一个 JavaScript 代码片段,用于重新加载当前页面。详细来说:
  1. location.reload(true);
复制代码


  • location.reload(true): 这是 JavaScript 的 location 对象的 reload 方法。reload 方法用于重新加载当前文档。转达 true 参数表示强制从服务器重新加载页面,而不利用缓存。如果省略参数或转达 false,则大概利用缓存进行重新加载。
  • 这行代码的作用是强制革新当前页面,确保获取最新的内容,而不利用浏览器缓存。
这里的JS代码是运行在前端,是可以被看到并修改的

禁用JS或删除过滤代码绕过


  • 将页面源代码复制下来,在本地创建,并删除检验代码的函数调用οnchange="CheckFileExt(this.value)”
  • 将调用的文件上传地点,切换为利用网址路由的样式http://192.168.137.1:84/js/upload.php
  • 成功绕过文件检验,上传成功1.exe


php 写的是后端上传验证前端看不到处理逻辑代码,相对 js 比较安全
js 写的上传代码在前端可以被找到,从而可以被多种方法绕过


JS导入库开发-登录验证-JQuery库&Ajax技术

   0 、布置前端页面
  1、获取登录事件
  2、配置Ajax请求
  3、后端代码验证
  4、成功回调判定
  后端PHP进行帐号判定,前端JS进行登录处理
  架构:html js login.html - logincheck.php
  $.ajax()是一个用于执行异步HTTP请求的jQuery函数。它答应您通过JavaScript代码向服务器发送请求,并在不革新整个页面的情况下接收和处理响应
下面是一个根本的$.ajax()用法示例:
  1. $.ajax({
  2.   url: "example.com/data",  // 请求的URL
  3.   method: "GET",            // HTTP请求方法(GET、POST等)
  4.   data: {                   // 发送到服务器的数据(可选)
  5.     param1: "value1",
  6.     param2: "value2"
  7.   },
  8.   success: function(response) {  // 请求成功时的回调函数
  9.     console.log("请求成功!");
  10.     console.log(response);       // 服务器响应的数据
  11.   },
  12.   error: function(xhr, status, error) {  // 请求失败时的回调函数
  13.     console.log("请求失败!");
  14.     console.log(error);                    // 错误信息
  15.   }
  16. });
复制代码

在这个示例中,我们通过url参数指定了服务器的URL,通过method参数指定了HTTP请求方法(这里是GET请求)。data参数是可选的,用于发送到服务器的数据。success回调函数在请求成功而且服务器返反响应时被调用,error回调函数在请求失败时被调用。
您可以根据必要在$.ajax()函数中利用其他参数,例如dataType指定服务器响应的数据类型,headers指定请求头,以及其他高级选项。
通过利用$.ajax()函数,您可以在JavaScript中方便地执行异步HTTP请求,并根据服务器的响应进行相应处理。
$("button").click(function () { ... })选择所有的 <button> 元素,并为它们绑定一个点击事件处理函数。当用户点击任何一个按钮时,绑定的函数将被执行。
我们利用console.log()在控制台输出一条消息,表示按钮已被点击。您还可以执行其他操纵,例如修改页面的内容、发送AJAX请求或执行其他JavaScript逻辑。
  1. $("button").click(function () {
  2.   // 在这里编写点击事件的处理代码
  3.   console.log("按钮被点击了!");
  4.   // 可以在这里执行其他操作,例如修改页面内容或发送AJAX请求等
  5. });
复制代码
$('.user').val()和$('.pass').val()用于获取具有user类和pass类的元素的值。
$('.user'):这里利用了jQuery的选择器$('.user')来选择所有具有user类的元素。这可以是一个输入框、文本框或其他表单元素。
.val():这是一个jQuery函数,用于获取选定元素的值。在这个场景中,它被调用以获取具有user类的元素的值。
myuser:这是一个变量(或属性名),用于存储所选择元素的值。您可以根据必要更改变量名。
  1. myuser: $('.user').val(),
  2. mypass: $('.pass').val()
复制代码
$success 是一个关联数组变量,通过利用 ‘msg’ 作为键,将 ‘ok’ 作为值存储在其中。
  1. $success = array('msg' => 'ok');
复制代码
JS实现登录功能:
login.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <title>后台登录</title>
  6.   <style>
  7.     body {
  8.       background-color: #f1f1f1;
  9.     }
  10.     .login {
  11.       width: 400px;
  12.       margin: 100px auto;
  13.       background-color: #fff;
  14.       border-radius: 5px;
  15.       box-shadow: 0 0 10px rgba(0,0,0,0.3);
  16.       padding: 30px;
  17.     }
  18.     .login h2 {
  19.       text-align: center;
  20.       font-size: 2em;
  21.       margin-bottom: 30px;
  22.     }
  23.     .login label {
  24.       display: block;
  25.       margin-bottom: 20px;
  26.       font-size: 1.2em;
  27.     }
  28.     .login input[type="text"], .login input[type="password"] {
  29.       width: 100%;
  30.       padding: 10px;
  31.       border: 1px solid #ccc;
  32.       border-radius: 5px;
  33.       font-size: 1.2em;
  34.       margin-bottom: 20px;
  35.     }
  36.     .login input[type="submit"] {
  37.       background-color: #2ecc71;
  38.       color: #fff;
  39.       border: none;
  40.       padding: 10px 20px;
  41.       border-radius: 5px;
  42.       font-size: 1.2em;
  43.       cursor: pointer;
  44.     }
  45.     .login input[type="submit"]:hover {
  46.       background-color: #27ae60;
  47.     }
  48.   </style>
  49. </head>
  50. <body>
  51. <div class="login">
  52.   <h2>后台登录</h2>
  53.     <label for="username">用户名:</label>
  54.     <input type="text" name="username" id="username" class="user" >
  55.     <label for="password">密码:</label>
  56.     <input type="password" name="password" id="password" class="pass" >
  57.   <button>登录</button>
  58. </div>
  59. <script src="js/jquery-1.12.4.js"></script>
  60. <script>
  61.   $("button").click(function (){
  62.     $.ajax({
  63.       type: 'POST',
  64.       url: 'logincheck.php',
  65.       data: {
  66.         myuser:$('.user').val(),
  67.         mypass:$('.pass').val()
  68.       },
  69.       success: function (res){
  70.         console.log(res);
  71.         if(res['infoCode']==1){
  72.           alert('登录成功');
  73.           //登录成功处理事件
  74.           //location.href='index.php';
  75.         }else{
  76.           alert('登录失败');
  77.         }
  78.       },
  79.       dataType: 'json',
  80.     });
  81.   });
  82. </script>
  83. </body>
  84. </html>
复制代码

logincheck.php
  1. <?php
  2. $user=$_POST['myuser'];
  3. $pass=$_POST['mypass'];
  4. //真实情况需要在数据库获取
  5. $success=array('msg'=>'ok');
  6. if($user=='xiaodi' && $pass=='123456'){
  7.     $success['infoCode']=1;
  8.     echo '<script>location.href="index.php";</script>';
  9. }else{
  10.     $success['infoCode']=0;
  11. }
  12. echo json_encode($success);
复制代码




安全问题:当成功后的操纵如跳转到其他页面写在js中,不安全。将抓到的包,设置其返回包也抓取,并将访问失败返回包的改为1发送,后登录成功



当成功后的操纵如跳转到其他页面写在PHP中,相对安全
前端js只起到判定作用,无法执行跳转等逻辑
   验证以及验证通过后的处理逻辑写到 php 中是相对 js 比较安全的。
如许纵然攻击者修改了返回包,修改精确的返回字段,仍旧无法跳转。
因为 js 中只进行了登录成功与否的提示,但是无后续处理逻辑,
以是纵然攻击者成功修改返回字段,也无法进行后续操纵
  

JS导入库开发-逻辑购买-JQuery库&Ajax技术

   1 、布置前端页面
  2、获取登录事件
  3、配置Ajax请求
  4、后端代码验证
  5、成功回调判定
  架构:html js shop.html - shopcheck.php
  利用JS实现商品购买

shop.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <!-- 设置文档的字符集为UTF-8 -->
  5.     <meta charset="UTF-8">
  6.     <!-- 设置页面标题 -->
  7.     <title>商品购买</title>
  8. </head>
  9. <body>
  10. <!-- 商品图片 -->
  11. <img src="iphone.jpg" width="300" height="300" alt=""><br>
  12. <!-- 当前拥有的金钱 -->
  13. 金钱:10000<br>
  14. <!-- 商品价格 -->
  15. 商品价格:8888<br>
  16. <!-- 输入购买数量的文本框 -->
  17. 数量:<input type="text" name="number" class="number">
  18. <!-- 购买按钮 -->
  19. <button>购买</button>
  20. </body>
  21. </html>
  22. <!-- 引入 jQuery 库 -->
  23. <script src="js/jquery-1.12.4.js"></script>
  24. <!-- JavaScript 代码 -->
  25. <script>
  26.     // 当购买按钮被点击时执行以下函数
  27.     $("button").click(function (){
  28.         // 使用 AJAX 发送 POST 请求到 'shop.php'
  29.         **$.ajax({
  30.             type: 'POST',
  31.             url: 'shop.php',
  32.             // 发送的数据,包括购买数量
  33.             data: {
  34.                 num: $('.number').val(),
  35.             },
  36.             // 请求成功时执行的函数
  37.             success: function (res){
  38.                 // 在控制台输出返回的数据
  39.                 console.log(res);
  40.                 // 如果返回的信息代码为1,表示购买成功
  41.                 if(res['infoCode'] == 1){
  42.                     // 弹出成功提示
  43.                     alert('购买成功');
  44.                     // 购买成功的流程(你可以在这里添加额外的处理)
  45.                 } else {
  46.                     // 如果信息代码不为1,表示购买失败
  47.                     // 弹出失败提示
  48.                     alert('购买失败');
  49.                 }
  50.             },
  51.             // 指定返回的数据类型为 JSON
  52.             dataType: 'json',
  53.         });
  54.     });
  55. </script>
复制代码

shop.php
  1. <?php// 从 POST 请求中获取购买数目$num = $_POST['num']; // 假设购物车中已有的金钱数为10000,商品代价为8888// 真真相况下,应该在数据库中获取用户的金钱数等信息 // 初始化一个关联数组变量,通过利用 'msg' 作为键,将 'ok' 作为值存储在其中。$success = array('msg' => 'ok');
  2. **// 查抄购买是否正当(金钱是否充足支付)if (10000 >= ($num * 8888)) {    // 如果购买正当,设置信息代码为1表示购买成功    $success['infoCode'] = 1;} else {    // 如果购买不正当,设置信息代码为0表示购买失败    $success['infoCode'] = 0;} // 将效果以 JSON 格式输出echo json_encode($success);**?>
复制代码

如果购买量大于持有金额,就会提示失败

安全性:将抓到的包,设置其返回包也抓取,并将访问失败返回包的改为1发送,后购买成功。
当成功后的操纵如购买成功后的逻辑到其他页面写在js中,不安全




实例测试-某违规APP-密码找回&JS验证逻辑安全

利用福利期货为实行对象,先开启抓包获取到精确的验证嘛回显效果

 ​​​​​


再次点击忘记密码,验证码可以乱输,将返回的错误验证码回显数据,修改为刚刚记载的精确值→验证成功,成功进入修改密码页面






思维导图




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表