[每周一更]-(第108期):如何保护你的JavaScript代码

news2024/9/22 7:21:22

在这里插入图片描述

文章目录

    • 一、框架如何实现JS的保护
      • 1. 模块化和组件化
      • 2. 使用环境变量
      • 3. 代码混淆和最小化
        • `vue.config.js`
      • 4. 使用请求库和拦截器
        • `axios.js` 文件
        • 在组件中使用 Axios 拦截器
      • 5. 服务端处理敏感逻辑
      • 6. 安全最佳实践
        • 使用 CSP
      • 7. 依赖前端框架的内置安全特性
      • 8. 数据验证和清理
    • 二、原生JS如何保护
      • 1. 代码混淆和最小化
        • 1.1、使用 Terser 进行代码混淆和最小化(不明显,只是压缩、格式和变量混淆)
          • 安装 Terser
          • 使用 Terser 进行混淆和最小化
          • 集成到 Webpack
        • 1.2、 使用 JavaScript Obfuscator
        • 1.3、 使用 UglifyJS(不明显,只是压缩和变量混淆)
        • 1.4、 集成到构建工具中
          • 使用 Webpack 和 UglifyJS 插件
        • 1.5、**Google Closure Compiler**(失败,把传递参数搞丢了)
          • 安装和使用
          • 使用命令行混淆代码
        • 1.6、**Babel Minify (babel-minify)**
          • 安装和使用
          • 使用命令行混淆代码
        • 1.7、 **JScrambler**
          • 使用 JScrambler
      • 2. 服务器端处理敏感逻辑
        • 示例
          • 服务端代码(例如使用 Node.js)
          • 客户端代码
      • 3. 使用 WebAssembly
      • 4. Content Security Policy (CSP)
        • 示例
      • 5. 严格的访问控制
      • 6. 使用 HTTPS

我们从最原始的html+css+JS(javascript,以下简称JS)的初学阶段走来,再到慢慢接触框架的使用,体验到框架的魅力,也会感受到使用框架的臃肿,有时候只需要一个简单的html,然后请求API获取数据就渲染到页面展示,这种需求使用框架就显得没必要了。

但是:使用原生JS处理API数据的时候,会发现在浏览器中,会看到所有代码及处理逻辑,如何保护我们代码不被泄露呢?

但是如果使用框架类,JS的泄露风险比较低,毕竟框架都进行底层封装和嵌套渲染,发布的时候都会webpack或npm打包一下,想摸清楚JS代码,还要摸清框架的逻辑,且在浏览器中也没法直接看到逻辑清晰的JS处理逻辑代码,反观原始就不要打包之类,暴漏风险100%~~

那么框架是如何保护JS代码的安全呢?

我们分两个角度分析,第一,框架如何实现JS的保护,第二,原生小应用的JS如何保护?

一、框架如何实现JS的保护

这里我们就用Vue框架为例配合讲解,其他框架ReactAngular,都类似。

前端框架如 Vue.js 在保护从 API 获取数据处理的 JavaScript 安全性方面有一些策略和最佳实践。尽管在客户端运行的代码无法完全避免被访问和分析,Vue.js 以及其他现代前端框架提供了一些机制和方法来增强安全性。以下是一些主要的方法:

1. 模块化和组件化

Vue.js 通过模块化和组件化组织代码,使代码结构清晰,并能更好地隔离敏感逻辑。

<template>
  <div>
    <button @click="fetchData">Fetch Data</button>
    <div v-if="data">{{ data }}</div>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      data: null,
    };
  },
  methods: {
    async fetchData() {
      try {
        const response = await axios.get('/api/data');
        this.data = response.data;
      } catch (error) {
        console.error('Error fetching data', error);
      }
    },
  },
};
</script>

<style scoped>
/* 样式代码 */
</style>

2. 使用环境变量

通过环境变量管理敏感信息(如 API URL),在打包时不会直接暴露在代码中。

# .env
VUE_APP_API_URL=https://api.example.com

const apiUrl = process.env.VUE_APP_API_URL;

3. 代码混淆和最小化

在生产环境中,通过构建工具进行代码混淆和最小化,减少代码可读性,增加逆向工程难度。

