几种极其隐蔽的XSS注入的防护

2023-05-16

XSS注入的本质就是: 某网页中根据用户的输入, 不期待地生成了可执行的js代码, 并且js得到了浏览器的执行. 意思是说, 发给浏览器的字符串中, 包含了一段非法的js代码, 而这段代码跟用户的输入有关.

常见的XSS注入防护, 可以通过简单的 htmlspecialchars(转义HTML特殊字符),strip_tags(清除HTML标签) 来解决, 但是, 还有一些隐蔽的XSS注入不能通过这两个方法来解决, 而且, 有时业务需要不允许清除HTML标签和特殊字符. 下面列举几种隐蔽的XSS注入方法:

IE6/7 UTF7 XSS 漏洞攻击

隐蔽指数: 5
伤害指数: 5

这个漏洞非常隐蔽, 因为它让出现漏洞的网页看起来只有英文字母(ASCII字符), 并没有非法字符, htmlspecialchars 和 strip_tags 函数对这种攻击没有作用. 不过,这个攻击只对 IE6/IE7 起作用, 从 IE8 起微软已经修复了. 你可以把下面这段代码保存到一个文本文件中(前面不要有空格和换行), 然后用 IE6 打开试试(没有恶意代码, 只是一个演示):

+/v8 +ADw-script+AD4-alert(document.location)+ADw-/script+AD4-

最容易中招的就是 JSONP 的应用了, 解决方法是把非字母和数字下划线的字符全部过滤掉. 还有一种方法是在网页开始输出空格或者换行, 这样, UTF7-XSS 就不能起作用了.
因为只对非常老版本的 IE6/IE7 造成伤害, 对 Firefox/Chrome 没有伤害, 所以伤害指数只能给 4 颗星.


参考资料: UTF7-XSS



不正确地拼接 JavaScript/JSON 代码段

隐蔽指数: 5
伤害指数: 5

Web 前端程序员经常在 PHP 代码或者某些模板语言中, 动态地生成一些 JavaScript 代码片段, 例如最常见的:

var a = '<?php echo htmlspecialchars($name); ?>';

不想, $name 是通过用户输入的, 当用户输入 a’; alert(1); 时, 就形成了非法的 JavaScript 代码, 也就是 XSS 注入了.
在解决问题之前, 我们要思考问题的本质是什么? 本质在于程序员可以用字符串来控制整个世界, 却没有用正确的方法来生成正确的字符串, 而是采用了功能强大且原始的”手工字符串拼接”.
只需要把上面的代码改成:

var a = <?php echo json_encode($name); ?>;

去掉单引号, 利用 PHP 的 json_encode() 函数来生成表示字符串的字符串. 这样做是因为, 最好用 json_encode() 函数来生成所有的 JSON 串, 而不要试图自己去拼接. 程序员总是犯这样的错误: 自己去解析 HTTP 报文, 而不是用现成的成熟的库来解析. 用 json_encode() 的好处还在于, 即使业务要求”我要保留单引号”时, XSS注入也可以避免.
隐蔽指数最高级, 伤害所有的通用浏览器. 这种 XSS 注入方式具有非常重要的参考意义.
最后, 根据工作中的经验, 以及我自己和别人犯过的错, 我总结出一个定理: 没有一劳永逸的单一方法可以解决所有 XSS 注入问题.

有用的经验:
●输出 HTML 代码时 htmlspecialchars
●输出 JavaScript 代码时 json_encode
●输入过滤应该用于解决业务限制, 而不是用于解决 XSS 注入(与严进宽出的原则相悖, 所以本条值得讨论)

讨论:
上文提到的经验第3条, 是一种”宽进严出”的原则, 和”严进宽出”原则是相悖的. 其实, 我认为不应该把”严进宽出”作为一条伪真理, 好像除了它其它的说法都不对了似的. “宽进严出”和”严进宽出”应该具有完全相等的地位, 根据实现的成本进行取舍.

