当前位置: 首页 > article >正文

JS应用原生代码Ajax技术JQuery库Axios库前端校验安全结合

前言

学习的目的 : javascript  前后端结合的模式可以帮助我们获取更多的信息

#安全结合:

1、发现更多的有利用价值的信息(URL、域名、路径等等)

测试站、后台路径、未公开的路径、api地址等等

2、发现敏感信息(硬编码的帐号、pass、API密钥、注释等等)

硬编码帐号可登录、测试帐号可被登录、密钥泄露、注释中开发信息等等

3、发现危险的代码(eval、dangerouslySetInnerHTML等等)

URL跳转XSS跨站、模版注入(SSTI)等

4了解网站的逻辑校验功能

前端检测,加密逆向,数据走向等

基础: js事件

常见的 HTML 事件

下面是一些常见的 HTML 事件:

事件描述
onchangeHTML 元素已被改变
onclick用户点击了 HTML 元素
onmouseover用户把鼠标移动到 HTML 元素上
onmouseout用户把鼠标移开 HTML 元素
onkeydown用户按下键盘按键
onload浏览器已经完成页面加载

Ajax技术

1、原生JS教程

https://www.w3school.com.cn/js/index.asp

2、jQuery库教程

https://www.w3school.com.cn/jquery/index.asp

3、Axios库教程

https://www.axios-http.cn/docs/intro

原生态的ajax

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //原生态
        var http = new XMLHttpRequest(); //XMLHttpRequest 对象可用于在后台与 Web 服务器交换数据。这意味着可以更新网页的部分内容,而无需重新加载整个页面。
        //ajax 请求 不能跨域  只能请求本地服务器上的内容
        http.open('GET', '1.txt', true);
        http.send();;
        //open   send  就是发送请求  这个需要响应
        // http.onreadystatechange = function() {
        //     if (http.readyState == 4 && http.status == 200) {
        //         document.write(http.responseText);
        //     }
        // };
        // onreadystatechange 他是XMLHttpRequest对象的事件属性,每当readyState属性改变时,就会触发该事件。readyState属性表示 XMLHttpRequest 的状态。0表示请求未初始化,1表示服务器连接已建立,2表示请求已接收,3表示请求处理中,4表示请求已完成,status属性表示服务器的HTTP响应码。
        // readyState  又分为  0 : 请求未初始化  1 : 服务器连接已建立  2 : 请求已接收  3 : 请求处理中  4 : 请求已完成
        // status  表示服务器的HTTP响应码,200表示成功,404表示页面不存在,500表示服务器错误。


        http.onload = function() {
            if (http.status === 200) {
                console.log(http.responseText);
            } else {
                document.write('请求失败');
            }
        };
        //onload  他是XMLHttpRequest对象的事件属性,在请求完成时触发。
        // 这个是个回调函数就是执行响应成功之后要做的事情
    </script>

</body>

</html>

jquery库下的ajax技术

调用库可以使ajax

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>


    <!-- <script src="https://code.jquery.com/jquery-3.7.1.js"></script> --> <!-- 引入jQuery库 -->  使用外部链接
    <script src="jquery-3.7.1.min.js"></script>本地连接
    <script>
        //采用jQuery库实现ajax技术
        $.ajax({
            method: "GET",
            url: "1.txt",
            dataType: "text",
            success: function(response) {
                console.log(response);
            }
        });
    </script>
</body>

</html>

axios库下的ajax技术

    <script src="axios.min.js"></script>
    <script>
        axios.get('1.txt').then(function(response) {
            console.log(response.data);

        })
    </script>

ajax实现真实的前后端效验

场景:当我们进行登录页面的时候  会使用js前端验证(优点就是方便,快捷)这个时候就需要使用到ajax 对用户输入的账号密码进行验证然后后台给与响应

前端 login.html  

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>后台登录</title>
    <style>
        body {
            background-color: #f1f1f1;
        }
        
        .login {
            width: 400px;
            margin: 100px auto;
            background-color: #fff;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
            padding: 30px;
        }
        
        .login h2 {
            text-align: center;
            font-size: 2em;
            margin-bottom: 30px;
        }
        
        .login label {
            display: block;
            margin-bottom: 20px;
            font-size: 1.2em;
        }
        
        .login input[type="text"],
        .login input[type="password"] {
            width: 100%;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            font-size: 1.2em;
            margin-bottom: 20px;
        }
        
        .login input[type="submit"] {
            background-color: #2ecc71;
            color: #fff;
            border: none;
            padding: 10px 20px;
            border-radius: 5px;
            font-size: 1.2em;
            cursor: pointer;
        }
        
        .login input[type="submit"]:hover {
            background-color: #27ae60;
        }
    </style>
</head>

