如何提升JavaScript安全性,保护应用程序免受威胁

news2024/9/29 11:08:11

在这里插入图片描述

JavaScript作为Web开发的主要开发语言,在前端应用开发中发挥着绝对主导的作用,保护我们的应用免受常见的安全威胁是每个前端开发人员应该掌握的基础知识。本文介绍了JavaScript基础的安全实践,了解如何防止XSS、CSRF等常见漏洞,实现安全通信并安全的管理依赖项、保护客户端数据存储,提升应用应对常见威胁的防御能力。

跨站点脚本(XSS Cross-Site Scripting)攻击

人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。

跨站点脚本是Web应用程序中最常见的漏洞之一,攻击者可以使用户在浏览器中执行其预定义的恶意脚本,达到其攻击目的,如劫持用户会话,插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖XSS蠕虫,甚至破坏网站、修改路由器配置信息等。

跨站点脚本攻击XSS的类型

反射型(非持久型)XSS

反射型XSS,是指攻击者在页面中插入恶意JavaScript脚本,当合法用户正常请求页面时,该恶意脚本会随着Web页面请求一并提交给服务器,服务器处理后进行响应,响应由浏览器解析后将JavaScript脚本的执行结果显示在页面中。整个过程就像是一次“客户端—服务器—客户端”的反射过程,恶意脚本没有经过服务器的过滤或处理,就被反射回客户端直接执行并显示相应的结果。反射型XSS需要攻击者将带有恶意脚本的链接发送给其他用户,并诱惑用户点击该链接后才会发生。反射型XSS只有在用户点击时才会触发,且只执行一次,恶意代码不会在服务器中存储,因此也被称为“非持久型XSS”。

存储型(持久型)XSS

存储型XSS又称持久型XSS,攻击脚本将被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性。反射型XSS的被攻击对象一般是攻击者去寻找的,就比如说:一个攻击者想盗取A的账号,那么攻击者就可以将一个含有反射型XSS的特制URL链接发送给A,然后用花言巧语诱骗A点击链接。当A不小心点进去时,就会立即受到XSS攻击。这种攻击方式需要一点骗术,所以这种攻击范围不是特别的广,并且提交漏洞时要么平台不认,要么会被认定为低危漏洞。

存储型XSS可以采用广撒网的方式,就是攻击者将存储型XSS代码写进一些有XSS漏洞的网站上,只要有用户访问这个链接就会自动中招。所以我们可以看出,存储型XSS的危害性更大,范围更广,可以不需要寻找被攻击对象,只要存储型XSS在服务器上就能实施攻击。所以提交的存储型XSS评级一般为中危漏洞。

基于DOM的XSS

在网站页面中有许多元素,当页面到达浏览器时,浏览器会为页面创建一个顶级的Document对象,并生成各个子文档对象。每个页面元素对应一个文档对象,这些对象包含属性、方法和事件。客户端的脚本程序(如JavaScript)可以通过DOM动态修改页面内容,从客户端获取DOM中的数据并在本地执行。

攻击者通过构造特殊的URL或利用网页中的某些功能(如表单提交、URL参数等),将包含恶意代码的请求发送给受害者。当受害者的浏览器处理这些请求时,恶意代码会修改DOM树,并执行其中的脚本,从而达到攻击目的。

预防技术

输入验证和消毒

在应用程序中使用用户输入之前,请务必对其进行验证和清理。

// 错误做法: 直接将用户输入的内容放入DOM
document.getElementById('username').innerHTML = userInput;

// 正确做法: 插入前对输入内容进行“消毒”
import DOMPurify from 'dompurify';
document.getElementById('username').textContent = DOMPurify.sanitize(userInput);

内容安全策略(CSP)

实施更健壮的内容安全策略来限制应用程序可加载的内容来源。

<meta http-equiv="Content-Security-Policy" 
      content="default-src 'self'; script-src 'self' https://trusted-cdn.com;">
访问cookie时使用HttpOnly和安全标志

防止客户端访问敏感的 cookie。

// 创建cookies时设置HttpOnly和安全标志
document.cookie = "session=123; HttpOnly; Secure";

跨站请求伪造(CSRF)

CSRF (Cross-site request forgery,跨站请求伪造)也被称为One Click Attack或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户请求受信任的网站。

简单的说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己以前认证过的站点并运行一些操作(如发邮件,发消息,甚至财产操作(如转账和购买商品))。因为浏览器之前认证过,所以被访问的站点会觉得这是真正的用户操作而去运行。

