XSS(Cross Site Scripting)攻击简介

news2024/12/31 5:52:40

环境

  • Ubuntu 22.04
  • IntelliJ IDEA 2022.1.3
  • JDK 17.0.3.1
  • Spring Boot 3.0.1
  • Firefox 108.0.2

问题和分析

在IntelliJ IDEA中创建Spring Boot项目 test0116 ,并选中 Spring Web 依赖。

src/main/java 下创建 MyController.java 如下:

package com.example.test0116.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {
    @RequestMapping("/test")
    public String test(String data) {
        String result = "<h1>The input data is:</h1>" + data;

        return result;
    }
}

运行程序,测试一下效果:

➜  ~ curl --silent "http://localhost:8080/test?data=abcdefg"                            
<h1>The input data is:</h1>abcdefg
➜  ~ 

同理,用浏览器来测试一下:

在这里插入图片描述

看起来没有什么问题。API请求包含了 data=xxxxx 的参数,服务器返回的response里也包含了该参数值。

但是,如果 xxxxx 是一段script或者HTML元素的文本,那么实际在页面上显示时,并不是只显示 xxxxx 的文本,而是会把 xxxxx 当作script或者HTML来解析。

例如,令 xxxxx<button onclick="alert('haha')">click me</button> ,如下:

在这里插入图片描述

点击按钮,如下:

在这里插入图片描述

可见,这个API有潜在的风险。比如黑客可以把这个链接发给别人,同时把 xxxxx 替换为一段恶意代码,则其他人如果打开该链接,就会遭受恶意攻击。

比如,黑客给别人的链接里,令 xxxxx<a href="http://bad_link">hello</a> ,则别人打开该链接,页面上就会出现一个恶意网站的链接:

在这里插入图片描述

若点击页面上的链接,就会遭受恶意网站攻击。

同理,网站的页面也可能会被攻击。比如,在 src/main/resources/static 目录下创建HTML文件 test.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
<input id="input1"></input>

<button id="btn1">btn1</button>

<div id="div1"></div>

<script>
    const btn1 = document.getElementById('btn1');

    btn1.onclick = function () {
        const xhr = new XMLHttpRequest();

        const input = document.getElementById('input1').value;

        xhr.open('GET', "http://localhost:8080/test?data=" + input);

        xhr.send();

        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                const data = xhr.responseText;

                const div1 = document.getElementById("div1");
                div1.innerHTML = data;
            }
        }
    }
</script>
</body>

</html>

打开浏览器,访问 http://localhost:8080/test.html ,如下:

在这里插入图片描述

在输入框中输入一些文本,然后点击 btn1 按钮,如下:

在这里插入图片描述

看起来没有问题,但是,类似的,也可以在输入框中输入恶意代码(当然,本例中攻击的是自己的浏览器,这只是一个示例):

在这里插入图片描述
可见,页面上出现了一个恶意链接。

这种攻击手段称为“Cross Site Scripting”,简称“XSS”。

常见的XSS攻击有:

  • 存储型:持久化在服务器中,例如评论功能,发表的评论会存储在服务器,评论本来应该是纯文本,但如果包含了恶意代码,将来就有可能运行并造成攻击。比如在评论中包含JavaScript代码,这样别人在获取评论时,就可能遭受攻击;
  • 反射型:刚才的例子就是反射型,利用用户恶意输入的请求内容,在响应里包含恶意代码;
  • DOM型:不经过服务器,比如发送请求时,本地的脚本会先解析请求的参数,脚本只把参数值看作纯文本,而实际上参数值可能包含了恶意代码,如果脚本处理不当,就有可能造成攻击;

其它

之所以研究这个话题,是因为在代码里,后端代码里会对API请求做参数验证,如果参数值不符合要求,会返回error,以及一个message,大意是“输入参数有误,请检查并更改。参数值:xxxxxx”。也就是说,会把用户不符合条件的参数原封不动的返回给用户。这就跟本文中的例子有点类似,有遭受恶意代码攻击的风险。

如何解决

在网上搜“XSS”,有很多讨论和解决办法,有待深入研究。

如果是像本文中的例子,API返回的是字符串,而且response里既包含HTML或脚本,又包含纯文本,那么很难控制,这应该算是程序设计上的缺陷,因为在服务器端的字符串里,已经把代码和纯文本混在一起,没法区分了。

