详解XSS和CSRF

article/2025/11/4 22:06:12

关于XSS

xss是跨站脚本攻击,攻击者通过“注入”,在网页中插入恶意代码,从而被浏览器执行所造成的一种攻击方式。

举一些实例,它可以进行如下操作:

1.窃取用户的cookie信息。恶意代码可以通过执行 ”doccument.cookie“获取用户的cookie信息,然后发送给恶意服务器

2.监听用户的输入行为。使用 "addEventListener"接口来监听键盘事件,比如可以获取用户输入的银行卡及密码等个人信息。

3.在页面生成浮窗广告或执行alert弹窗,造成不好的用户体验。

XSS类型

XSS攻击可以分为三类:反射型,存储型,DOM型

1.反射型XSS攻击

反射型攻击是指用户提交恶意代码给服务器,服务器又将恶意代码反射给浏览器端,例如在url请求中加上script代码,那么浏览器在访问相应url时就会执行恶意代码

2.存储型XSS攻击

如上图所示,攻击者利用站点漏洞将恶意代码提交到网站的数据库中,当用户进行访问时,就会执行相应的恶意代码,脚本代码会将用户信息上传到黑客服务器。

在实际应用中,如果在登录页面,用户名输入框中输入<script>alert('存储型 XSS 攻击')</script>代码,服务端在存储相应信息之后,返回成功的登录名,就会执行这段代码,在页面形成弹窗。

存储型攻击与反射型攻击的区别在于,服务器端是否存储了相应的恶意代码。

3.DOM型XSS攻击

 这是发生在前端的攻击,通过恶意脚本修改页面的DOM节点,从js中输出数据到HTML页面中

与普通XSS不同的是,DOM XSS是在浏览器的解析中改变页面DOM树,且恶意代码并不在返回页面源码中回显,这使我们无法通过特征匹配来检测DOM XSS

基于DOM攻击大致需要经历以下几个步骤

  1. 攻击者构造出特殊的URL,其中包含恶意代码
  2. 用户打开带有恶意代码的URL
  3. 用户浏览器接受到响应后执行解析,前端JavaScript取出URL中的恶意代码并执行
  4. 恶意代码窃取用户数据并发送到攻击者的网站,冒充用户行为,调用目标网站接口执行攻击者指定的操作

防御办法

1.对输入进行检查和转码

输入检查一般是检查用户输入的数据是都包含一些特殊字符,如 <>'"等。如果发现特殊字符,则将这些字符过滤或编码。这种可以称为 “XSS Filter”。

安全的编码函数

针对HTML代码的编码方式是 HtmlEncode(是一种函数实现,将字符串转成 HTMLEntrities)

& --> &amp;
< --> &lt;
> --> &gt;
" --> &quot;

相应的, JavaScript的编码方式可以使用 JavascriptEncode。

假如说用户输入了 <script>alert("你被攻击了")</script>,我们要对用户输入的内容进行过滤(如果包含了 <script> 等敏感字符,就过滤掉)或者对其编码,如果是恶意的脚本,则会变成下面这样

&lt;script&gt;alert("你被攻击了");&lt;/script&gt;

经过转码之后的内容,如 <script>标签被转换为 &lt;script&gt;,即使这段脚本返回给页面,页面也不会指向这段代码。

2.利用CSP

CSP (Content Security Policy) 即内容安全策略,是一种可信白名单机制,可以在服务端配置浏览器哪些外部资源可以加载和执行。可以通过这种方式来尽量减少 XSS 攻击。

通常可以通过两种方式来开启 CSP:

  • 设置 HTTP Header 的 Content-Security-Policy
Content-Security-Policy: default-src 'self'; // 只允许加载本站资源
Content-Security-Policy: img-src https://*  // 只允许加载 HTTPS 协议图片
Content-Security-Policy: child-src 'none'    // 允许加载任何来源框架
  • 设置 meta 标签的方式
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none'">

关于CSRF

跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

一个典型的CSRF攻击有着如下的流程:

  • 受害者登录a.com,并保留了登录凭证(Cookie)。
  • 攻击者引诱受害者访问了b.com。
  • b.com 向 a.com 发送了一个请求:a.com/act=xx。
  • a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。
  • a.com以受害者的名义执行了act=xx。
  • 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作。

三种常见的攻击方式:

1.GET类型的CSRF