vue.config.js
module.exports = {
  productionSourceMap: false, // 禁用生产环境的 source map
  configureWebpack: {
    optimization: {
      minimize: true,
    },
  },
};

4. 使用请求库和拦截器

使用 Axios 等请求库,通过拦截器添加身份验证和错误处理,提高请求安全性。

axios.js 文件
import axios from 'axios';

const apiClient = axios.create({
  baseURL: process.env.VUE_APP_API_URL,
});

apiClient.interceptors.request.use(
  config => {
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  error => Promise.reject(error)
);

apiClient.interceptors.response.use(
  response => response,
  error => {
    if (error.response && error.response.status === 401) {
      window.location.href = '/login';
    }
    return Promise.reject(error);
  }
);

export default apiClient;
在组件中使用 Axios 拦截器
<template>
  <div>
    <button @click="fetchData">Fetch Data</button>
    <div v-if="data">{{ data }}</div>
  </div>
</template>

<script>
import apiClient from './axios';

export default {
  data() {
    return {
      data: null,
    };
  },
  methods: {
    async fetchData() {
      try {
        const response = await apiClient.get('/data');
        this.data = response.data;
      } catch (error) {
        console.error('Error fetching data', error);
      }
    },
  },
};
</script>

<style scoped>
/* 样式代码 */
</style>

5. 服务端处理敏感逻辑

将涉及敏感数据和业务逻辑的处理移到服务端,前端仅用于数据展示。

6. 安全最佳实践

  • HTTPS:使用 HTTPS 加密通信,防止数据在传输过程中被拦截。
  • 访问控制和身份验证:实施严格的访问控制和身份验证,确保只有授权用户可以访问敏感数据。
  • 定期审查和更新依赖项:修复已知的安全漏洞。
  • 内容安全策略 (CSP):防止跨站脚本攻击 (XSS)。
使用 CSP

index.html 中添加 CSP 头:

<head>
  <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self';">
</head>

7. 依赖前端框架的内置安全特性

Vue.js 自动对插值表达式和指令属性进行 HTML 转义,以防止 XSS 攻击。利用这些内置安全特性可以显著提高应用的安全性。

8. 数据验证和清理

对所有用户输入进行验证和清理,防止恶意数据进入系统。

通过以上方法,Vue.js 能在一定程度上增加从 API 获取数据的处理逻辑的安全性,但任何在客户端运行的代码都不能完全避免被访问和分析。因此,将敏感逻辑尽可能放在服务端处理是保护应用安全的最佳实践。

二、原生JS如何保护

众所周知,JavaScript 是一种在客户端执行的语言,代码不可避免地会暴露给用户。虽然你无法完全隐藏 JavaScript 代码,但可以采取一些措施来增加代码的难度,使其不易被阅读和修改。以下是一些常见的方法:

1. 代码混淆和最小化

列举了几种方法可以有效地混淆和压缩 JavaScript 代码,增加代码的安全性,使其难以阅读和逆向工程。不过,需要注意的是,代码混淆虽然增加了代码的复杂性,但并不能完全防止恶意攻击或逆向工程。将敏感逻辑和数据处理尽量放在后端服务器中,前后端协同工作,才能最大限度地保证系统的安全性。

1.1、使用 Terser 进行代码混淆和最小化(不明显,只是压缩、格式和变量混淆)

你可以使用 Terser 工具来混淆和最小化你的 JavaScript 代码。

Terser 是 UglifyJS 的一个分支,支持 ES6+ 语法。

安装 Terser
npm install terser -g
使用 Terser 进行混淆和最小化
terser your-script.js -o your-script.min.js -c -m
集成到 Webpack
npm install terser-webpack-plugin --save-dev

webpack.config.js 中配置 Terser 插件:

const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: __dirname + '/dist'
  },
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin()],
  },
};
1.2、 使用 JavaScript Obfuscator

JavaScript Obfuscator 是一个流行的工具,用于混淆 JavaScript 代码。可以通过 npm 安装:

npm install javascript-obfuscator -g

然后,可以使用以下命令对 JavaScript 文件进行混淆:

