首页 前端开发 JavaScript 中的安全编码:10 个关键实践

JavaScript 中的安全编码:10 个关键实践

引言
JavaScript 作为现代 Web 开发的核心语言,几乎无处不在——从简单的前端交互到复杂的 Node.js 后端应用。然而,正是这种广泛的应用使 JavaScript 成为攻击者的主要目标。本文旨在为开发者提供 10 个关键的安全编码实践,帮助构建更安全的 JavaScript 应用程序。我们将从最常见的跨站脚本攻击(XSS)开始,逐步深入到框架选择、编码规范、工具使用等多个层面,为您呈现一份全面的 JavaScript 安全编码指南。

正文内容
1. 防范跨站脚本攻击(XSS)
跨站脚本攻击(XSS)是 JavaScript 安全中最常见也最危险的问题之一。XSS 攻击的特殊之处在于它直接针对用户浏览器,攻击者可以利用它窃取会话信息、操纵页面内容甚至安装恶意软件。

要全面防范 XSS,应采取以下措施:

// 不安全的做法:直接插入未处理的用户输入
document.getElementById('output').innerHTML = userInput;

// 安全的做法:使用textContent而不是innerHTML
document.getElementById('output').textContent = userInput;
输入验证:对所有用户提供的数据进行严格验证,只接受预期的字符集。
输出编码:在将数据呈现到页面时进行适当的编码,确保特殊字符被转义。
内容安全策略(CSP):通过 CSP 头部限制可执行的脚本来源。
安全Cookie设置:为Cookie添加HttpOnly和Secure标志,防止通过JavaScript访问敏感Cookie。
2. 选择安全的JavaScript框架
现代前端框架如React、Angular和Vue.js都内置了自动输出编码的安全机制。这些框架通过虚拟DOM和其他安全机制,大大降低了XSS的风险。

然而,框架也提供了一些"逃生舱口"功能,如React的dangerouslySetInnerHTML和Angular的bypassSecurityTrustAs*系列方法。这些方法应尽量避免使用,除非确实必要且已采取其他安全措施。

3. 避免内联脚本
内联脚本(直接在HTML中编写的JavaScript)不仅难以维护,还会增加XSS的风险。最佳实践是将所有JavaScript代码放在独立的外部文件中,并通过CSP头部明确允许这些文件。

<!-- 不安全的做法:内联脚本 -->
<button onclick="doSomething()">点击我</button>

<!-- 安全的做法:外部脚本 -->
<script src="script.js"></script>
4. 启用严格模式
JavaScript的严格模式('use strict')通过限制某些危险语法和行为,帮助编写更安全的代码。严格模式的主要优势包括:

禁止意外创建全局变量
使eval和arguments更安全
禁止使用未来可能成为关键字的标识符
使this在全局函数中为undefined而非window对象
// 启用严格模式
'use strict';

// 在严格模式下,以下代码会抛出错误
undefinedVar = 10; // ReferenceError
5. 利用开源安全工具
开源社区提供了大量工具来帮助检测和预防JavaScript安全问题。以下是一些值得推荐的工具:

DOMPurify:用于净化HTML输入,防止XSS。
Retire.js:检查项目中使用的JavaScript库是否有已知漏洞。
npm audit/yarn audit:检查依赖项的安全问题。
Semgrep:静态代码分析工具,可检测多种安全问题。
ZAP:动态应用安全测试工具,但使用前需获得授权。
6. 明确区分文本和代码
在JavaScript中操作DOM时,必须明确区分应作为文本处理的内容和应作为代码执行的内容。使用innerText或textContent而非innerHTML来插入纯文本内容。

// 不安全的做法
element.innerHTML = userProvidedData;

// 安全的做法
element.textContent = userProvidedData;
7. 安全使用属性设置
当使用setAttribute设置元素属性时,只应使用安全的静态属性。避免将用户提供的数据用于动态属性如onclick或onmouseover。

安全属性示例包括:class, id, title, alt, value等。而on*系列事件处理属性则属于不安全属性。

8. 后端输入验证
前端输入验证虽能提升用户体验,但绝不能替代后端验证。攻击者可以轻松绕过前端验证,直接向后端发送恶意数据。

// 前端验证(仅用于用户体验)
function validateInput(input) {
return /^[a-zA-Z0-9]+$/.test(input);
}