预防技术

只使用JSON API

使用JavaScript发起AJAX请求是限制跨域的,并不能通过简单的 表单来发送JSON,所以,通过只接收JSON可以很大可能避免CSRF攻击。

验证HTTP Referer字段

根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如用户想要在网站WebA中进行转账操作,那么用户必须先登录WabA,然后再通过点击页面上的按钮出发转账事件。这时该转帐请求的 Referer 值就会是转账按钮所在的页面的URL,如果黑客要对银行网站实施 CSRF攻击,他只能在他自己的网站构造请求,当用户User通过黑客的网站发送请求到WebA时,该请求的 Referer 是指向黑客自己的网站。

因此,要防御 CSRF 攻击,网站WebA只需要对于每一个转账请求验证其 Referer 值,如果是以网站WebA的网址开头的域名,则说明该请求是来自WebA自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

使用 CSRF令牌

为每个用户会话生成并验证 CSRF 令牌。

// 服务端: 生成并分发CSRF令牌
const csrfToken = generateCSRFToken();
res.cookie('XSRF-TOKEN', csrfToken, { httpOnly: true });

// 客户端:在请求中包含令牌
fetch('/api/data', {
  method: 'POST',
  headers: {
    'X-XSRF-TOKEN': getCookie('XSRF-TOKEN')
  },
  // ... 其他选项
});
SameSite Cookie属性

使用 SameSite 属性可以防止在跨站点请求中发送 cookie。

// 创cookies时设置SameSite属性
document.cookie = "session=123; SameSite=Strict";

注入攻击

虽然SQL注入众所周知,但JavaScript代码注入攻击也是一种常见的网络攻击方式,攻击者可以通过在网页中注入恶意JavaScript代码,对用户进行攻击。例如,在JavaScript中,prompt()函数用于弹出一个对话框,提示用户输入信息,如果攻击者利用prompt()函数进行代码注入攻击,可能会导致用户的敏感信息被窃取。

预防技术

避免使用 eval() 和 new Function()

切勿将eval()或new Function()与用户提供的输入一起使用。

// 不好的用法: 对用户的输入进行eval
eval('console.log("' + userInput + '")');

// 好的用法: 避免与用户输入一起使用eval
console.log(userInput);
使用参数化查询

使用数据库时,始终使用参数化查询或准备好的语句。

// 在进行数据库操作时,使用参数化的查询,不要使用用户输入内容或提交的参数拼接sql语句
const query = {
  text: 'INSERT INTO users(name, email) VALUES($1, $2)',
  values: [userName, userEmail],
}
client.query(query)

使用https等措施确保通信安全

确保客户端和服务器之间的安全通信是应用程序安全的基础

实施技术

强制使用 HTTPS

将所有 HTTP 流量重定向到 HTTPS 并使用 HSTS(HTTP 严格传输安全)。

// Express.js 中间件将HTTP重定向到HTTPS
app.use((req, res, next) => {
  if (req.header('x-forwarded-proto') !== 'https') {
    res.redirect(`https://${req.header('host')}${req.url}`)
  } else {
    next()
  }
})
实施适当的CORS(跨资源共享)策略

正确配置 CORS(跨源资源共享),以防止未经授权的API访问。

// Express.js CORS 配置
const cors = require('cors');
app.use(cors({
  origin: 'https://trusted-origin.com',
  methods: ['GET', 'POST'],
  allowedHeaders: ['Content-Type', 'Authorization']
}));

注意第三方依赖,保证供应链安全

使用第三方库可能会给应用程序带来漏洞。

安全实践

定期依赖审计

定期审核并更新应用的依赖项。

# 使用npm来审计依赖项
npm audit

# 尽可能及时的修复漏洞
npm audit fix
使用子资源完整性

从 CDN 加载脚本时,使用子资源完整性来确保内容没有被篡改。

<script src="https://example.com/example-framework.js"
        integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
        crossorigin="anonymous"></script>

保护本地数据

在客户端存储数据时,应采取预防措施保护敏感信息。

最佳实践

加密敏感数据

在 localStorage 或 IndexedDB 中存储敏感数据时使用加密。

// 使用Web Crypto API进行加密
async function encryptData(data, key) {
  const encodedData = new TextEncoder().encode(data);
  const encryptedData = await window.crypto.subtle.encrypt(
    { name: "AES-GCM", iv: window.crypto.getRandomValues(new Uint8Array(12)) },
    key,
    encodedData
  );
  return encryptedData;
}
使用 SessionStorage 存储临时数据