<body>
    <div class="login">
        <h2>后台登录</h2>
        <label for="username">用户名:</label>
        <input type="text" name="username" id="username" class="user">
        <label for="password">密码:</label>
        <input type="password" name="password" id="password" class="pass">
        <button onclick="Login()">登录</button>
    </div>

    <script src="jquery-3.7.1.min.js"></script>
    <script>
        function Login() {
            $.ajax({
                method: 'post',
                url: 'login.php',
                data: {
                    username: $('.user').val(), // 获取数据的时候  使用的是class   .val是获取值 
                    password: $('.pass').val()
                },
                dataType: 'json',
                success: function(data) {
                    console.log(data);
                    if (data['infoCode'] == 1) {
                        alert('登录成功!');

                    } else {
                        alert('登录失败!');
                    }
                }


            })
        }
    </script>

后端  login.php

$user=@$_POST['username'];   
$pass=@$_POST['password'];
//真实情况需要在数据库获取
$success=array('msg'=>'ok');   //这里的msg是自定义的提示信息,可以根据实际情况修改 这个表示后台进行了处理
if($user=='xiaodi' && $pass=='xiaodisec'){
    $success['infoCode']=1;    //这里的infoCode是自定义的状态码,可以根据实际情况修改 这个表示登录成功
}else{
    $success['infoCode']=0;
}
echo json_encode($success);    //对数据进行封装  返回

echo "欢迎登录到首页";

效果:

前端js验证的绕过 

我们发现

那只要伪造后端的返回值就能进入  

演示:输入错误的账号密码

修改为1   直接可以登录

文件上传的前后端效验

前端file.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
    <form action="file.php" method="post" enctype="multipart/form-data"> //使用action 把上传的文件交给 file.php 选择文件:
        <input type="file" name="file_upload" onchange="checkFile(this.value)">
        <!-- onchange事件用于检测上传的文件类型  就是选择的功能 -->
        <input type="submit" value="上传">
    </form>

    <script src="jquery-3.7.1.min.js"></script>
    <script>
        // function checkFile(filename) {
        //     //x.jpg 白名单校验
        //     var exts = ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'mpeg'];
        //     var index = filename.lastIndexOf("."); //lastIndexOf("") 查找相应索引字母的位置    返回的是位数
        //     var ext = filename.substr(index + 1); //substr(start,length) 截取字符串 从start开始截取length个字符   index的位数是到 .  +1才是开始截取后缀名
        //     for (var i = 0; i < exts.length; i++) { //循环数组  进行判断
        //         if (ext == exts[i]) {
        //             alert('文件正确!');
        //             break;
        //             //正确上传文件逻辑代码在下面
        //         } else {
        //             alert('非法文件!');
        //             window.location.replace("file.html")
        //             break;
        //         }
        //     }
        // }
        //黑名单效验

        function checkFile(filename) {
            var exts = ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'php'];
            var index = filename.lastIndexOf(".");
            var ob = filename.substr(index + 1);
            for (var i = 0; i < exts.length; i++) {
                if (ob != exts[i]) {
                    alert("文件格式正确!");
                } else {
                    alert("非法文件!");
                    window.location.replace("file.html");
                    break;
                }
            }
        }
    </script>
</body>

后端 file.php

$name=$_FILES['file_upload']['name'];   //获取上传的文件名
$type=$_FILES['file_upload']['type'];   //获取上传的文件类型
$size=$_FILES['file_upload']['size'];   //获取上传的文件大小
$tmp_name=$_FILES['file_upload']['tmp_name'];   //获取上传的文件临时存放路径
$error=$_FILES['file_upload']['error'];   //获取上传的错误信息
echo $name."<br>";
echo $type."<br>";
echo $size."<br>";
echo $tmp_name."<br>";
echo $error."<br>";

前端文件上传的绕过

因为是在前端  我们可以随意的更改前端的代码   所以可以直接把判断条件给删除(前端是黑名单的话还可以但是白名单的话就难办了)

安全结合

可以直接去fafo上搜索  body="checkFile"


http://www.kler.cn/a/553009.html

相关文章:

  • 前七章综合练习
  • C++基础知识学习记录—模版和泛型编程
  • 前沿科技:改变生活的十大趋势
  • 如何在谷歌搜索中获得更好的排名?
  • nginx ngx_http_module(9) 指令详解
  • Webpack,Vite打包的理解
  • 框架--Mybatis 2
  • 第三方库XLSX: 前端上传excel文件,并对excel文件内容做校验。
  • ERP对制造业务有何价值?
  • No.39 蓝队 | 网络安全实战笔记:系统加固与资产梳理
  • Spring框架详解(一)
  • DeepSeek私有化部署3:openEuler 24.03-LTS-SP1国产化操作系统安装nVidia驱动
  • 纯新手教程:用llama.cpp本地部署DeepSeek蒸馏模型
  • Windows逆向工程入门之堆栈回溯
  • 关于uniApp的面试题及其答案解析
  • Python在网络安全中的应用 python与网络安全
  • 萌新学 Python 之 for 循环语句
  • 设置SCP无需输入密码
  • Linux下ioctl的应用
  • 极限网关可视化——Elasticsearch 请求流量分析实战