一个变通的办法是把数据编码,也就是利用转义,强制令其为纯文本,这就不会有代码注入的风险。但是这样一来,前端得到的数据就变了,需要再对其解码,恢复为原先的文本。比如参数验证,明明用户的参数A有误,服务器却告诉用户参数B不正确,这貌似不太合理,不是完美的解决办法。

如果仅返回数据,那么编码/解码应该是OK的。

其实如果返回的是纯文本,比如字符串或者JSON数据,那么只要前端正确的处理,严格把返回数据当作文本,不给其运行的机会,应该也还好吧。

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

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

相关文章

Redis缓冲区不会还有人不知道吧?

1 简介 缓冲区&#xff0c;用一块内存空间暂时存放命令数据&#xff0c;以免因 数据和命令的处理速度&#xff1c;发送速度而导致数据丢失和性能问题。但缓冲区的内存空间有限&#xff0c;若持续&#xff1a; 往里写数据速度&#xff1e;从里读数据速度会导致缓冲区需越来越…

ATGM332D-5N卫星导航模块介绍

ATGM332D-5N卫星导航模块简介ATGM332D-5N系列模块是12X16 尺寸的高性能BDS/GNSS 全星座定位导航模块系列的总称。该系列模块产品都是基于中科微第四代低功耗GNSS SOC单芯片—AT6558&#xff0c;支持多种卫星导航系统&#xff0c;包括中国的BDS&#xff08;北斗卫星导航系统&…

BFS的入门与应用

目录 一、前言 二、BFS原理 二、BFS与最短路径 1、最短路径问题用BFS 2、迷宫&#xff08;2019年省赛&#xff0c;填空题&#xff0c;lanqiaoOJ题号602&#xff09; &#xff08;1&#xff09;字典序最小的最短路径 &#xff08;2&#xff09;输出路径的两种方法 三、B…

拉伯证券|今年首批游戏版号发放,机构看好春节行业景气度恢复

2023年第一批游戏版号发放。 昨日晚间&#xff0c;国家新闻出版署发布1月国产网络游戏审批信息&#xff0c;共88款游戏获批&#xff0c;其我国内各大游戏龙头均有所收成&#xff0c;包含腾讯《黎明觉悟&#xff1a;活力》、网易《逆水寒》&#xff08;移动版&#xff09;、完美…

数据治理:数据治理之道-组织机制-敏捷的治理组织

参考《一本书讲透数据治理》、《数据治理》等 组织机制&#xff1a;敏捷的治理组织 数据、组织、软件平台&#xff0c;是企业数字化转型面临的三座大山 数据&#xff1a;数据是企业数字化转型的根本驱动力之一&#xff0c;数字化转型中的企业必须做好数据治理与应用&#xff…

8Manage:分散的软件正在扼杀公司的生产力

在企业领域&#xff0c;数字化不仅仅是指工具能力&#xff0c;而是指用户如何很好地应用他们的知识来做决策&#xff0c;培养关系&#xff0c;建立声誉&#xff0c;以及动员同事、团队。几十年来&#xff0c;企业已经部署了生产力、搜索和协作平台&#xff0c;以提高员工和业务…

使用 tslib 库

tslib 是专门为触摸屏设备所开发的 Linux 应用层函数库&#xff0c;并且是开源。tslib 为触摸屏驱动和应用层之间的适配层&#xff0c; 它把应用程序中读取触摸屏 struct input_event 类型数据&#xff08;这是输入设备上报给应用层的原始数据&#xff09;并进行解析的操作过程…

ceres学习笔记(三)

学习了example中pose_graph_3d的部分&#xff0c;记录一下学习过程。 前言&#xff1a; 翻译一下readme里面的内容&#xff1a; ... 该示例还说明了如何将 Eigen 的几何模块与 Ceres 的自动微分功能结合使用。 为了表示方向&#xff0c;我们将使用 Eigen 的四元数&#xff…

测试开发 | Pytest 结合 Allure 生成测试报告

本文节选自霍格沃玆测试学院测试开发内部教材&#xff0c;进阶学习文末加群&#xff01; 测试报告在项目中是至关重要的角色&#xff0c;一个好的测试报告&#xff1a; 可以体现测试人员的工作量&#xff1b; 开发人员可以从测试报告中了解缺陷的情况&#xff1b; 测试经理可…

锂电产业如何利用视觉检测系统降本增效?