通常请求被放置在img标签的src中,当用户访问了包含这个标签的网页时,浏览器会自动向src中的地址提交一次http请求

2.自动发起POST类型请求

通过构建一个隐藏的表单,表单的内容就是自动发起支付的接口请求。当用户打开该页面时,这个表单会被自动执行提交。当表单被提交之后,服务器就会执行转账操作。因此使用构建自动提交表单这种方式,就可以自动实现跨站点 POST 数据提交。

3.链接类型

通过夸张的广告诱导用户点击链接,跳转到危险的网站,该网站自动自动发送请求,冒充用户执行相应的操作。

因此,CSRF有以下两个特点:一是通常发生在第三方域名,二是攻击者不能访问cookie信息,只是使用。针对这两个方面,对CSRF攻击进行相应的防护。

防护措施:

1.确定来源域名。

由于CSRF攻击大多来自第三方站点,可以在服务器端验证请求来源的站点,禁止第三方站点的请求。 可以通过HTTP请求头中的 Referer和Origin属性确定来源域名。

2.设置CSRF Token

在用户首次发出请求时,服务器为该用户生成一个token(一般是随机字符串和时间戳生成的随机数组合),之后所有的请求都携带这个token,在有效期内服务器进行验证。由于攻击者无法获取这个随机的token,可以防护csrf攻击。

3.为Set-Cookie响应头新增Samesite属性

SameSite有3个可选值: Strict, Lax和None

Samesite=Strict,严格模式,浏览器完全禁止第三方cookie,只有本站点访问本站点的资源,才会携带cookie

Samesite=Lax,宽松模式,在跨站点的情况下,从第三方站点链接打开和从第三方站点提交 Get方式的表单这两种方式都会携带Cookie。但如果在第三方站点中使用POST方法或者通过 img、Iframe等标签加载的URL,这些场景都不会携带Cookie。

Samesite=none,任何情况下都可以发送cookie数据


http://chatgpt.dhexx.cn/article/TTDjWLNG.shtml

相关文章

XSRF CRFS(跨站请求伪造,单点登录攻击) 特点和原理

CSRF 特点和原理 CSRF&#xff1a;Cross Site Request Forgery&#xff0c;跨站请求伪造 概念&#xff1a;跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;也被称为 one-click attack 或者 session riding&#xff0c;通常缩写为…

Linux常用命令——tail命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tail 在屏幕上显示指定文件的末尾若干行 补充说明 tail命令用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个&#xff0c;则在显示的每个文件前面加一个文件名…

Linux中tail命令的使用

tail 命令可用于查看文件的内容&#xff0c;有一个常用的参数 -f 常用于查阅正在改变的日志文件。 tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上&#xff0c;并且不断刷新&#xff0c;只要 filename 更新就可以看到最新的文件内容。 tail [参数] [文件] …

Linux tail 命令

tail 命令可用于查看文件的内容&#xff0c;有一个常用的参数 -f 常用于查阅正在改变的日志文件。 tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上&#xff0c;并且不断刷新&#xff0c;只要 filename 更新就可以看到最新的文件内容。 命令格式&#xff1a…

关于tail 命令

tail命令 用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个&#xff0c;则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”&#xff0c;则读取标准输入。 1.如果给定的文件不止一个&#xff0c;则在…

Linux命令-tail

1、tail 对应中文意思为“尾巴”“跟踪” 2、Linux系统中tail 命令用于将每个文件的最后10行打印到标准输出 3、tail -f filename 会把filename文件里的最尾部的内容显示在屏幕上 并且不断刷新 只要filename更新就可以看到最新的文件内容 常用于追踪文件内容 4、实例 tail …

tail命令,实时查看日志文件

一、前言 Linux 实时查看日志文件&#xff0c;最主要使用的就是tail命令。 linux tail命令用于显示文件尾部的内容&#xff0c;默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个&#xff0c;则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名…

Linux - tail命令详解

一、作用 查看应用项目日志信息 说明&#xff1a;一般在应用项目目录下有个logs的目录文件&#xff0c;会存放日志文件&#xff0c;有个xxx.log的文件&#xff0c;可以用tail -f 动态实时查看后端日志二、语法 tail [选项] 文件名选项说明-f实时读取-1000查看最近1000行日志 …

windows下使用tail命令

