web安全之XSS攻击

news2024/12/28 19:10:25

什么是XSS攻击

XSS(Cross-Site Scripting)又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行。XSS是一种经常出现在 Web 应用程序中的计算机安全漏洞,是由于 Web 应用程序对用户的输入过滤不足而产生的。

常见的 XSS 攻击有三种:反射型、DOM-based 型、存储型。 其中反射型、DOM-based 型可以归类为非持久型 XSS 攻击,存储型归类为持久型 XSS 攻击。

1.反射型

反射型 XSS 一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。

对于访问者而言是一次性的,具体表现在我们把我们的恶意脚本通过 URL 的方式传递给了服务器,而服务器则只是不加处理的把脚本“反射”回访问者的浏览器而使访问者的浏览器执行相应的脚本。反射型 XSS 的触发有后端的参与,要避免反射性 XSS,必须需要后端的协调,后端解析前端的数据时首先做相关的字串检测和转义处理。

此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。
整个攻击过程大约如下:
在这里插入图片描述

2.DOM-based 型

客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。例如客户端如从 URL 中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到 DOM-based XSS 攻击。需要特别注意以下的用户输入源 document.URLlocation.hashlocation.searchdocument.referrer 等。

整个攻击过程大约如下:
在这里插入图片描述

3.存储型

攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此储存型XSS的危害会更大。

存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

整个攻击过程大约如下:
在这里插入图片描述

XSS 攻击的危害

XSS 可以导致:

  1. 攻击劫持访问;
  2. 盗用 cookie 实现无密码登录;
  3. 配合 csrf 攻击完成恶意请求;
  4. 使用 js 或 css 破坏页面正常的结构与样式等;

防御方法

1、 XSS 防御之 HTML 编码

应用范围:将不可信数据放入到 HTML 标签内(例如div、span等)的时候进行HTML编码。

编码规则:将 & < > " ’ / 转义为实体字符(或者十进制、十六进制)。

