XSS攻击原理与解决方法

参考: web安全之XSS攻击原理及防范_xss攻击原理与解决方法-CSDN博客 

跨站脚本攻击(XSS)分类介绍及解决办法_反射型跨站脚本解决方案-CSDN博客

一、概述

XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击。一旦攻击成功,它可以获取到用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实施比如SQL注入攻击服务器和数据库,Click劫持,相对链接劫持等实施钓鱼,他带来的危害是巨大的,是Web安全的头号大敌。

二、攻击的条件 

实施XSS攻击需要具备的两个条件:

2.1需要向web页面注入恶意代码;

2.2这些恶意代码能够被浏览器成功的执行。

三、根据XSS攻击的效果可以分为几种类型

XSS反射型攻击:恶意代码并没有保存在目标网站,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击的。

XSS存储型攻击:恶意代码被保存到目标网站的服务器中,这种攻击具有较强的稳定性和持久性,比较常见场景是在博客,论坛等社交网站上,但OA系统,和CRM系统上也能看到它身影,比如:某CRM系统的客户投诉功能上存在XSS存储型漏洞,黑客提交了恶意攻击代码,当系统管理员查看投诉信息时恶意代码执行,窃取了客户的资料,然而管理员毫不知情,这就是典型的XSS存储型攻击。

四、XSS攻击能做些什么

1.窃取cookies,读取目标网站的cookie发送到黑客的服务器上

 2.读取用户未公开的资料,如果:邮件列表或者内容、系统的客户资料。联系人列表等等

  1. 可以窃取 Cookie 信息。恶意 JavaScript 可以通过“document.cookie”获取 Cookie 信息,然后通过 XMLHttpRequest 或者 Fetch 加上 CORS 功能将数据发送给恶意服务器;恶意服务器拿到用户的 Cookie 信息之后,就可以在其他电脑上模拟用户的登录,然后进行转账等操 作。
  2. 可以监听用户行为。恶意 JavaScript 可以使用“addEventListener”接口来监听键盘事件,比如可以获取用户输入的信用卡等信息,将其发送 到恶意服务器。黑客掌握了这些信息之后,又可以做很多违法的事情。
  3. 可以通过修改 DOM伪造假的登录窗口,用来欺骗用户输入用户名和密码等信息。
  4. 还可以在页面内生成浮窗广告,这些广告会严重地影响用户体验。

五、解决办法

5.1 一种方法就是在表单提交或者url参数传递前,对需要的参数进行过滤。请看如下XSS过滤工具类代码