导语&#xff1a;机器视觉检测已在锂电池生产的各个环节中&#xff0c;为产品产量与质量提供可靠保障。维视智造作为锂电池视觉检测系统提供商&#xff0c;为企业提供专业、系统、稳定的锂电行业解决方案&#xff0c;可保证0漏检&#xff0c;确保安全生产&#xff0c;全面提升生…

炫酷 RGB 之.NET nanoFramework 点灯大师

前面介绍了 .NET nanoFramework 入门&#xff0c;本文继续以微雪的 ESP32-S2-Pico 为例介绍 .NET nanoFramework 的开发&#xff1a;控制 ESP32 板载 RGB 灯 和 外接 RGB 灯。内容包含 状态灯的意义、WS2812 、HSV、PWM 等相关知识。 文章目录1. 背景2. 状态灯的意义3. 板载 LE…

萌新如何使用printf函数?

&#x1f40e;作者的话 如果你搜索输入输出函数&#xff0c;那么你会看到输入输出流、Turbo标准库、标准输出端、stdout什么什么乱七八糟的&#xff0c;作为一个萌新&#xff0c;哪懂这些&#xff1f; 本文介绍萌新在前期的学习中&#xff0c;常用的输入输出函数及其功能~ 跳跃…

ROS2机器人编程简述humble-第二章-Controlling the Iterative Execution .3.1

2.3 ANALYZING THE BR2 BASICS PACKAGE 这一节内容有些多……前一篇&#xff1a;ROS2机器人编程简述humble-第二章-DEVELOPING THE FIRST NODE .2里面只有节点&#xff0c;没有任何实际功能。logger.cpp代码如下所示&#xff1a;#include "rclcpp/rclcpp.hpp"using n…

微信小程序分享的图片被裁切了。怎么让他不裁剪正常比例5:4显示

现在的效果 希望的效果 最主要的是下面的这个函数。把图片转成了5:4的临时图片 cutShareImg(doctorImg:string ){let thatthis;return new Promise((resolve) > {wx.getImageInfo({src: doctorImg, // 这里填写网络图片路径 success: (res) > {var data resconsole.l…

使用 LibreOffice 将 word 转化为 pdf 并解决中文乱码问题

目录 一、安装 LibreOffice 二、解决乱码问题 2.1 查看是否安装中文字体 2.2 准备字体 2.3 导入字体 2.4 验证 项目中有一个在线上传 word 并预览 pdf 报告的需求&#xff0c;因为项目部署在 ubuntu 上面&#xff0c;所以借助libreoffice 实现 word 转 pdf&#xff0c;然…

详细实例说明+典型案例实现 对枚举法进行全面分析 | C++

第五章 枚举法 目录 ●第五章 枚举法 ●前言 1.简要介绍 2.代码及结果示例&#xff08;简单理解&#xff09; 3.生活实例 ●二、枚举法的典型案例——鸡兔同笼&质数求解 1.鸡兔同笼 2.质数求解&#xff08;枚举法&#xff09; ●总结 前言 简单的来说…

最新 vue-cli 构建项目

vue-cli 构建项目 当前使用最新版本构建一个vue node项目 插件 vue-clivueelement-plusroutervuex 安装vue-cli npm install -g vue-cli安装完后 vue --version 查看版本 vue --version创建一个项目 vue create demo这里要选择版本&#xff0c;不同版本要相组合配置的插件…

反射的基本使用

文章目录1. 一个需求引出反射2. 反射机制2.1 Java Reflection2.2 Java 反射机制可以完成2.3 反射相关的主要类2.4 反射优点和缺点2.5 反射调用优化-关闭访问检查3. Class类3.1 基本介绍3.2 Class类的常用方法3.3 获取Class类对象3.4 哪些类型有Class对象3.5 类加载3.6 类加载流…

aws imagebuilder 理解并使用imagebuilder构建pcluster自定义ami

参考资料 ec2-image-builder-workshop Troubleshoot EC2 Image Builder 理解imagebuilder imagebuilder 使用 cinc-client 进行客户端统一配置&#xff0c;CINC is not Chef&#xff0c;而是chef的免费分发版本。 https://cinc.sh/about/ imagebuilder管道的整体逻辑如下 核…

OpenHarmony如何切换横竖屏?

前言在日常开发中&#xff0c;大多APP可能根据实际情况直接将APP的界面方向固定&#xff0c;或竖屏或横屏。但在使用过程中&#xff0c;我们还是会遇到横竖屏切换的功能需求&#xff0c;可能是通过物理重力感应触发&#xff0c;也有可能是用户手动触发。所以本文主要带大家了解…