示例代码:

 function encodeForHTML(str, kwargs){
    return ('' + str)
      .replace(/&/g, '&amp;')
      .replace(/</g, '&lt;')     // DEC=> &#60; HEX=> &#x3c; Entity=> &lt;
      .replace(/>/g, '&gt;')
      .replace(/"/g, '&quot;')
      .replace(/'/g, '&#x27;')   // &apos; 不推荐,因为它不在HTML规范中
      .replace(/\//g, '&#x2F;');
  }; 

HTML 有三种编码表现方式:十进制、十六进制、命名实体。例如小于号(<)可以编码为 “十进制> <”, “十六进制=> <”, “命名实体=> <” 三种方式。对于单引号(')由于实体字符编码方式不在 HTML 规范中,所以此处使用了十六进制编码。

2、XSS 防御之 HTML Attribute 编码

应用范围:将不可信数据放入 HTML 属性时(不含src、href、style 和事件处理属性),进行 HTML Attribute 编码

编码规则:除了字母数字字符以外,使用 &#xHH;(或者可用的命名实体)格式来转义ASCII值小于256所有的字符​​​​​​​

示例代码:

 function encodeForHTMLAttibute(str, kwargs){
    let encoded = '';
    for(let i = 0; i < str.length; i++) {
      let ch = hex = str[i];
      if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {
        hex = '&#x' + ch.charCodeAt(0).toString(16) + ';';
      }
      encoded += hex;
    }
    return encoded;
  }; 

3、XSS 防御之 JavaScript 编码

作用范围:将不可信数据放入事件处理属性、JavaScirpt值时进行 JavaScript 编码

编码规则:除字母数字字符外,请使用\xHH格式转义ASCII码小于256的所有字符

示例代码:

 function encodeForJavascript(str, kwargs) {
    let encoded = '';
    for(let i = 0; i < str.length; i++) {
      let cc = hex = str[i];
      if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {
        hex = '\\x' + cc.charCodeAt().toString(16);
      }
      encoded += hex;
    }
    return encoded;
  }; 

4、XSS 防御之 URL 编码

作用范围:将不可信数据作为 URL 参数值时需要对参数进行 URL 编码

编码规则:将参数值进行 encodeURIComponent 编码

示例代码:

 function encodeForURL(str, kwargs){
    return encodeURIComponent(str);
  }; 

5、 XSS 防御之 CSS 编码

作用范围:将不可信数据作为 CSS 时进行 CSS 编码

编码规则:除了字母数字字符以外,使用\XXXXXX格式来转义ASCII值小于256的所有字符

示例代码:

 function encodeForCSS (attr, str, kwargs){
    let encoded = '';
    for (let i = 0; i < str.length; i++) {
      let ch = str.charAt(i);
      if (!ch.match(/[a-zA-Z0-9]/) {
        let hex = str.charCodeAt(i).toString(16);
        let pad = '000000'.substr((hex.length));
        encoded += '\\' + pad + hex;
      } else {
        encoded += ch;
      }
    }
    return encoded;
  }; 

后记

在任何时候用户的输入都是不可信的。对于 HTTP 参数,理论上都要进行验证,例如某个字段是枚举类型,其就不应该出现枚举以为的值;对于不可信数据的输出要进行相应的编码;此外httpOnlyCSPX-XSS-ProtectionSecure Cookie 等也可以起到有效的防护。

XSS 漏洞有时比较难发现,所幸当下React、Vue等框架都从框架层面引入了 XSS 防御机制,一定程度上解放了我们的双手。 但是作为开发人员依然要了解 XSS 基本知识、于细节处避免制造 XSS 漏洞。框架是辅助,我们仍需以人为本,规范开发习惯,提高 Web 前端安全意识。

网络安全相关资料

面我准备了很多网络安全学习资料,包括视频教程+学习路线+必读电子书+相关工具安装包+面试题等欢迎大家来白嫖
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【282G】网络安全&黑客技术零基础到进阶全套学习大礼包,免费分享!

【282G】网络安全&黑客技术零基础到进阶全套学习大礼包,免费分享!

【282G】网络安全&黑客技术零基础到进阶全套学习大礼包,免费分享!

vx扫描下方二维码即可免费领取哦~
在这里插入图片描述

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

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

相关文章

基于react18+arco+zustand通用后台管理系统React18Admin

React-Arco-Admin轻量级后台管理系统解决方案 基于vite4构建react18后台项目ReactAdmin。使用了reactarco-designzustandbizcharts等技术架构非凡后台管理框架。支持 dark/light主题、i18n国际化、动态路由鉴权、3种经典布局、tabs路由标签 等功能。 技术框架 编辑器&#xff…

pip install huggingface_hub时报错

pip install huggingface_hub时报错&#xff1a; 可以尝试&#xff1a;pip install --upgrade huggingface_hub 进行安装 方法参考了&#xff1a;https://blog.csdn.net/m0_72295867/article/details/132060750

vue.js - 断开发送的请求,解决接口重复请求数据错误问题(vue中axios多次相同请求中断上一个)

描述 进入页面时第一个接口还在请求,立即切换tab请求第二个接口。但是第二个接口响应比第一个接口响应快,页面展示的时第一个接口的数据,如图: 解决方法 判断如果是相同的接

谷歌浏览器跨域及--disable-web-security无效解决办法

谷歌浏览器跨域设置 &#xff08;1&#xff09;创建一个目录&#xff0c;例如我在C盘创建MyChromeDevUserData文件夹 &#xff08;2&#xff09; 在桌面选择谷歌浏览器右键 -> 属性 -> 快捷方式 -> 目标&#xff0c;添加--disable-web-security --user-data-dirC:\M…

第六届物业管理创新发展论坛在深召开,鹏业受邀参加并发表主题演讲

10月12日至14日&#xff0c;由中国物业管理协会&#xff08;以下简称“中物协”&#xff09;主办&#xff0c;物业管理行业唯一报备商务部的国际性展会——2023中国国际物业管理产业博览会&#xff08;以下简称“物博会”&#xff09;在深圳会展中心隆重举行。 本届物博会同期还…

Docker是一个流行的容器化平台,用于构建、部署和运行应用程序。

文章目录 Web应用程序数据库服务器微服务应用开发环境持续集成和持续部署 (CI/CD)应用程序依赖项云原生应用程序研究和教育 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;…

基于PHP的创意设计分享系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

Cron表达式每月20号晚18点执行

Cron表达式每月20号晚18点执行 0 0 18 20 * ?验证正确性

linux性能分析(一)如何查看网络的性能指标

一 如何查看网络的性能指标 说明&#xff1a; 以下案例中的相关命令只是粗略讲解,后续会有针对性的细讲补充&#xff1a; 各个案例通过不同维度衡量网络的性能指标 ① 如何进行性能分析 思考&#xff1a;如何进行性能分析?1、前提&#xff1a;一定是系统出现不符合预期的…

MS35774,高精度、低噪声的两相步进电机驱动芯片

兼容替代ADI的TMC2225&#xff08;方案替代&#xff09;.TMC2208&#xff08;P2P&#xff09;&#xff0c;车规MS35774A 低噪声 256 细分微步进电机驱动 MS35774/MS35774A 是一款高精度、低噪声的两相步进 电机驱动芯片&#xff0c;芯片内置功率 MOSFET &#xff0c;长时…

Flutter之Widget生命周期

目录 初始化构造函数initStatedidChangeDependencies 运行时builddidUpdateWidget 组件移除deactivatedisposereassemble 函数生命周期说明&#xff1a;实际场景App生命周期 前言&#xff1a;生命周期是一个组件加载到卸载的整个周期&#xff0c;熟悉生命周期可以让我们在合适的…

Android11 移植memtester压测内存

需求如题&#xff0c;从网上下载了memtest源码压缩包&#xff0c;准备放到系统源码编译&#xff0c;然后push到板子上执行&#xff0c;结果&#xff0c;编译出来一堆问题&#xff0c;报build err。 做如下代码改动&#xff1a; external/memtester-4.5.1/Android.mk | 16 exte…

绝地求生msvcp140.dll丢失的解决方法,教你轻松解决

在计算机的使用过程中&#xff0c;我们可能会遇到各种技术问题。其中&#xff0c;“msvcp140.dll丢失”是一个常见的错误提示。这个错误通常出现在运行某些程序或游戏时&#xff0c;表示找不到所需的DLL文件。本文将详细介绍五种解决此问题的有效方法。 方法一&#xff1a;重新…

java中关键字

主要是java开发面试或笔试中常见或者常考的关键字特性介绍 文章目录 类方法和变量修饰符final关键字abstract关键字static 关键字关于static执行顺序 implements 和 interface 关键字 类方法和变量修饰符 final关键字 用于声明不可变性&#xff0c;它可以应用于变量、方法和类…

浅谈云原生

目录 1. 云原生是什么&#xff1f; 2. 云原生四要素 2.1 微服务 2.2 容器化 2.3 DevOps 2.4 持续交付 3. 具体的云原生技术有哪些&#xff1f; 3.1 容器 (Containers) 3.2 微服务 (Microservices) 3.3 服务网格 (Service Meshes) 3.4 不可变基础设施 (Immutable Inf…

VUE:侧边弹出栏组件,组件中有树状图,搜索框可筛选树状图节点,可收缩

作者:CSDN @ _乐多_ 本文记录了一个侧边弹出栏组件代码。代码即插即用。 弹出栏中有树状图,搜索框,可收缩。 其中,搜索框可筛选树状图节点。点击右侧小按钮可以收缩弹出框,点击X号也可以收缩弹出框。 文章目录 一、组件代码代码依赖element-plus库。且需要下载几个svg图…

CNVD-2021-26422:亿邮电子邮件系统moni_detail.do远程命令执行漏洞复现 [附POC]

文章目录 亿邮电子邮件系统 moni_detail.do 远程命令执行 CNVD-2021-26422漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 亿邮电子邮件系统 moni_detail.do 远程命令执行 CNVD-2021-26422漏洞复…

TSINGSEE智慧港口可视化智能监管解决方案,助力港口码头高效监管

一、方案背景 全球经济一体化进程以及国际市场的不断融合&#xff0c;使得港口码头成为了大型货运周转中心&#xff0c;每天数以百计的大型货轮、数以千计的大型集装箱、数以万计的人员流动。港口作为货物、集装箱堆放及中转机构&#xff0c;具有昼夜不歇、天气多变、环境恶劣…

基于内存的分布式NoSQL数据库Redis(三)常用命令

文章目录 知识点07&#xff1a;String类型的常用命令知识点08&#xff1a;Hash类型的常用命令知识点09&#xff1a;List类型的常用命令知识点10&#xff1a;Set类型的常用命令知识点11&#xff1a;Zset类型的常用命令知识点12&#xff1a;BitMap类型的常用命令知识点13&#xf…

PMP考完后应该考什么?

PMP&#xff08;项目管理专业&#xff09;认证是全球范围内最受认可和尊重的项目管理资格证书之一。通过PMP考试的人已经展示了他们在项目管理领域的知识和技能。然而&#xff0c;项目管理是一个不断发展和变化的领域&#xff0c;持续学习和进一步提升自己的能力是非常重要的。…