对于仅在会话期间需要的敏感数据,应使用 sessionStorage 而不是 localStorage。

// 存储临时数据
sessionStorage.setItem('tempAuthToken', token);

// 获取临时数据
const tempToken = sessionStorage.getItem('tempAuthToken');

防范安全威胁

保护JavaScript应用程序安全是一个持续的过程,需要保持警惕并不断学习。随着新威胁的出现,开发人员必须随时了解情况并相应地调整其安全实践。

请记住,安全性不是一项功能,而是高质量软件开发的一个基本方面。通过实施这些安全最佳实践并不断学习有关新兴威胁的知识,可以显著降低应用程序中出现安全漏洞的风险。

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

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

相关文章

多人音视频房间 SDK

多人音视频房间 SDK 是音视频终端 SDK&#xff08;腾讯云视立方&#xff09;的子产品之一&#xff0c;基于企业培训、在线会议、网络研讨会等多人音视频会话场景定制&#xff0c;提供房间管理、成员管理、屏幕分享等会控功能&#xff0c;提供含 UI 快速集成方案&#xff0c;仅需…

【CSS】变换

空间概念translate ( 平移 )rotate ( 旋转 )scale ( 缩放 )skew ( 倾斜 )案例&#xff08; 六面骰子、旋转照片&#xff09; 空间概念 三维空间坐标 ( X&#xff0c;Y&#xff0c;Z ) 透视 ( perspective) 距离 ( 视距 ) d&#xff0c;近大远小&#xff0c;观众面向组件的距离 …

MATLAB案例 | Copula的密度函数和分布函数图

本文介绍各种类型&#xff08;Gaussian、t、Gumbel、Clayton、Frank&#xff09;Copula的密度函数和分布函数图的绘制 完整代码 clc close all clear%% ********************计算Copula的密度函数和分布函数图************************ [Udata,Vdata] meshgrid(linspace(0,1…

到时间没回家又不接电话?如何迅速确定孩子的位置?

当孩子未按时回家且无法通过电话联系时&#xff0c;家长往往会感到焦虑。此时&#xff0c;如何迅速确定孩子的位置成为许多家长迫切需要解决的问题。 利用智能手机定位技术是最常见的方法之一。大多数智能手机都内置GPS定位功能&#xff0c;通过“查找设备”应用&#xff0c;家…

你了解文档透明加密系统吗?介绍7款顶尖文档透明加密软件,热门推荐!

你了解文档透明加密系统吗&#xff1f; 文档透明加密系统&#xff0c;这一神奇的技术利器&#xff0c;正悄然守护着企业的核心机密。 它如同一位隐形的守护者&#xff0c;在你毫无察觉的情况下&#xff0c;对文档进行加密处理&#xff0c;确保数据在存储、传输及使用的全过程…

本地电脑基于nginx的https单向认证和双向认证(自制证书+nginx配置)保姆级

目录 1、背景 2、运行环境 3、工具下载 3.1、OpenSSL下载 3.2、nginx下载 4、制作https证书&#xff1a; 4.1、CA与自签名&#xff1a; 4.2、制作CA根证书&#xff08;公钥&#xff09; 4.3、制作服务端证书&#xff1a; 4.4、制作客户端证书&#xff1a; 4.5、制作…

openEuler 20.03,22.03,24.03一键部署Oracle23ai rpm

Oracle23ai前言 Oracle Database 23ai Free 让您可以充分体验 Oracle Database 的能力,世界各地的企业都依赖它来处理关键任务工作负载。 Oracle Database Free 的资源限制为 2 个 CPU(前台进程)、2 GB 的 RAM 和 12 GB 的磁盘用户数据。该软件包不仅易于使用,还可轻松下载…

智慧体育馆可视化:实时监控与智能管理

利用图扑可视化技术实现对体育馆的实时监控和数据分析&#xff0c;提升运营效率、观众体验和安全管理水平&#xff0c;打造智能化场馆环境。

Tomcat may not be running

一、问题背景 tomcat7运行在JDK1.7上&#xff0c;可启动tomcat&#xff0c;但是停止时报错误&#xff0c;如下&#xff1a; 二、适用条件 JDK1.7/JDK1.8 tomcat7 三、解决方法 1、查找java路径 which java 2、修改文件 找到/usr/lib/jvm/jdk1.7.0_80/jre/lib/security/j…

