简述xss的攻击原理及防范措施_安全攻击主要来自

简述xss的攻击原理及防范措施_安全攻击主要来自Web安全系列(一):XSS 攻击基础及原理

大家好,又见面了,我是你们的朋友全栈君。

跨站脚本攻击(XSS)是客户端脚本安全的头号大敌。本文章深入探讨 XSS 攻击原理,下一章(XSS 攻击进阶)将深入讨论 XSS 进阶攻击方式。

本系列将持续更新。

XSS 简介

XSS(Cross Site Script),全称跨站脚本攻击,为了与 CSS(Cascading Style Sheet) 有所区别,所以在安全领域称为 XSS。

XSS 攻击,通常指黑客通过 HTML 注入 篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击行为。在这种行为最初出现之时,所有的演示案例全是跨域行为,所以叫做 “跨站脚本” 。时至今日,随着Web 端功能的复杂化,应用化,是否跨站已经不重要了,但 XSS 这个名字却一直保留下来。

随着 Web 发展迅速发展,JavaScript 通吃前后端,甚至还可以开发APP,所以在产生的应用场景越来越多,越来越复杂的情况下, XSS 愈来愈难统一针对,现在业内达成的共识就是,针对不同的场景而产生的不同 XSS ,需要区分对待。可即便如此,复杂应用仍然是 XSS 滋生的温床,尤其是很多企业实行迅捷开发,一周一版本,两周一大版本的情况下,忽略了安全这一重要属性,一旦遭到攻击,后果将不堪设想。

那什么是 XSS 呢?我们看下面一个例子。

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

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

<body>
  <div id="t"></div>
  <input id="s" type="button" value="获取数据" onclick="test()">