// 后端也必须进行相同的验证
// (示例为伪代码,实际实现取决于后端语言)
app.post('/api/submit', (req, res) => {
if (!/^[a-zA-Z0-9]+$/.test(req.body.input)) {
return res.status(400).send('Invalid input');
}
// 处理合法输入...
});
9. 避免危险函数
JavaScript中有一些函数因其特性而特别危险,尤其是在处理用户输入时。这些函数包括:

eval():执行字符串作为代码
Function()构造函数:类似eval
setTimeout()/setInterval():使用字符串而非函数
document.write():可能覆盖整个文档
innerHTML/outerHTML:可能导致XSS
// 极其危险的做法
eval(userInput);

// 同样危险的变体
new Function(userInput)();

// 相对安全的做法
setTimeout(() => {
console.log('安全代码');
}, 1000);
10. 全面应用安全开发实践
JavaScript应用的安全不应局限于语言特性本身,还应包括全面的安全开发实践。这包括:

安全的系统开发生命周期(S-SDLC):将安全考虑融入整个开发过程。
参数化查询:防止SQL注入
加密:数据传输和存储加密
身份验证和授权:可靠的用户管理系统
依赖管理:定期更新第三方库
结论
JavaScript的安全编码是一个需要持续关注和学习的领域。从防范XSS攻击到选择合适的框架,从启用严格模式到利用安全工具,再到避免危险函数,每个环节都至关重要。安全不是一蹴而就的,而是需要在日常开发中不断实践和强化的习惯。

作为开发者,我们可以从今天开始,选择一两个最佳实践应用到当前项目中。随着经验的积累,逐步引入更多的安全措施,最终构建出既功能强大又安全可靠的JavaScript应用。记住,安全不是可选项,而是每个负责任开发者的基本职责。

通过知识共享和持续改进,我们可以让JavaScript生态不仅更加强大和高效,同时也更加安全。

站星网

引言JavaScript 作为现代 Web 开发的核心语言,几乎无处不在——从简单的前端交互到复杂的 Node.js 后端应..

为您推荐

豪掷10亿,淘宝双11进军新马泰!阿里电商又迈关键一步

来源:东南亚电商观察作者:丰丰2024 年 11 月 21 日傍晚,阿里巴巴集团 CEO 吴泳铭在内部邮件中抛出了一道“惊雷”。他在信件中宣布要打通国内和海外的电商平台,并将淘天集团、国际数字商业集团在内的阿里核心电商..

Web前端入门第 81 问:JavaScript cookie 的读写操作

前端的 cookie 读写在 2020 年之前一直不存在一个官方的接口,每次需要使用 cookie 的时候,要么是引入三方插件,要么就需要自己封装一个公用的组件或函数。npm 的 cookie 插件周下载量 6 千万左右,可以想象一下此..

Web前端入门第 78 问:JavaScript 比较少见的模版字符串用法

在 ES6 之前,JS 的多行字符串一直是开发难题,在处理多行字符串时,各种各样的方案都有~~在 JS 中,如果直接这样写多行字符串:const str1 = '第一行第二行';那浏览器转过来就打脸,分分钟报错:Uncaught S..

Web前端入门第 67 问:JavaScript 中的面向对象编程

此 对象 非彼对象啊,不要理解错了哦~~面向对象编程 这个概念在 Java 编程语言中用得比较多,JS 同时支持 面向对象编程 和 函数式编程。像大名鼎鼎的 React 和 Vue 他们都有两种开发风格,比如:Vue 中的 组合式API ..

Web前端入门第 57 问:JavaScript 数据类型与类型转换

在程序语言中,数据类型是基础,一切程序都是建立在基础数据之上。如果说程序如同万丈高楼平地起,那么数据类型就像沙、石、钢筋、水泥等等最基础的原料。一样的高楼,不同的人,用相同的原料,造的方法也会有千般变..

JavaScript实现图片上传预览及获取图片尺寸和大小的完整指南

在现代Web开发中,提供图片上传的预览功能以及获取图片的尺寸和大小信息,已成为提升用户体验的重要手段。本文将详细介绍如何使用JavaScript实现这些功能,帮助你在用户上传图片前进行有效的验证和优化。一、实现图..

Web前端入门第 60 问:JavaScript 各种数组定义与数组取值方法

数组可以算是程序里面最常用的数据结构了,但凡网页上任何一个列表数据,基本都是以数组的形式存在,像表格、banner图、菜单列表、商品列表,分类列表等等,在前端领域都是以数组处理。数组的定义JS 的数组花样很多..

Web前端入门第 55 问:JavaScript 严格模式与非严格模式区别