例如, 用户的名字可以采用”严进宽出”原则, 不允许用户填写单引号, 大于号小于号等. 但是用户的签名呢? 难道就不能填单引号? 如果要走极端, 想找出一种银弹, 那么我能想到的就是对所有的输入一律进行 htmlspecialchars 和 json_encode(且不说解决不了 utf7-xss).
其实, XSS 注入的解决应该是和输出端相关的. 当需要输出到文本文件时, 过滤和转义都是无必要的. 当输出到 HTML 渲染引擎时, json_encode 是无必要的. 当输出到 JS 引擎时, htmlspecialchars 是无必要的.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

几种极其隐蔽的XSS注入的防护 的相关文章

  • 尝试用Gearman实现分布式处理(PHP)

    本文需要你已对Gearman有个大致了解 顺便再推荐两篇参考文章 http hi baidu com thinkinginlamp blog item ff49972b9e7378f3e6cd40aa html xff08 学学Gearma
  • memcached的分布式算法–一致性hash

    memcached的分布式是什么意思 xff1f 下面假设memcached服务器有node1 xff5e node3三台 xff0c 应用程序要保存键名为 tokyo kanagawa chiba saitama gunma 的数据 首先
  • Linux crontab定时执行任务 命令格式与详细例子

    基本格式 command 分 时 日 月 周 命令 第1列表示分钟1 xff5e 59 每分钟用 或者 1表示 第2列表示小时1 xff5e 23 xff08 0表示0点 xff09 第3列表示日期1 xff5e 31 第4列表示月份1 x
  • php 利用反射API获取类信息

    PHP具有完整的反射API xff0c 可以对类 接口 函数 方法和扩展进行反向工程 反射API并提供方法取出函数 类和方法中的文档注释 本文将介绍使用PHP反射API获取类信息的方法 xff0c 提供完整演示代码 PHP反射API文档地址
  • mysql查询时,offset过大影响性能的原因与优化方法

    mysql查询使用select命令 配合limit offset参数可以读取指定范围的记录 本文将介绍mysql查询时 offset过大影响性能的原因及优化方法 准备测试数据表及数据 1 创建表 span class hljs operat
  • php中常见的header类型

    lt php 使用 mime content type 查看 mimetypes 61 array 39 ez 39 61 gt 39 application andrew inset 39 39 hqx 39 61 gt 39 appli
  • php Captcha 驗證碼類

    lt php Captcha 驗證碼類 Date 2011 02 19 Author fdipzone class Captcha class start private sname 61 39 39 public function con
  • HTML5本地存储不完全指南

    编辑推荐 xff1a 这篇文章来自于黑客志 xff0c 对HTML5的本次存储方式进行了非常全面的介绍和分析 xff0c 对于学习HTML5的开发者来说 xff0c 不容错过哦 历史 在HTML5本地存储之前 xff0c 如果我们想在客户端
  • 线性筛素数

    如题 xff0c 给定一个范围N xff0c 你需要处理M个某数字是否为质数的询问 xff08 每个数字均在范围1 N内 xff09 输入输出格式 输入格式 xff1a 第一行包含两个正整数N M xff0c 分别表示查询的范围和查询的个数
  • 六度分隔理论

    小世界现象 xff08 又称小世界效应 xff09 假设世界上所有互不相识的人只需要很少中间人就能建立起联系 六度分隔理论 xff08 Six Degrees of Separation xff09 后来1967年哈佛大学的心理学教授斯坦利
  • Ubuntu安装MongoDB

    UBuntu上安装MongoDB server 获取最新版本 wget http fastdl mongodb org linux mongodb linux x86 64 2 0 2 tgz 解压缩即可执行 tar zxvf mongod
  • 文件内容去重及排序

    本文将使用 php 和 linux sort 命令两种方法 xff0c 分别实现文件内容去重及排序 xff0c 并提供完成演示代码 1 创建测试文件 写入1000000个数字 xff0c 每行一个数字 span class php span
  • 新浪微博技术架构

    中国首届微博开发者大会在北京举行 xff0c 这是国内微博行业的首场技术盛宴 作为国内微博市场的绝对领军者 xff0c 新浪微博将在此次大会上公布一系列针对开发者的扶持政策 xff0c 以期与第三方开发者联手推动微博行业的整体发展 图为微博
  • Linux 使用pwgen命令创建随机密码

    创建随机密码 xff0c 以前写过一篇 php密码生成类 的文章 PHP密码生成类的功能如下 xff1a 1 可设定密码长度 2 可设定要生成的密码个数 xff0c 批量生成 3 可以指定密码的规则 xff0c 字母 xff0c 数字 xf
  • Mongodb启动命令mongod参数说明

    Mongodb启动命令mongod参数说明 mongod的主要参数有 xff1a 基本配置 quiet 安静输出 port arg 指定服务端口号 xff0c 默认端口27017 bind ip arg 绑定服务IP xff0c 若绑定12
  • PHP接收二进制流并生成文件

    PHP接收二进制流并生成文件 lt php 二进制流生成文件 POST 无法解释二进制流 xff0c 需要用到 GLOBALS 39 HTTP RAW POST DATA 39 或 php input GLOBALS 39 HTTP RAW
  • php利用curl实现多进程下载文件类

    批量下载文件一般使用循环的方式 xff0c 逐一执行下载 但在带宽与服务器性能允许的情况下 xff0c 使用多进程进行下载可以大大提高下载的效率 本文介绍php利用curl的多进程请求方法 xff0c 实现多进程同时下载文件 原理 xff1
  • Linux 使用getopts命令获取命令行参数

    Linux getopts命令用于获取命令行中的参数 调用格式 xff1a span class hljs built in getopts span option string variable 参数说明 xff1a option str
  • mysql表数据行列转换方法

    开发过程中 xff0c 因为历史原因或性能原因 xff0c 需要对表的列数据转为行数据 xff0c 或行数据转换为列数据使用 xff0c 本文将介绍mysql表数据行列转换的方法 xff0c 提供完整演示例子及sql技巧 1 行转列 创建测
  • 关于在vue3中使用setup语法糖后设置name的问题

    当我们不使用setup语法糖时 xff0c 我们可以以上形式设置name span class token operator lt span script lang span class token operator 61 span spa