javascript-obfuscator input.js --output output.js
1.3、 使用 UglifyJS(不明显,只是压缩和变量混淆)

UglifyJS 是另一个用于混淆和压缩 JavaScript 代码的工具。可以通过 npm 安装:

npm install uglify-js -g

然后,可以使用以下命令对 JavaScript 文件进行混淆和压缩:

uglifyjs input.js -o output.js -m
1.4、 集成到构建工具中

如果使用构建工具如 Webpack,可以将代码混淆集成到构建过程中。

使用 Webpack 和 UglifyJS 插件

首先,安装 Webpack 和 UglifyJS 插件:

npm install --save-dev webpack webpack-cli uglifyjs-webpack-plugin

然后,在 webpack.config.js 中配置 UglifyJS 插件:

const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: __dirname + '/dist'
  },
  optimization: {
    minimizer: [new UglifyJsPlugin()],
  },
};
1.5、Google Closure Compiler(失败,把传递参数搞丢了)

Google Closure Compiler 是一个强大的 JavaScript 优化工具,可以混淆和压缩代码。

安装和使用
npm install google-closure-compiler --save-dev
使用命令行混淆代码
npx google-closure-compiler --js input.js --js_output_file output.js --compilation_level ADVANCED_OPTIMIZATIONS
1.6、Babel Minify (babel-minify)

Babel Minify 是 Babel 的一个插件,用于压缩和混淆 JavaScript 代码。

安装和使用
npm install @babel/core @babel/cli babel-minify --save-dev
使用命令行混淆代码
npx babel-minify input.js -o output.js
1.7、 JScrambler

JScrambler 是一个高级的 JavaScript 和 HTML5 代码保护工具,提供混淆、加密、以及代码完整性验证等功能。

使用 JScrambler
  1. 注册并登录到 JScrambler 网站。

  2. 创建一个项目并上传你的 JavaScript 文件。

  3. 配置混淆和加密选项。

  4. 下载混淆后的代码。

最后:有个想法,可以不同工具,合并使用,大家可以自行测试。

2. 服务器端处理敏感逻辑

将涉及敏感数据和逻辑的部分放在服务器端处理,而不是在客户端。这种方式确保关键逻辑不暴露在浏览器中。

示例

假设你有一个需要验证用户身份的逻辑。你可以将此逻辑移到服务器端,并通过 API 与客户端进行通信。

服务端代码(例如使用 Node.js)
const express = require('express');
const app = express();
const bodyParser = require('body-parser');

app.use(bodyParser.json());

app.post('/api/validate-user', (req, res) => {
    const { username, password } = req.body;
    // 在服务器端进行验证
    if (username === 'admin' && password === 'password') {
        res.json({ success: true });
    } else {
        res.json({ success: false });
    }
});

app.listen(3000, () => {
    console.log('Server running on port 3000');
});
客户端代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Secure Example</title>
</head>
<body>
    <input type="text" id="username" placeholder="Username">
    <input type="password" id="password" placeholder="Password">
    <button onclick="validateUser()">Login</button>
    <div id="result"></div>

    <script>
        function validateUser() {
            const username = document.getElementById('username').value;
            const password = document.getElementById('password').value;

            fetch('/api/validate-user', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({ username, password })
            })
            .then(response => response.json())
            .then(data => {
                if (data.success) {
                    document.getElementById('result').textContent = 'Login successful!';
                } else {
                    document.getElementById('result').textContent = 'Invalid credentials.';
                }
            })
            .catch(error => {
                console.error('Error:', error);
            });
        }
    </script>
</body>
</html>

3. 使用 WebAssembly

如果你需要保护性能关键的算法或非常敏感的逻辑,可以考虑使用 WebAssembly (Wasm)。WebAssembly 是一种较低级的二进制格式,可以编译许多语言(如 C、C++、Rust)的代码,并在浏览器中运行。虽然 WebAssembly 仍然可以被逆向工程,但它比纯 JavaScript 更难理解。

4. Content Security Policy (CSP)

通过设置 Content Security Policy (CSP) 头,可以限制 JavaScript 的来源,防止恶意代码的注入。

示例
<head>
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self';">
</head>

5. 严格的访问控制