JavaScript 默认是非严格模式的,可以通过 "use strict"; 启用严格模式。此声明语句可以放在 JS 文件顶部,也可以放在函数内部。启用严格模式1、外部脚本在 JS 文件开头声明,内部脚本在 <script> 标签开头声明,声..

Web前端入门第 53 问:JavaScript 的各种调试方法

任何一门编程语言,在学习之前都应该先弄清楚它的调试方法,毕竟没有不挖坑的人类!程序一旦出现问题,第一时间就是找到问题出在哪儿,其次才是拿出解决办法。如果都找不到问题原因,那又何从谈起解决办法呢?如何排..

Web前端入门第 52 问:JavaScript 的应用领域

截至目前,您应该对前端的 HTML + CSS 应该有了很清楚的认知,至少实现一个静态网页已经完全不在话下了。当然,CSS 功能绝不止这些,一些不太常用的 CSS 相关知识,后续将通过案例进行分享。那么咱们接下来看看 Java..

.NET C# 过滤从富文本编辑器html里的Javascript脚本

富文本编辑器在允许用户输入丰富内容的同时,也带来了跨站脚本攻击(XSS)的风险。过滤提交的 HTML 中的 <script> 脚本是防止跨站脚本攻击(XSS)的关键步骤。在 .NET C# 服务端过滤 <script> 脚本主要有以下几种方..

轻松学习 JavaScript函数中的默认参数

JavaScript函数可以有默认参数值。通过默认函数参数,你可以初始化带有默认值的正式参数。如果不初始化具有某些值的参数,则该参数的默认值为undefined。请看下列代码:function foo(num1){console.log(num1);}foo()..

JavaScript API 设计原则详解

前言本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块。系卤煮自己总结的一些经验和教训。本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来。很难做到详..

JavaScript 中精度问题以及解决方案

JavaScript 中的数字按照 IEEE 754 的标准,使用 64 位双精度浮点型来表示。其中符号位 S,指数位 E,尾数位M分别占了 1,11,52 位,并且在ES5 规范中指出了指数位E的取值范围是[-1074, 971]。精度问题汇总想用有限..

JavaScript 六种继承方式

继承是面向对象编程中又一非常重要的概念,JavaScript支持实现继承,不支持接口继承,实现继承主要依靠原型链来实现的。原型链首先得要明白什么是原型链,在一篇文章看懂proto和prototype的关系及区别中讲得非常详细..

JavaScript 事件委托详解

基本概念事件委托,通俗地来讲,就是把一个元素响应事件(click、focus……)的函数委托到另一个元素;一般来讲,会把一个或者一组元素的事件委托到它的父层或者更外层元素上,真正绑定事件的是外层元素,当事件响应..

JavaScript 中的遍历详解

编程这么多年,要是每次写遍历代码时都用 for 循环,真心感觉对不起 JavaScript 语言~对象遍历为了便于对象遍历的测试,我在下面定义了一个测试对象obj。测试对象// 为 Object 设置三个自定义属性(可枚举)Object.p..

值得探索的 8 个机器学习 JavaScript 框架

JavaScript开发人员倾向于寻找可用于机器学习模型训练的JavaScript框架。下面是一些机器学习算法,基于这些算法可以使用本文中列出的不同JavaScript框架来模型训练:简单的线性回归多变量线性回归逻辑回归朴素贝叶斯..

JavaScript 保留两位小数

以下我们将为大家介绍 JavaScript 保留两位小数的实现方法:四舍五入以下处理结果会四舍五入:var num =2.446242342;num = num.toFixed(2); // 输出结果为 2.45不四舍五入以下处理结果不会四舍五入:第一种,先把小数边..

JavaScript 页面跳转、页面重定向

JavaScript 实现页面跳转重定向可以使用以下两种方法:window.location.replace("url")类似 HTTP 重定向将地址替换成新 url,该方法通过指定 URL 替换当前缓存在历史里(客户端)的项目,因此当使用 replace 方法之..

发表回复

返回顶部

微信分享

微信分享二维码

扫描二维码分享到微信或朋友圈

链接已复制
蜂鸟影院2048影视资源论坛熊猫影视河马影视星辰影视萝卜影院八哥电影网人人看电影无忧影视网橙子影视网叮当影视网天天影视网青青影视网电影天堂开心追剧网西瓜影院麻花影视网70影视网年钻网茶小舍电影藏影堂新神州影域煮酒观影体积影视爱看影院星光电影至尊影院极影公社超清视界