随机推荐

  • 查看mysql数据库大小、表大小和最后修改时间

    1 查看数据库表基本信息 select from information schema TABLES where information schema TABLES TABLE SCHEMA 61 39 数据库名 39 and inform
  • JS小游戏-象棋暗棋

    游戏图片 xff1a 源文件下載地址 xff1a 点击下载源文件 Javascript 部分 xff1a chinese chess Author fdipzone Date 2012 06 24 Ver 1 0 var gameimg 6
  • nginx快速查看配置文件的方法

    nginx的配置放在nginx conf文件中 xff0c 一般我们可以使用以下命令查看服务器中存在的nginx conf文件 locate nginx conf usr local etc nginx nginx conf usr loc
  • JS小游戏-极速快跑

    游戏图片 xff1a 源文件下载地址 xff1a 点击下载 Javascript部分 xff1a 极速快跑 Author fdipzone Date 2012 07 15 Ver 1 0 var gameimg 61 39 images s
  • php 日志类

    使用php开发的日志处理类 xff0c 本类可自定义多种日志配置 xff0c 根据标签对应配置 代码中方便调用此类进行日志记录操作 提供完整代码及演示例子 xff0c 方便大家学习使用 功能 xff1a 1 自定义日志根目录及日志文件名称
  • Mac OSX使用brew安装旧版本phpunit的方法

    brew又称Homebrew xff0c 是Mac OSX系统的软件包管理工具 xff0c 能在Mac中方便安装或卸载软件 xff0c 类似ubuntu系统的apt get功能 常用命令如下 xff1a 安装软件 brew install
  • Linux shell计算两个文件的交集,并集和差集

    本文介绍linux下shell计算两个文件的交集 xff0c 并集和差集的方法 xff0c 提供完整测试命令与演示 测试文件 a txt span class hljs operator a span c span class hljs n
  • redis中事务(Transaction)的使用

    Redis是一个开源的使用ANSI C语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 xff0c 提供多种语言的API xff0c 支持多种数据存储方式 开发中一般用于缓存 xff0c 队列 xff0c 数据库使
  • Linux 删除文件中空行的方法

    开发过程中 xff0c 源数据文件内可能存在空行 xff0c 为了能更好地使用 xff0c 需要把文件中的空行删除掉 xff0c 对于行中只含有空格或tab的内容 xff0c 可根据需求确定是否作为空行处理 1 文件空行不含空格与tab的处
  • php 基于redis计数器类

    Redis是一个开源的使用ANSI C语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 xff0c 并提供多种语言的API 本文将使用其incr 自增 xff0c get 获取 xff0c delete 清除 方法
  • (入门)python的基本输入和输出

    今天主要为大家详细介绍了python的基本输入和输出 xff0c 文中示例代码介绍的非常详细 xff0c 具有一定的参考价值 xff0c 这也是我们学习python最基本的一步 想要了解更多关于python知识的 xff0c 请点击这个 目
  • MongoDB 集合字段匹配查询方法

    MongoDB是基于分布式文件存储的数据库 xff0c 本文将介绍如何对MongoDB记录中集合字段进行匹配查询 1 创建测试数据库 use testdb db span class hljs preprocessor createUser
  • JS获取访问设备信息的方法

    本文将介绍获取访问网页设备的基本信息的方法 xff0c 提供完整代码及例子 xff0c 方便大家使用 1 获取访问者IP及所在地 span class hljs doctype lt DOCTYPE HTML PUBLIC 34 W3C D
  • mysql在终端执行sql并把结果写入文件的方法

    在终端使用mysql执行语句时 xff0c 我们一般先进入mysql xff0c 然后再在里面执行sql语句 例如 xff1a mysql uroot mysql gt use mydb mysql gt select from user
  • curl使用实例

    本文将介绍curl的使用 xff0c 根据常用的场景 xff0c 提供调用curl实现请求的演示代码及服务端代码 xff0c 方便大家学习使用 1 查看网页源码 curl命令后加网址 xff0c 就可以看到网页源码 curl www spa
  • mysql比对两个数据库表结构的方法

    在开发及调试的过程中 xff0c 需要比对新旧代码的差异 xff0c 我们可以使用git svn等版本控制工具进行比对 而不同版本的数据库表结构也存在差异 xff0c 我们同样需要比对差异及获取更新结构的sql语句 例如同一套代码 xff0
  • shell 去除utf8文件中bom头的方法

    本文介绍使用shell命令 xff0c 批量去除utf8文件中bom头的方法 utf8的bom头由 xEF xBB xBF组成 xff0c 带bom的文件在使用过程中 xff0c 某些软件打开会出现乱码等异常 xff0c 而要把文件重新另存
  • mysql binlog的使用

    本文介绍mysql binlog的使用 xff0c 包括开启 xff0c 关闭 xff0c 查看状态 xff0c 刷新 xff0c 清空 xff0c 查看执行的sql语句等操作 并对5 7及旧版本的设置加以说明 xff0c 方便大家学习 m
  • 阿里云RDS导出数据库结构整理工具

    本文使用shell实现一个小工具 xff0c 可以整理阿里云RDS导出数据库结构的zip文件 xff0c 整理为可直接使用的sql文件 阿里云RDS导出的数据库结构sql需要整理的地方 1 解压后sql文件名称缺少数据库名称标识 阿里云RD
  • 几种极其隐蔽的XSS注入的防护

    XSS注入的本质就是 某网页中根据用户的输入 不期待地生成了可执行的js代码 并且js得到了浏览器的执行 意思是说 发给浏览器的字符串中 包含了一段非法的js代码 而这段代码跟用户的输入有关 常见的XSS注入防护 可以通过简单的 htmls