专业学习|《随机过程》学习笔记(二)(定义、分类及相关过程)

一、随机过程 &#xff08;一&#xff09;随机过程定义 &#xff08;1&#xff09;基本概念 随机过程是随机变量的延伸。 &#xff08;2&#xff09;描述随机过程的方法 &#xff08;3&#xff09;随机过程的分类和举例 &#xff08;4&#xff09;随机过程的数字特征 随机过…

【Python实操】淘宝商品详情数据采集返回并实现可视化处理

开发工具 Python版本&#xff1a;3.6.4 相关模块&#xff1a; DecryptLogin模块&#xff1b; pyecharts模块&#xff1b; 以及一些Python自带的模块。 环境搭建 安装Python并添加到环境变量&#xff0c;pip安装需要的相关模块即可。 数据爬取 既然说了是模拟登录相关的爬…

3519嵌入式如何通过ssh 或者telnet连接嵌入式设备

需求 PC电脑连接嵌入式设备&#xff0c;已经能够连接串口&#xff0c;想要额外连接嵌入式设备&#xff0c;查看终端信息。 尝试了两种方法&#xff1a;1.通过SSH登录(失败) 2.通过telnet登录(成功) 问题描述 1.SSH登录 3519通过网线和串口线连接PC windows&#xff0c;并在…

日本科学家利用AI技术在秘鲁纳斯卡沙漠地区找到303幅古代地画

据法新社24日报道&#xff0c;日本科学家利用 人工智能&#xff08; AI&#xff09;技术在秘鲁纳斯卡沙漠地区新发现了303幅古代地画。相关研究成果已于23日发表在《美国国家科学院院刊》上。 日本山形大学考古学家酒井正人23日在秘鲁首都利马宣布了这一新发现&#xff0c;他表…

JavaScript中的函数function

function 可以将一个函数赋给一个变量&#xff0c;直接调用 或者常规的有变量名的函数 break:打断循环 continue:打断当前循环&#xff0c;进行下一轮 debugger:调试程序自动断点 "use strict":严格模式 var hasStrictMode(function(){"use strict";r…

langchain 记忆力(memory),让语言大模型拥有记忆

1&#xff0c;简介 存储对话历史中的信息的能力称之为’记忆‘&#xff0c;这种工具可以单独使用&#xff0c;也可以无缝的集成到一条链中,记忆的存储长度是程序执行到结束&#xff0c;执行一次的所有记忆。 记忆的主要应用场景就是聊天机器人&#xff0c;聊天机器人的一个关键…

Golang | Leetcode Golang题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; func levelOrder(root *Node) (ans [][]int) {if root nil {return}q : []*Node{root}for q ! nil {level : []int{}tmp : qq nilfor _, node : range tmp {level append(level, node.Val)q append(q, node.Children...)}ans append(a…

误删回收站的文件怎么恢复正常,不小心删除回收站的文件怎么找回

现如今&#xff0c;电脑在工作中承担着很重要的角色&#xff0c;里面往往存储着很多重要的工作资料文件&#xff0c;而回收站作为电脑对数据文件的最后保护&#xff0c;往往能够避免数据文件的丢失。下面就给大家详细讲解有关&#xff0c;误删回收站的文件怎么恢复&#xff0c;…

AI日常绘画【国庆海报】:盛世迎华诞,最强AI绘图大模型Flux国庆节海报制作教程

大家好&#xff0c;我是画画的小强 马上就要到祖国母亲的节日了&#xff0c;想想心里都美滋滋的&#xff0c;终于可以放松一下了。相信AI绘画关于国庆主题肯定也会精彩纷呈吧&#xff0c;今天和大家分享几组关于国庆海报的制作教程。 本文使用基于Flux的相关Lora模型。 Loar1…

Docker快速部署RabbitMq教程

1、拉取RabbitMQ镜像 docker pull rabbitmq:management RabbitMQ Management 插件为 RabbitMQ 提供了一个基于 Web 的用户界面&#xff08;Management UI&#xff09;&#xff0c;允许你通过浏览器来监控、管理 RabbitMQ 实例。 因为docker默认是使用的是Docker Hub的官方镜…

Matlab进阶绘图第69期—同步坐标图

同步坐标是指将同一figure上的两个或两个以上的子图&#xff0c;用相同的X轴、Y轴或XY轴表示&#xff0c;以方便同步分析。 话不多说&#xff0c;先来看一下同步坐标图的成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请…