确保敏感 API 只有授权用户可以访问,并且所有敏感操作在服务器端处理。

6. 使用 HTTPS

通过 HTTPS 加密传输,防止数据在传输过程中被窃取或篡改。

这些方法可以帮助你在一定程度上保护 JavaScript 代码,使其更难被用户理解和修改。但请记住,任何在客户端运行的代码都无法完全避免被访问和分析。确保将所有敏感逻辑放在服务器端处理,是保护应用安全的最佳实践。

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

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

相关文章

【linux】【操作系统】内核之traps.c源码阅读

C 文件traps.c 是 Linux 内核的一部分&#xff0c;主要处理硬件陷阱和故障。文件中包含多个函数来处理不同类型的异常和错误。下面是详细的解析&#xff1a; 概览 目的&#xff1a;此文件负责处理各种硬件异常和故障。它包括了处理特定类型错误以及初始化异常处理器的函数。文…

uniapp0基础编写安卓原生插件和调用第三方jar包(Ch34的jar包)和如何解决android 如何Application初始化

前言 我假设你会uniapp安卓插件开发了,如果不会请看这篇文章,这篇文章是0基础教学。 这篇文章我们将讲一下如何使用CH34XUARTDriver.jar进行开发成uniapp插件。 它的难点是:uniapp如何Application初始化第三方jar包 先去官网下载CH340/CH341的USB转串口安卓免驱应用库:h…

Spring实现自定义注解

一&#xff0c; 背景 目前部门有一个培训&#xff0c;需要讲一下Spring的使用&#xff0c;看到有同学提出问题&#xff0c;想自定义实现一个打日志的注解&#xff0c;下面就记录一下实现过程。 环境&#xff1a; Spring 6.1.5, 不使用Spring Boot. 二&#xff0c;实现步骤 …

Mysql--权限与安全管理

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、权限表 MySQL服务器通过权限表来控制用户对数据库的访问&#xff0c;权限表存放在MySQL数据库中&#xff0c;由MySQL_install_db脚本初始化。存储…

【工具篇】华为VRP通用操作系统 —— 配置文件管理

文章目录 配置文件分类配置文件命令配置文件工作原理 配置文件分类 设备的配置文件通常有两种类型&#xff1a; 1、启动配置文件&#xff08;Startup Configuration&#xff09;&#xff1a; 这是设备启动时加载的配置文件&#xff0c;包含了设备的基本配置信息&#xff0c;如…

Linux 内核源码分析---资源分配及系统总线

资源管理 Linux提供通用的构架&#xff0c;用于在内存中构建数据结构。这些结构描述了系统中可用的资源&#xff0c;使得内核代码能够管理和分配资源。 其中关键的数据结构resource如下&#xff1a; 用于连接parent, child, sibling成员规则如下&#xff1a; 1、每个子结点只…

接口测试学习笔记1

一、行业背景和测试分层 1、招聘需求 1&#xff09;手工测试&#xff1a;业务需求、业务逻辑 2&#xff09;自动化测试&#xff1a;业务逻辑 技术规范 功能自动化 QTP、Selenium 性能自动化 LoadRunner、JMeter 接口自动化 Postman、Fiddler、JMeter、SoapUI... …

值得一读!六本网络安全学习必备书籍推荐

在网络安全领域不断发展的今天&#xff0c;深入学习和掌握相关知识显得尤为重要。以下为大家推荐六本有助于提升网络安全技能的经典书籍。 一、《白帽子讲 Web 安全》 这本书由吴翰清撰写&#xff0c;涵盖了 Web 安全的诸多方面&#xff0c;包括常见的攻击手段、防御方法以及安…

XML 学习笔记

简介&#xff1a; &#xff08;1&#xff09;XML&#xff1a;可扩展性标记语言&#xff0c;用于传输和存储数据&#xff0c;而不是展示数据&#xff0c;是W3C 推举的数据传输格式。 XML的标签必须自定义&#xff0c;但是在写标签名的时候一定要有含义。 XML 只能有一个根节点…

微积分-微分应用7(优化问题)