tail 命令为linux 下的常用查看日志命令&#xff0c;可惜在windows下没有&#xff0c;还好有好心人开发了一个可以在Windows下的运行的小工具&#xff0c;来给分享一下: 链接: https://pan.baidu.com/s/1-LiogYgYcAEbZUstdEZURg 密码: 1w6p 使用方法&#xff1a; 下载后解压…

linux命令tail-f,【玩转Linux命令】tail命令详解

Hi&#xff0c;明娜桑&#xff0c;哦哈哟~。 今天小编给大家带来的“玩转linux命令之tail篇”&#xff0c;tail命令是咱们工作中经常用到的命令&#xff0c;常用于动态文件的查看&#xff0c;接下来搜狗华安带你来一起了解tail命令。 tail命令简介 linux tail命令用途是按照要求…

Linux之tail命令

tail命令从指定点将文件写到标准输出,使用tail命令的-f选项可以方便的查看正在改变的日志。tail -f nohup.out会把nohup.out最尾部的内容显示在屏幕上,并且不断刷新,能一直看到最新的文件内容。 命令格式 tail [必要参数] [选择参数] [文件] 命令功能 使用tail命令可以查看文…

tail命令详解

1. tail命令简介 linux tail命令用途是按照要求将指定的文件的最后部分输出到标准设备&#xff0c;一般是终端&#xff0c;通俗来讲&#xff0c;就是把某个档案文件的最后几行显示到终端上&#xff0c;如果该档案有更新&#xff0c;tail会自动刷新&#xff0c;确保你看到最新的…

Linux命令之 --- tail命令

tail命令&#xff0c;主要是查看文件内容。结合一些参数&#xff0c;更方便于查看动态的文件内容&#xff0c;比如日志信息等。 【tail -f filename】显示文件的尾部最后10行的信息&#xff0c;并且循环刷新&#xff0c;只要文件有更新&#xff0c;就会将更新信息显示到屏幕上&…

tail命令的常见用法

tail 是Linux中最常用的一个命令了, 他可以显示一个或者多个文件, 同时可以与管道符结合, tail最常用的是监视和分析日志文件等, 还可以和grep搭配使用 tail命令语法 首先了解一下tail命令的语法&#xff0c;格式如下: tail [OPTION]... [FILE]... [OPTION]是选项 [FILE]是文件…

tail 命令详解

一、tail 命令介绍 tail 命令可以将文件指定位置到文件结束的内容写到标准输出。 如果你不知道tail命令怎样使用&#xff0c;可以在命令行执行命令tail --help就能看到tail命令介绍和详细的参数使用介绍&#xff0c;内容如下&#xff08;我帮大家翻译了一下&#xff09;。 […

git之公钥登录

首先说一下我自己的理解&#xff0c;为什么要公钥登录呢&#xff1f;这样可以省去每次填写用户名和密码的麻烦。他的原理是什么呢&#xff1f;我本地发送一个带有私钥签名的请求去远程服务器(远程服务有我的公钥)&#xff0c;而服务器能够通过我的公钥验证我的私钥&#xff0c;…

Git注册登录

一、执行登陆用户名和密码命令 git config --global user.email “youexample.com”git config --global user.name “Your Name” 二、生成 .ssh 配置文件&#xff08;创建本地公钥&#xff09; ssh-keygen -t rsa -C "your_emailyouremail.com" #### 三、获取公钥四…

Git--SSH登录

SSH登录 进入当前用户的家目录 $ cd ~ 删除.ssh目录 $ rm -rvf .ssh 运行命令生成.ssh密钥目录 $ ssh-keygen -t rsa -C atguigu2018ybuqaliyun.com [注意&#xff1a;这里-C这个参数为大写的C] 进入.ssh目录查看文件列表 $ cd .ssh $ ls -LF 查看id_rsa.pub文件内容 $ cat…

git初次登陆使用

git初次登陆使用 一. 安装git 二. 在当前项目根目录点击鼠标右键,出来下图: 点击进入git命令行界面。 三.初始化项目 git init 四. 添加所有文件到项目中 git add . 五. 尝试提交所有文件 git commit -m "这里是备注信息" -a 我由于是第一次连接git,还没登…

切换电脑上登录的Git账号

切换电脑上登录的Git账号 1、在电脑桌面上右键&#xff0c;选择“Git Bash Here”&#xff0c;打开命令行 2、查看当前Git账号、邮箱&#xff1a; git config user.name git config user.email 3、切换Git账号&#xff1a; git config --global user.name 账号名 //账号…