</body>
<script> function test() { // 假设从后台取出的数据如下 const arr = ['1', '2', '3', '<img src="11" onerror="alert(\'我被攻击了\')" />'] const t = document.querySelector('#t') arr.forEach(item => { const p = document.createElement('p') p.innerHTML = item t.append(p) }) } </script>

</html>
复制代码

这个时候我们在页面上点击 获取数据 按钮时,页面上会出现如下信息:

你会发现,本应该作为数据展示在界面上的内容居然执行了,这显然是开发者不希望看到的。

XSS 攻击类型

XSS 根据效果的不同可以分为如下几类:

反射型 XSS

简单来说,反射型 XSS 只是将用户输入的数据展现到浏览器上(从哪里来到哪里去),即需要一个发起人(用户)来触发黑客布下的一个陷阱(例如一个链接,一个按钮等),才能攻击成功,一般容易出现在搜索页面、留言板块。这种反射型 XSS 也叫做 非持久型 XSS(No-persistent XSS)

例如:

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

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

<body>
  <div id="t"></div>
  <input id="s" type="button" value="获取数据" onclick="test()">
</body>
<script> function test() { const arr = ['1', '2', '3', '<img src="11" onerror="console.log(window.localStorage)" />'] const t = document.querySelector('#t') arr.forEach(item => { const p = document.createElement('p') p.innerHTML = item t.append(p) }) } </script>

</html>
复制代码

假设这是一个留言板块,加载到这一页时,页面会输出:

黑客可以轻易盗取存储在你本地浏览器的各种信息,进而模拟登陆信息,黑入账户,进行各种操作。

存储型 XSS

存储型 XSS 会把用户输入的数据 保存 在服务器端,这种 XSS 十分稳定,十分有效,效果持久。存储型 XSS 通常叫做 “持久型 XSS(Persistent XSS)“,即存在时间比较长。

比较常见的场景就是,黑客写下一篇包含恶意代码的文章,文章发表后,所有访问该博客文章的用户都会执行这一段代码,进行恶意攻击。

例如:

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

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

<body>
  <div id="t">
    这是我写的一篇文章
  </div>
</body>
<script> console.log(navigator.userAgent) </script>

</html>
复制代码

直接输出了浏览器信息,黑客可以获取到这些信息后,发送到自己的服务器,随意操作。

DOM Based XSS

实际上,这种类型的 XSS 与是否存储在服务器端无关,从效果上来说也是反射型 XSS,单独划分出来是因为此类 XSS 形成的原因比较特殊。

简单来说,通过修改页面 DOM 节点形成的 XSS,称之为 DOM Based XSS。

例子如下:

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

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

<body>
  <div id="t"></div>
  <input type="text" id="text" value="">
  <input type="button" id="s" value="search" onclick="test()">
</body>
<script> function test() { const str = document.querySelector('#text').value document.querySelector('#t').innerHTML = '<a href="' + str + '" >查找结果</a>' } </script>

</html>
复制代码

该页面的作用是,在输入框内输入一个内容,跳出查找结果能直接跳转,效果如下:

点击查找结果后,页面会自动跳到百度(毒)页面,但是细心的我们会发现,这字符串拼接有可乘之机啊,输入" onclick=alert(/XSS/) //

果然,页面执行了我们输入的东西,上面的内容是,第一个双引号闭合掉href的第一个双引号,然后插入onclick事件,最后注释符 //注释掉第二个双引号,点击跳转链接,脚本就被执行了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107318.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月20日 下午4:00
下一篇 2022年4月20日 下午4:00


相关推荐

  • 开关电源在模拟量采集系统中应用

    开关电源在模拟量采集系统中应用br nbsp nbsp 尽管在模拟量采集系统中 对 ADC 芯片等的供电一般建议最好不用电源 target blank 开关电源 以避免其固有的纹波大 噪声等问题 但电源 target blank 开关电源仍以其高效率 低价格等优点得到广泛应用 尤其是在工业控制等领域 本文介绍电源 target blank 开关电源在模拟量采集系统中的应用 并对可能出现的一些问题进行分析 nbsp br 电源 target blank 开关电源对 ADC 芯片工作的影响及解决方法 br 电源

    2026年2月24日
    1
  • 在国内怎么用netflix(netflix为什么在中国用不了)

    SpringClound和SpringBoot集成时Idea报错:Cannotresolveorg.springframework.cloud:spring-cloud-starter-netflix-eureka-server:unknown原因分析:找不到依赖的jar包查看配置的依赖SpringBoot的版本:2.0.7.RELEASESpringCloud的版本:Finchley.RC1它们不匹配造成异常解决方案:更改SpringCloud的版本为Finch

    2022年4月13日
    172
  • PHP static:静态变量

    PHP static:静态变量静态变量是一个特殊的局部变量 通过前面的学习我们知道 在函数内部定义一个局部变量 函数调用结束之后这个变量就会被销毁 不能继续使用了 而静态变量不同 静态变量在初始化之后 会在程序运行期间会一直存在 和局部变量相比 静态变量具有一下特点 当函数执行完毕后 静态变量不会消失 静态变量只能在函数内部使用 静态变量只会被初始化一次 静态变量初始化的值可以省略 默认值为 null 静态变量的初始值只能是具体的字符串 数值等 而不能是一个表达式 也就是说 静态变量的初始化只进行一次 而且是在

    2026年3月17日
    2
  • 计算机二进制计算过程

    计算机二进制计算过程原文 原码 补码和反码 wqbin 博客园 cnblogs com 1 原码 反码 补码的基础概念和计算方法 源码原码就是符号位加上真值的绝对值 即用第一位表示符号 其余位表示值 比如如果是 8 位二进制 1 原 00000001 1 原 第一位是符号位 因为第一位是符号位 所以 8 位二进制数的取值范围就是 0 gt 127 127 反码反码的表示方法是

    2026年3月16日
    2
  • 最小二乘法原理及应用

    最小二乘法原理及应用最小二乘法是一种在误差估计 不确定度 系统辨识及预测 预报等数据处理诸多学科领域得到广泛应用的数学工具

    2025年8月1日
    10
  • 超算&AI应用周报 Vol.46 | DeepSeek-R1 API接口服务、镜像部署API教程上线,Grok-3发布

    超算&AI应用周报 Vol.46 | DeepSeek-R1 API接口服务、镜像部署API教程上线,Grok-3发布

    2026年3月15日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号