您现在的位置是:首页 > 正文

xss攻击

2024-04-01 04:48:12阅读 3

之前介绍过csrf攻击,那个是通过编写恶意页面来通过跨域请求来调用用户的api

现在介绍的是xss攻击,这种攻击和csrf不同的是,恶意脚本是注入到了用户要访问页面的本身,而不是一个恶意页面

xss攻击按攻击方式可以分为2类:通过url通过数据库

1.非持久性(一般通过url)

举个栗子:

正常发送消息:

http://www.test.com/message.php?send=Hello,World!

页面不经过过滤,直接把Hello,World!插入页面

非正常发送消息:

http://www.test.com/message.php?send=<script>alert(‘foolish!’)</script>!

这是页面就会弹窗出来显示foolish

2.持久性(存到了数据库)

再举个栗子:

留言板表单中的表单域:<input type=“text” name=“content” value=“这里是用户填写的数据”>

正常操作:

用户是提交相应留言信息;将数据存储到数据库;其他用户访问留言板,应用去数据并显示。

非正常操作:

攻击者在value填写<script>alert(‘foolish!’)</script>【或者html其他标签(破坏样式。。。)、一段攻击型代码】;

将数据存储到数据库中;

其他用户取出数据显示的时候,将会执行这些攻击性代码

规避方法

方法有2种:

1. 字符串转义

  自己写一个转移方法:

function escape(str) {
  str = str.replace(/&/g, '&amp;')
  str = str.replace(/</g, '&lt;')
  str = str.replace(/>/g, '&gt;')
  str = str.replace(/"/g, '&quto;')
  str = str.replace(/'/g, '&#39;')
  str = str.replace(/`/g, '&#96;')
  str = str.replace(/\//g, '&#x2F;')
  return str
}

  用社区的力量,例如 js-xss 库:

const xss = require('xss')
let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>')
// -> <h1>XSS Demo</h1>&lt;script&gt;alert("xss");&lt;/script&gt;
console.log(html)

2. CSP (Content-Security-Policy)

  推荐阅读:https://developers.google.com/web/fundamentals/security/csp/?hl=zh-cn

  本质就是一份 白名单,说明来自哪的资源,可以用。

  使用方式有 2 种:Http Header 和 meta 标签

// http header
Content-Security-Policy: script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:

// meta 标签
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">

上面的脚本做了如下限制:

  • 脚本:只信任当前域名
  • <object>标签:不信任任何URL,即不加载任何资源
  • 样式表:只信任cdn.example.orgthird-party.org
  • 框架(frame):必须使用HTTPS协议加载
  • 其他资源:没有限制

启用后,不符合 CSP 的外部资源就会被阻止加载。

Chrome 的报错信息。

  属性:

  • default-src:默认(如果下面的没填,则走这个默认的)
  • base-uri 用于限制可在页面的 <base> 元素中显示的网址。
  • child-src 用于列出适用于工作线程和嵌入的帧内容的网址。例如:child-src https://youtube.com 将启用来自 YouTube(而非其他来源)的嵌入视频(youtube就是通过iframe嵌入的)。 使用此指令替代已弃用的 frame-src 指令。
  • connect-src 用于限制可(通过 XHR、WebSockets 和 EventSource)连接的来源。
  • font-src 用于指定可提供网页字体的来源。Google 的网页字体可通过 font-src https://themes.googleusercontent.com 启用。
  • form-action 用于列出可从 <form> 标记提交的有效端点。
  • frame-ancestors 用于指定可嵌入当前页面的来源。此指令适用于 <frame><iframe><embed> 和 <applet> 标记。此指令不能在 <meta> 标记中使用,并仅适用于非 HTML 资源。
  • frame-src 已弃用。请改用 child-src
  • img-src 用于定义可从中加载图像的来源。
  • media-src 用于限制允许传输视频和音频的来源。
  • object-src 可对 Flash 和其他插件进行控制。
  • plugin-types 用于限制页面可以调用的插件种类。
  • report-uri 用于指定在违反内容安全政策时浏览器向其发送报告的网址。此指令不能用于 <meta> 标记。
  • style-src 是 script-src 版的样式表。
  • upgrade-insecure-requests 指示 User Agent 将 HTTP 更改为 HTTPS,重写网址架构。 该指令适用于具有大量旧网址(需要重写)的网站。

转载于:https://www.cnblogs.com/amiezhang/p/8568658.html

网站文章

  • 谷歌翻译可用地址

    谷歌翻译可用地址

    谷歌翻译可用地址

    2024-04-01 04:47:32
  • RabbitMQ实现延迟消息

    RabbitMQ实现延迟消息

    本文主要讲解mall整合RabbitMQ实现延迟消息的过程,以发送延迟消息取消超时订单为例。

    2024-04-01 04:47:24
  • CentOS7查看开放端口命令及开放端口号

    CentOS7查看开放端口命令及开放端口号

    2024-04-01 04:47:17
  • 遇到报错 ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26‘ not found

    遇到报错 ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26‘ not found

    大多解决方法:需要将/usr/lib/x86_64-linux-gnu/libstdc++.so.6下对应的软连接进行修改替换。这里find后面的路径一般是根据自己服务器中,用户文件所在路径进行修改,...

    2024-04-01 04:46:40
  • Android——UI篇:关于Fragment的构造参数打包release版本报错的问题

    最近在做项目的途中遇到了问题,本来想着在fragment中创建一个构造参数来传递数据,获取Activity中的数据,如下: public class FaultVideoFragment extends android.app.Fragment { private FaultEnclosureModel model2; private FaultDetailsActivity

    2024-04-01 04:46:33
  • vue3系列--reactive实现细节

    vue3系列--reactive实现细节

    vue3reactive实现细节

    2024-04-01 04:46:26
  • java 外观设计模式

    java 外观设计模式

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。使用时间: 客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接...

    2024-04-01 04:46:20
  • C++的public继承中的public、private和protected

    C++的public继承中的public、private和protected

        C++语言是对C语言的一种增强,而其主要贡献在于,为C语言增加了类和模板等功能,可以帮助实现面向对象编程和代码复用等更方便的功能。    C++语言的类,一般都包含两种成员,分别是成员变量和成员函数。成员变量可以用来表示该类的某些状态,而成员函数则可以用来对这些成员变量进行操作。而对于这些成员而言,最核心的概念当属类的封装和继承的概念。1. 封装    所谓封装,就是编写一个类...

    2024-04-01 04:45:38
  • 假脱机技术Spooling和守护进程

    假脱机技术Spooling和守护进程

    总结:在假脱机打印系统下,对于每个用户而言,系统并非即时执行其程序输出数据的真实打印操作,而只是即时将数据输出到缓冲区,这时的数据并未真正被打印,只是让用户感觉系统正在为自己打印;当系统引入多道程序技...

    2024-04-01 04:45:30
  • linux centos 安装svn,在CentOS 6.3中安装与配置SVN的方法

    安装说明系统环境:CentOS-6.3安装方式:yum install (源码安装容易产生版本兼容的问题)安装软件:系统自动下载SVN软件检查已安装版本复制代码代码如下:#检查是否安装了低版本的SVN...

    2024-04-01 04:45:22