JavaScript系列(26)--安全编程实践详解

JavaScript安全编程实践详解 🔒

今天,让我们深入探讨JavaScript的安全编程实践。在当今的网络环境中,安全性已经成为开发者必须重点关注的领域。

安全编程基础 🌟

💡 小知识:JavaScript安全编程涉及多个方面,包括XSS防护、CSRF防御、输入验证、安全存储、安全通信等。通过采用正确的安全实践,我们可以有效防范常见的安全威胁。

XSS防护实践 🛡️

// 1. HTML转义工具
class HTMLEscaper {static escapeMap = {'&': '&amp;','<': '&lt;','>': '&gt;','"': '&quot;',"'": '&#x27;','/': '&#x2F;'};static escape(str) {return str.replace(/[&<>"'/]/g, char => this.escapeMap[char]);}static createSafeHTML(unsafeHTML) {const div = document.createElement('div');div.textContent = unsafeHTML;return div.innerHTML;}
}// 2. XSS防护包装器
class XSSProtector {constructor() {this.sanitizer = new DOMPurify();}// 安全地设置HTML内容setHTML(element, content) {element.innerHTML = this.sanitizer.sanitize(content, {ALLOWED_TAGS: ['p', 'span', 'b', 'i', 'em', 'strong'],ALLOWED_ATTR: ['class', 'id']});}// 安全地渲染用户输入renderUserContent(content) {return this.sanitizer.sanitize(content, {RETURN_DOM: true,RETURN_DOM_FRAGMENT: true});}// URL参数安全检查validateURL(url) {try {const parsedURL = new URL(url);return parsedURL.protocol === 'https:' || parsedURL.protocol === 'http:';} catch {return false;}}
}

CSRF防护机制 🔐

// 1. CSRF Token管理器
class CSRFTokenManager {constructor() {this.tokenName = 'csrf-token';this.token = this.generateToken();}generateToken() {return Array.from(crypto.getRandomValues(new Uint8Array(32)),byte => byte.toString(16).padStart(2, '0')).join('');}// 为请求添加CSRF TokenaddTokenToRequest(request) {if (request instanceof Headers) {request.append(this.tokenName, this.token);} else if (request instanceof FormData) {request.append(this.tokenName, this.token);} else if (typeof request === 'object') {request[this.tokenName] = this.token;}return request;}// 验证CSRF TokenvalidateToken(token) {return token === this.token;}
}// 2. 安全请求包装器
class SecureRequestWrapper {constructor(csrfManager) {this.csrfManager = csrfManager;}async fetch(url, options = {}) {// 添加CSRF Tokenconst headers = new Headers(options.headers);this.csrfManager.addTokenToRequest(headers);// 添加安全头部headers.append('X-Content-Type-Options', 'nosniff');headers.append('X-Frame-Options', 'DENY');const response = await fetch(url, {...options,headers,credentials: 'same-origin'});return response;}
}

输入验证与清理 🧹

// 1. 输入验证器
class InputValidator {// 通用验证规则static rules = {email: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,phone: /^\+?[\d\s-]{10,}$/,url: /^https?:\/\/[\w\-\.]+(:\d+)?\/?\S*$/,username: /^[\w\-]{3,16}$/,password: /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/};static validate(value, type) {if (!this.rules[type]) {throw new Error(`Unknown validation type: ${type}`);}return this.rules[type].test(value);}// SQL注入检测static checkSQLInjection(value) {const sqlPatterns = [/(\s|^)(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|ALTER)(\s|$)/i,/'.*?'|\s+OR\s+'.*?'/i,/--|\#|\/\*/];return !sqlPatterns.some(pattern => pattern.test(value));}// 命令注入检测static checkCommandInjection(value) {const cmdPatterns = [/[;&|`]/,/\$\([^)]*\)/,/\${[^}]*}/];return !cmdPatterns.some(pattern => pattern.test(value));}
}// 2. 输入清理器
class InputSanitizer {// HTML特殊字符转义static escapeHTML(input) {return input.replace(/[&<>"']/g, char => ({'&': '&amp;','<': '&lt;','>': '&gt;','"': '&quot;',"'": '&#39;'})[char]);}// 移除危险字符static removeDangerousChars(input) {return input.replace(/[<>'"();]/g, '');}// 规范化输入static normalize(input) {return input.trim().normalize('NFKC').replace(/\s+/g, ' ');}
}

安全存储实践 🗄️

// 1. 安全存储管理器
class SecureStorageManager {constructor(storage = localStorage) {this.storage = storage;this.encryptionKey = this.getOrCreateKey();}// 获取或创建加密密钥getOrCreateKey() {let key = this.storage.getItem('encryption_key');if (!key) {key = crypto.getRandomValues(new Uint8Array(32));this.storage.setItem('encryption_key', key);}return key;}// 加密数据async encrypt(data) {const encoder = new TextEncoder();const dataBuffer = encoder.encode(JSON.stringify(data));const iv = crypto.getRandomValues(new Uint8Array(12));const key = await crypto.subtle.importKey('raw',this.encryptionKey,'AES-GCM',false,['encrypt']);const encryptedData = await crypto.subtle.encrypt({name: 'AES-GCM',iv},key,dataBuffer);return {data: Array.from(new Uint8Array(encryptedData)),iv: Array.from(iv)};}// 解密数据async decrypt(encryptedData) {const key = await crypto.subtle.importKey('raw',this.encryptionKey,'AES-GCM',false,['decrypt']);const decryptedData = await crypto.subtle.decrypt({name: 'AES-GCM',iv: new Uint8Array(encryptedData.iv)},key,new Uint8Array(encryptedData.data));const decoder = new TextDecoder();return JSON.parse(decoder.decode(decryptedData));}
}// 2. 敏感数据处理器
class SensitiveDataHandler {// 掩码处理static mask(value, start = 0, end) {const str = String(value);const maskLength = end ? end - start : str.length - start;const maskStr = '*'.repeat(maskLength);return str.slice(0, start) + maskStr + str.slice(start + maskLength);}// 数据脱敏static desensitize(data, rules) {const result = { ...data };for (const [key, rule] of Object.entries(rules)) {if (result[key]) {result[key] = this.mask(result[key],rule.start,rule.end);}}return result;}
}

安全通信实践 📡

// 1. 安全WebSocket
class SecureWebSocket {constructor(url, options = {}) {this.url = url;this.options = options;this.reconnectAttempts = 0;this.maxReconnectAttempts = options.maxReconnectAttempts || 5;this.init();}init() {this.ws = new WebSocket(this.url);this.setupEventHandlers();}setupEventHandlers() {this.ws.onopen = () => {this.reconnectAttempts = 0;if (this.options.onOpen) {this.options.onOpen();}};this.ws.onclose = () => {if (this.reconnectAttempts < this.maxReconnectAttempts) {setTimeout(() => {this.reconnectAttempts++;this.init();}, 1000 * Math.pow(2, this.reconnectAttempts));}};this.ws.onmessage = async (event) => {try {const data = JSON.parse(event.data);if (this.options.onMessage) {this.options.onMessage(data);}} catch (error) {console.error('Invalid message format:', error);}};}send(data) {if (this.ws.readyState === WebSocket.OPEN) {this.ws.send(JSON.stringify(data));}}close() {this.ws.close();}
}// 2. 安全HTTP客户端
class SecureHTTPClient {constructor(baseURL) {this.baseURL = baseURL;this.interceptors = [];}// 添加请求拦截器addInterceptor(interceptor) {this.interceptors.push(interceptor);}// 应用拦截器async applyInterceptors(config) {let currentConfig = { ...config };for (const interceptor of this.interceptors) {currentConfig = await interceptor(currentConfig);}return currentConfig;}// 发送请求async request(config) {const finalConfig = await this.applyInterceptors({...config,headers: {'Content-Type': 'application/json',...config.headers}});try {const response = await fetch(this.baseURL + finalConfig.url,finalConfig);if (!response.ok) {throw new Error(`HTTP error! status: ${response.status}`);}return await response.json();} catch (error) {console.error('Request failed:', error);throw error;}}
}

最佳实践建议 💡

  1. 安全检查工具
// 1. 安全检查器
class SecurityChecker {// 检查安全头部static checkSecurityHeaders(response) {const requiredHeaders = {'Content-Security-Policy': true,'X-Content-Type-Options': 'nosniff','X-Frame-Options': ['DENY', 'SAMEORIGIN'],'X-XSS-Protection': '1; mode=block','Strict-Transport-Security': true};const issues = [];for (const [header, value] of Object.entries(requiredHeaders)) {const actualValue = response.headers.get(header);if (!actualValue) {issues.push(`Missing ${header}`);} else if (value !== true) {if (Array.isArray(value)) {if (!value.includes(actualValue)) {issues.push(`Invalid ${header}: ${actualValue}`);}} else if (value !== actualValue) {issues.push(`Invalid ${header}: ${actualValue}`);}}}return issues;}// 检查安全配置static checkSecurityConfig() {const issues = [];// 检查HTTPSif (window.location.protocol !== 'https:') {issues.push('Not using HTTPS');}// 检查Cookies配置document.cookie.split(';').forEach(cookie => {if (!cookie.includes('Secure')) {issues.push('Cookie without Secure flag');}if (!cookie.includes('HttpOnly')) {issues.push('Cookie without HttpOnly flag');}if (!cookie.includes('SameSite')) {issues.push('Cookie without SameSite attribute');}});return issues;}
}// 2. 安全审计工具
class SecurityAuditor {constructor() {this.vulnerabilities = [];}// 检查DOM XSS漏洞checkDOMXSS() {const dangerousProps = ['innerHTML','outerHTML','insertAdjacentHTML','document.write'];const scripts = document.getElementsByTagName('script');for (const script of scripts) {const content = script.textContent;dangerousProps.forEach(prop => {if (content.includes(prop)) {this.vulnerabilities.push({type: 'DOM XSS',location: script.src || 'inline script',description: `Using dangerous property: ${prop}`});}});}}// 检查不安全的配置checkInsecureConfigs() {// 检查eval使用if (window.eval) {this.vulnerabilities.push({type: 'Insecure Config',description: 'eval is enabled'});}// 检查内联事件处理器document.querySelectorAll('*').forEach(element => {for (const attr of element.attributes) {if (attr.name.startsWith('on')) {this.vulnerabilities.push({type: 'Insecure Config',description: `Inline event handler: ${attr.name}`,element: element.tagName});}}});}// 生成审计报告generateReport() {return {timestamp: new Date().toISOString(),vulnerabilities: this.vulnerabilities,summary: {total: this.vulnerabilities.length,byType: this.vulnerabilities.reduce((acc, vuln) => {acc[vuln.type] = (acc[vuln.type] || 0) + 1;return acc;}, {})}};}
}

结语 📝

JavaScript安全编程是一个复杂且重要的话题,需要我们在开发过程中始终保持警惕。我们学习了:

  1. XSS防护技术
  2. CSRF防御机制
  3. 输入验证与清理
  4. 安全存储实践
  5. 安全通信策略

💡 学习建议:安全性应该在开发的每个阶段都被考虑,而不是作为事后的补充。建议经常进行安全审计,及时修复发现的漏洞。


如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇

终身学习,共同成长。

咱们下一期见

💻

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

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

相关文章

[Linux]从零开始的STM32MP157交叉编译环境配置

一、前言 最近该忙的事情也是都忙完了&#xff0c;也是可以开始好好的学习一下Linux了。之前九月份的时候就想入手一块Linux的开发板用来学习Linux底层开发。之前在NXP和STM32MP系列之间犹豫&#xff0c;思来想去还是入手了一块STM32MP157。当然不是单纯因为MP157的性能在NXP之…

小程序如何引入腾讯位置服务

小程序如何引入腾讯位置服务 1.添加服务 登录 微信公众平台 注意&#xff1a;小程序要企业版的 第三方服务 -> 服务 -> 开发者资源 -> 开通腾讯位置服务 在设置 -> 第三方设置 中可以看到开通的服务&#xff0c;如果没有就在插件管理中添加插件 2.腾讯位置服务…

添加计算机到AD域中

添加计算机到AD域中 一、确定计算机的DNS指向域中的DNS二、打开系统设置三、加域成功后 一、确定计算机的DNS指向域中的DNS 二、打开系统设置 输入域管理员的账密 三、加域成功后 这里有显示&#xff0c;就成功了。

从epoll事件的视角探讨TCP:三次握手、四次挥手、应用层与传输层之间的联系

目录 一、应用层与TCP之间的联系 二、 当通信双方中的一方如客户端主动断开连接时&#xff0c;仅是在客户端的视角下连接已经断开&#xff0c;在服务端的眼中&#xff0c;连接依然存在&#xff0c;为什么&#xff1f;——触发EPOLLRDHUP事件&#xff1a;对端关闭连接或停止写…

使用RSyslog将Nginx Access Log写入Kafka

个人博客地址&#xff1a;使用RSyslog将Nginx Access Log写入Kafka | 一张假钞的真实世界 环境说明 CentOS Linux release 7.3.1611kafka_2.12-0.10.2.2nginx/1.12.2rsyslog-8.24.0-34.el7.x86_64.rpm 创建测试Topic $ ./kafka-topics.sh --zookeeper 192.168.72.25:2181/k…

使用 Docker 部署 Java 项目(通俗易懂)

目录 1、下载与配置 Docker 1.1 docker下载&#xff08;这里使用的是Ubuntu&#xff0c;Centos命令可能有不同&#xff09; 1.2 配置 Docker 代理对象 2、打包当前 Java 项目 3、进行编写 DockerFile&#xff0c;并将对应文件传输到 Linux 中 3.1 编写 dockerfile 文件 …

《研发管理 APQP 软件系统》——汽车电子行业的应用收益分析

全星研发管理 APQP 软件系统在汽车电子行业的应用收益分析 在汽车电子行业&#xff0c;技术革新迅猛&#xff0c;市场竞争激烈。《全星研发管理 APQP 软件系统》的应用&#xff0c;为企业带来了革命性的变化&#xff0c;诸多收益使其成为行业发展的关键驱动力。 《全星研发管理…

22、PyTorch nn.Conv2d卷积网络使用教程

文章目录 1. 卷积2. python 代码3. notes 1. 卷积 输入A张量为&#xff1a; A [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] \begin{equation} A\begin{bmatrix} 0&1&2&3\\\\ 4&5&6&7\\\\ 8&9&10&11\\\\ 12&13&14&15 \end{b…

ASP.NET Core - 依赖注入(四)

ASP.NET Core - 依赖注入&#xff08;四&#xff09; 4. ASP.NET Core默认服务5. 依赖注入配置变形 4. ASP.NET Core默认服务 之前讲了中间件&#xff0c;实际上一个中间件要正常进行工作&#xff0c;通常需要许多的服务配合进行&#xff0c;而中间件中的服务自然也是通过 Ioc…

UE5游戏性能优化指南

解除帧率限制 启动游戏 按 “~” 键 输入 t.MaxFPS 200 可以解除默认帧率限制达到更高的帧率 UE游戏性能和场景优化思路&#xff1a; 1. 可以把可延展性调低&#xff0c;帧率会大幅提高&#xff0c;但画质会大幅降低 2.调整固定灯光&#xff0c;静态光源&#xff…

深度学习中的卷积和反卷积(四)——卷积和反卷积的梯度

本系列已完结&#xff0c;全部文章地址为&#xff1a; 深度学习中的卷积和反卷积&#xff08;一&#xff09;——卷积的介绍 深度学习中的卷积和反卷积&#xff08;二&#xff09;——反卷积的介绍 深度学习中的卷积和反卷积&#xff08;三&#xff09;——卷积和反卷积的计算 …

【C语言】线程

目录 1. 什么是线程 1.1概念 1.2 进程和线程的区别 1.3 线程资源 2. 函数接口 2.1创建线程: pthread_create 2.2 退出线程: pthread_exit 2.3 回收线程资源 练习 1. 什么是线程 1.1概念 线程是一个轻量级的进程&#xff0c;为了提高系统的性能引入线程。 在同一个进…

【C语言】字符串函数详解

文章目录 Ⅰ. strcpy -- 字符串拷贝1、函数介绍2、模拟实现 Ⅱ. strcat -- 字符串追加1、函数介绍2、模拟实现 Ⅲ. strcmp -- 字符串比较1、函数介绍2、模拟实现 Ⅳ. strncpy、strncat、strncmp -- 可限制操作长度Ⅴ. strlen -- 求字符串长度1、函数介绍2、模拟实现&#xff08…

Windows部署NVM并下载多版本Node.js的方法(含删除原有Node的方法)

本文介绍在Windows电脑中&#xff0c;下载、部署NVM&#xff08;node.js version management&#xff09;环境&#xff0c;并基于其安装不同版本的Node.js的方法。 在之前的文章Windows系统下载、部署Node.js与npm环境的方法&#xff08;https://blog.csdn.net/zhebushibiaoshi…

centos 8 中安装Docker

注&#xff1a;本次样式安装使用的是centos8 操作系统。 1、镜像下载 具体的镜像下载地址各位可以去官网下载&#xff0c;选择适合你们的下载即可&#xff01; 1、CentOS官方下载地址&#xff1a;https://vault.centos.org/ 2、阿里云开源镜像站下载&#xff1a;centos安装包…

STM32-笔记40-BKP(备份寄存器)

一、什么是BKP&#xff08;备份寄存器&#xff09;&#xff1f; 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT维持供电。当系统在待机模式下被唤醒&#xff0c;或…

vue-cli项目配置使用unocss

在了解使用了Unocss后&#xff0c;就完全被它迷住了。接手过的所有项目都配置使用了它&#xff0c;包括一些旧项目&#xff0c;也跟同事分享了使用Unocss的便捷性。 这里分享一下旧项目如何配置和使用Unocss的&#xff0c;项目是vue2vue-cli构建的&#xff0c;node<20平常开…

新增文章分类功能

总说 过程参考黑马程序员SpringBoot3Vue3全套视频教程&#xff0c;springbootvue企业级全栈开发从基础、实战到面试一套通关_哔哩哔哩_bilibili 目录 总说 一、功能实现 1.1 Controller层 1.2 Service层 1.3 Impl层 1.4 Mapper层 1.5 测试接口 二、优化 2.1 2.2 一、…

知识图谱常见的主流图数据库

在知识图谱中&#xff0c;主流使用的图数据库包括以下几种&#xff1a; Neo4j&#xff1a;这是目前全球部署最广泛的图数据库之一&#xff0c;具有强大的查询性能和灵活的数据模型&#xff0c;适用于复杂关系数据的存储和查询。 JanusGraph&#xff1a;JanusGraph是一个开源的…

JavaSE学习心得(多线程与网络编程篇)

多线程-网络编程 前言 多线程&JUC 多线程三种实现方式 第一种实现方式 第二种实现方式 第三种实现方式 常见成员方法 买票引发的安全问题 同步代码块 同步方法 Lock锁 生产者和消费者 常见方法 等待唤醒机制 练习 抢红包 抽奖 多线程统计并求最…