解决优化问题的步骤&#xff1a; 理解问题 首先要仔细阅读问题&#xff0c;直到完全理解。问问自己&#xff1a;未知数是什么&#xff1f;已知量是什么&#xff1f;给定的条件是什么&#xff1f; 画图 在大多数问题中&#xff0c;画图并在图中标出给定和所需的量是有用的。 引…

用闲置的阿里云服务器使用 NPS 实现内网穿透

最近有个项目需要给外地的同事预览一下&#xff0c;但是公司没有可以公网访问的测试服务器&#xff0c;所以想到用内网穿透的方式让外地同事可以访问到我的本机。刚好我有一台阿里云的服务器&#xff0c;双十一打折买了3年&#xff0c;1000左右&#xff0c;2核8G&#xff0c;买…

24年税务师考试补报名即将开始啦

⏰税务师补报名重要时间节点 1⃣️补报名时间&#xff1a;8月6日10:00至8月16日17:00 2⃣️补报名缴费时间&#xff1a;8月6日10:00至8月18日24&#xff1a;00 3️⃣准考证打印时间&#xff1a;10月28日10:00至11月3日15:00 4⃣️考试时间&#xff1a;11月2日、3日 ✅税务…

c#中的BitConverter的java实现

最近在做c#项目的java迁移&#xff0c;发现部分C#方法java中没有对应实现如图&#xff1a; 且java中的数字类型都是有符号的所以转无符号的时候需要进行手动对符号位& 0xFFFF进行处理&#xff0c;目前只整理了项目中使用到的方法&#xff0c;后续有用到其他方法在进行追加如…

HarmonyOS 与 OpenHarmony 的区别详解

随着科技的不断进步&#xff0c;操作系统在我们日常生活中的重要性日益凸显。华为推出的 HarmonyOS 和 OpenHarmony 正是当前备受关注的两大操作系统。它们虽然紧密相关&#xff0c;但在理念、目标和应用场景上有显著的区别。本文将详细探讨这两者的不同之处。 一、概念解析 …

C++复习的长文指南(二)

C复习的长文指南&#xff08;二&#xff09; 一、面向对象基础知识5. 文件操作5.1文本文件5.1.1写文件5.1.2读文件 5.2 二进制文件5.2.1 二进制文件5.2.2 二进制读文件 6. c面向对象的个人心得开发流程6.16.26.36.46.5注意细节6.16.26.3 二、泛型编程1. 模板1.1 模板的概念1.2 …

GRFB UNet——基于多尺度注意网络盲道检测算法实现与模型C++部署

1. 概述 盲道是视障人士安全出行的重要辅助设施。识别盲道的形状和位置&#xff0c;对于增强视障人士的自主移动能力至关重要&#xff0c;而视觉分割技术正是应对这一挑战的有效工具。为了显著提升盲道分割的精确度和稳定性&#xff0c;本文提出了一种创新的分割方法&#xff…

OpenShift 4 - 用 oc-mirror 为离线 OpenShift 集群的 Mirror Registry 同步容器镜像

《OpenShift / RHEL / DevSecOps 汇总目录》 本文适合 OpenShift 4.11 及其以上版本。 文章目录 在离线环境中用 OpenShift 准备 Mirror Registry环境说明向隔离环境复制镜像准备节点环境bastion 节点操作support 节点操作 网络完全隔离环境-复制镜像bastion 节点操作support …

[图解]掉杠·above...duty -《分析模式》漫谈20

1 00:00:01,650 --> 00:00:05,120 今天我们来说一下《分析模式》和掉杠 1 00:00:00,480 --> 00:00:02,800 还是前言这里&#xff0c;有一句话 2 00:00:02,810 --> 00:00:04,850 I will mention 3 00:00:04,860 --> 00:00:05,250 that 4 00:00:05,680 --> 00…

【Golang 面试 - 进阶题】每日 3 题(十四)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

实战:MySQL数据同步神器之Canal

1.概叙 场景一&#xff1a;数据增量实时同步 项目中业务数据量比较大&#xff0c;每类业务表都达到千万级别&#xff0c;虽然做了分库分表&#xff0c;每张表数据控制在300W以下&#xff0c;但是效率还是达不到要求&#xff0c;为了提高查询效率&#xff0c;打算使用ES进行数…