5.1.1在项目的web.xml配置过滤器:
<filter>  <filter-name>XssEscape</filter-name>  <filter-class>XssFilter</filter-class>  </filter>  <filter-mapping>  <filter-name>XssEscape</filter-name>  <url-pattern>/*</url-pattern>  </filter-mapping>

 5.1.2 XssFilter实现:

public class XssFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response);}@Overridepublic void destroy() {}  
}
5.1.3  XssHttpServletRequestWrapper实现:
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {public XssHttpServletRequestWrapper(HttpServletRequest request) {super(request);}@SuppressWarnings("rawtypes")public Map<String,String[]> getParameterMap(){Map<String,String[]> request_map = super.getParameterMap();Iterator iterator = request_map.entrySet().iterator();while(iterator.hasNext()){Map.Entry me = (Map.Entry)iterator.next();String[] values = (String[])me.getValue();for(int i = 0 ; i < values.length ; i++){values[i] = xssClean(values[i]);}}return request_map;}public String[] getParameterValues(String paramString){String[] arrayOfString1 = super.getParameterValues(paramString);if (arrayOfString1 == null)return null;int i = arrayOfString1.length;String[] arrayOfString2 = new String[i];for (int j = 0; j < i; j++){arrayOfString2[j] = xssClean(arrayOfString1[j]);}return arrayOfString2;}public String getParameter(String paramString){String str = super.getParameter(paramString);if (str == null)return null;return xssClean(str);}public String getHeader(String paramString){String str = super.getHeader(paramString);if (str == null)return null;str = str.replaceAll("\r|\n", "");return xssClean(str);}private String xssClean(String value) {//ClassLoaderUtils.getResourceAsStream("classpath:antisamy-slashdot.xml", XssHttpServletRequestWrapper.class)if (value != null) {// NOTE: It's highly recommended to use the ESAPI library and// uncomment the following line to// avoid encoded attacks.// value = encoder.canonicalize(value);value = value.replaceAll("\0", "");// Avoid anything between script tagsPattern scriptPattern = Pattern.compile("<script>(.*?)</script>",Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Avoid anything in a src='...' type of expressionscriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE| Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid anything in a href='...' type of expressionscriptPattern = Pattern.compile("href[\r\n]*=[\r\n]*\\\"(.*?)\\\"",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE| Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Remove any lonesome </script> tagscriptPattern = Pattern.compile("</script>",Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Remove any lonesome <script ...> tagscriptPattern = Pattern.compile("<script(.*?)>",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE| Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid eval(...) expressionsscriptPattern = Pattern.compile("eval\\((.*?)\\)",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE| Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid expression(...) expressionsscriptPattern = Pattern.compile("expression\\((.*?)\\)",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE| Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");// Avoid javascript:... expressionsscriptPattern = Pattern.compile("javascript:",Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Avoid vbscript:... expressionsscriptPattern = Pattern.compile("vbscript:",Pattern.CASE_INSENSITIVE);value = scriptPattern.matcher(value).replaceAll("");// Avoid οnlοad= expressionsscriptPattern = Pattern.compile("onload(.*?)=",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE| Pattern.DOTALL);value = scriptPattern.matcher(value).replaceAll("");}  return value; }
}

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

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

相关文章

ThinkPHP6中使用GatewayWorker

首先是先安装 composer require workerman/gateway-worker composer require workerman/gatewayclient下载demo 服务器开通TCP端口8282、1238 将Applications\YourApp目录随便放ThinkPHP6的哪个位置&#xff0c;我这里放在了app\gateway\ws目录中 配置composer.json "…

【竞技宝】DOTA2-喀山:莫言帕克毁天灭地 IG让一追二力克Neon

北京时间2024年2月21日,喀山未来运动会DOTA2项目在昨天迎来第二个比赛日。本日第二轮第二场比赛由IG对阵Neon。本场比赛两队在前两局各取一胜,决胜局IG的防守反击多次击溃Neon,最终IG让一追二击败Neon。以下是本场比赛的详细战报。 第一局: 首局比赛,IG在天辉方,Neon在夜魇方。…

c++try-catch块的使用和异常处理机制。异常的传播和捕获规则。

ctry-catch块的使用和异常处理机制。 在C中&#xff0c;try-catch块是一种异常处理机制&#xff0c;用于在程序执行期间捕获和处理可能发生的异常。try块用于包含可能抛出异常的代码&#xff0c;而catch块则用于捕获并处理这些异常。 以下是try-catch块的基本用法和异常处理机…

Python自动化部署与配置管理:Ansible与Docker

Ansible 和 Docker 是两种常用于自动化部署和配置管理的工具。Ansible 是一个基于 Python 的自动化运维工具&#xff0c;可以配置管理、应用部署、任务自动化等。而 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&…

算法项目(2)—— LSTM、RNN、GRU(SE注意力)、卡尔曼轨迹预测

本文包含什么? 项目运行的方式(包教会)项目代码LSTM、RNN、GRU(SE注意力)、卡尔曼四种算法进行轨迹预测.各种效果图运行有问题? csdn上后台随时售后.项目说明 本文实现了三种深度学习算法加传统算法卡尔曼滤波进行轨迹预测, 预测效果图 首先看下不同模型的指标: 模型RM…

unity学习(33)——角色选取界面(原版)

10ARPG网络游戏编程实践&#xff08;十&#xff09;&#xff1a;角色选择UI及创建面板制作&#xff08;一&#xff09;&#xff08;流畅&#xff09;_哔哩哔哩_bilibili 角色选择界面教程中是这样的&#xff01;&#xff08;这个美工肯定是不能拿出去卖的&#xff0c;但是是有…

IP协议及相关技术协议

一、IP基本认识 1. IP的作用 IP在TCP/IP模型中处于网络层&#xff0c;网络层的主要作用是实现主机与主机之间的通信&#xff0c;而IP的作用是在复杂的网络环境中将数据包发送给最终目的主机。 2. IP与MAC的关系 简单而言&#xff0c;MAC的作用是实现“直连”的两个设备之通信…

77、Spring、Spring Boot和Spring Cloud的关系

77、Spring、Spring Boot和Spring Cloud的关系 随着 Spring、Spring Boot 和 Spring Cloud 的不断发展&#xff0c;越来越多的开发者加入 Spring 的大军中。对于初学者而言&#xff0c;可能不太了解 Spring、Spring Boot 和 Spring Cloud 这些概念以及它们之间的关系&#xff…

[IO复用] Windows IOCP的初步学习

文章目录 前言正文重叠 IO如何理解重叠IO&#xff1a;创建重叠IO重叠IO操作的返回值如何确认IO操作的结果 IOCP比重叠IO多了什么IOCP的流程IOCP和EPOLL的比较 参考 前言 提起IO复用&#xff0c;大部分人首先接触的都是Select、Poll、Epoll&#xff0c;但是在不同的系统中&…

10个行锁、死锁案例⭐️24张加锁分析图彻底搞懂Innodb行锁加锁规则!

10个行锁、死锁案例⭐️24张加锁分析图&#x1f680;彻底搞懂Innodb行锁加锁规则&#xff01; 上篇文章 我们描述原子性与隔离性的实现&#xff0c;其中描述读操作解决隔离性问题的方案时还遗留了一个问题&#xff1a;写操作是如何解决不同的隔离性问题&#xff1f; 本篇文章…

linux CentOs 安装docker 推荐生产环境使用

目录 1. 在CentOs上安装docker所需的系统环境 2. 卸载旧版本 2.1 查看是否已安装docker 2.2 卸载已安装的docker 3. 安装方式 3.1 使用rpm存储库安装(推荐使用该方法) 3.2 从包中安装 4. 开始docker 1. 在CentOs上安装docker所需的系统环境 需要以下CentOS版本之一的维…

数据结构-邻接链表

介绍 邻接矩阵是运用较多的一种储存图的方法&#xff0c;但如果一张网图边数较少&#xff0c;就会出现二维矩阵中大部分数据为0的情况&#xff0c;浪费储存空间 为了避免空间浪费&#xff0c;也可以采用数组与链表结合的方式来存储图 假设有这样一张图 我们可以先用一个数组…

C#中的Async的异常处理

在C#的代码编写中可以通过try/catch来捕获Exception。然而当调用Async方法时需要特别注意 private void Start() {try{TestVoid();}catch (Exception e){Debug.LogException(e);} }private async void TestVoid() {var t Task.Delay(1);await t;throw new Exception("Te…

测试环境搭建整套大数据系统(四:ubuntu22.4创建普通用户)

一&#xff1a;创建用户&#xff0c;修改密码&#xff0c;增加sudo权限。 useradd dolphinscheduler #输入密码 passwd dolphinscheduler # 配置 sudo 免密 sed -i $adolphinscheduler ALL(ALL) NOPASSWD: NOPASSWD: ALL /etc/sudoers sed -i s/Defaults requirett/#Defa…

实现一个python代码编辑器

代码编辑器采用了monacoEditor&#xff0c;一个现成的编辑器。网上有很多文档介绍和开源项目&#xff0c;但是怎么说呢&#xff0c;跟着做&#xff0c;可以实现一个网页编辑器&#xff0c;可以高亮python的语法&#xff0c;但是没有python的提示&#xff0c;找不到可以参考的&a…

ADO.NET和EF框架性能对比

ADO.NET和Entity Framework&#xff08;EF&#xff09;框架在性能上有一些不同。总体来说&#xff0c;ADO.NET通常比EF具有更高的性能&#xff0c;特别是在执行大量数据访问操作时。下面是一些关于它们性能差异的要点&#xff1a; 数据库操作方式&#xff1a; ADO.NET&#xf…

C++ 八数码问题理解 `IDA*` 算法原则:及时止损,缘尽即散

1.前言 八数码是典型的状态搜索案例。如字符串转换问题、密码锁问题都是状态搜索问题。 状态搜索问题指由一种状态转换到到最终状态&#xff0c;求解中间需要经过多少步转换&#xff0c;或者说最小需要转换多少步&#xff0c;或者说有多少种转换方案。本文和大家聊聊八数码问…

使用哈希函数删除哈希值相同的文件

哈希函数及哈希值的定义 哈希函数是一种将任意长度的输入数据映射为固定长度的输出数据的函数。它通过对输入数据执行一系列复杂的数学运算&#xff0c;将数据转换为固定长度的唯一标识&#xff0c;这个唯一标识就是哈希值。 哈希函数的作用 数据唯一性: 对于不同的输入数据&…

Java面试题:volatile专题

王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 今天是《面霸的自我修养》第4篇文章,我们一起来看看面试中会问到哪些关于volatile的问题吧。数据来源: 大部分来自于各机构(Java之父,Java继父,某灵,某泡,某客)以及各博主整理文档…

Java程序中为什么要使用StringBuilder

遇到这个问题是来源于leetcode的一道题&#xff1a;字符串解码。其中的题解涉及字符串的操作使用的是StringBuilder&#xff0c;不是String。 class Solution {public String decodeString(String s) {StringBuilder res new StringBuilder();int multi 0;LinkedList<Int…