特殊字符:安全攻防中容易遗漏的细节
本文分享自华为云社区《【安全攻防】深入浅出实战系列专题-特殊字符校验》,作者: MDKing。
特殊字符校验的背景
-
SQL注入、XSS等常见的安全攻击场景会涉及到一些特殊字符的利用。尤其是界面输入框、API接口可支持输入字符串的情况,如果对来历不明的用户输入如果不加防范,很容易产生安全问题。
-
正确的做法是在根据业务流程在各个环节添加合适的安全防护、处理逻辑。例如:对于输入的字符串参数做一定的参数校验、对参与执行SQL操作的参数进行预编译、对于参与界面回显的参数针对回显的上下文领域做对应领域的编码等。
-
由于根据不同的业务流程需要针对特殊字符做的安全防护各有不同,相应的设计、实现等成本较高,所以通常大家会倾向于尽量在第一道防线(参数校验)上解决大部分的问题,降低后续流程处理的工作量跟难度。所以本文旨在分析探讨如何在参数校验阶段,设计好针对不可信字符串的校验、过滤,尤其是特殊字符相关的校验。
特殊字符校验的原则
参考华为Web应用安全开发规范:确保输入数据只包含允许的字符集,不包含不合法和危险的字符,尽可能采取“白名单”的方式进行输入校验。
总体思路是分两种情况:
-
输入范围较为明确的字段,如XXid、XXname、邮箱、手机号等。可以明确列出允许输入范围的,要使用白名单的校验方式。例如如果对于用户名只允许包含字母、数字和下划线,则可以使用正则表达式对输入做白名单校验:^[0-9A-Za-z_]+$
-
输入范围较大、较不明确的字段,如备注、富文本内容等,由于全量的特殊字符(包括键盘可直接输入、键盘不可直接输入)集数量还是非常大的,当业务上也没法通过简单的白名单枚举的方式枚举出合法字符的范围时,就需要根据业务流程,选择相关的危险字符,进行黑名单的过滤校验。例如,存在一个remark字段用户保存后会展示在界面上被其他用户看到,此时我们要对XSS做重点关注,我们可以通过如下正则校验字符串是否不包含指定的危险字符^[^"'()<>/&=]+$。
延伸:注意,参数校验只是为了低成本的一次性解决大部分的问题,不能完全强依赖这个环节的校验,也不能强求这个校验把所有的有可能出现风险的字符都包含全。比如,上例的remark如果业务上就是需要输入(、)、=等符号怎么办?难道就是不允许输入吗?也是不合理的。所以对于XSS注入防护的终极方案依然是在渲染前做字符编码,这样既能支持多数字符的输入,又不会有安全问题。所以还是建议特殊字符校验只选择最通用危险的少量特殊字符,配合其它的安全防护(比如字符编码、SQL预编译等)。
常见安全场景对应的危险特殊字符表
使用指导:在做安全评估时,可将字母、数字、中文以及无安全攻击场景的字符作为安全最小集,如果不涉及自定义拼接SQL,可以忽略第一列。
特殊字符 | SQL注入攻击 | XSS | 命令注入 | 文件包含攻击 | XXE | URL编码攻击 | CSV注入 |
, | 需过滤 | ||||||
. | 需过滤 | ||||||
? | |||||||
! | 需过滤 | 需过滤 | |||||
: | |||||||
; | 需过滤 | 需过滤 | 需过滤 | ||||
" | 需过滤 | 需过滤 | 需过滤 | ||||
' | 需过滤 | 需过滤 | 需过滤 | ||||
( | 需过滤 | 需过滤 | 需过滤 | ||||
) | 需过滤 | 需过滤 | 需过滤 | ||||
[ | 需过滤 | ||||||
] | |||||||
{ | |||||||
} | |||||||
< | 需过滤 | 需过滤 | 需过滤 | 需过滤 | |||
> | 需过滤 | 需过滤 | 需过滤 | 需过滤 | |||
- | 需过滤 | 需过滤 | |||||
_ | 需过滤 | ||||||
/ | 需过滤 | 需过滤 | 需过滤 | 需过滤 | 需过滤 | 需过滤 | |
\ | 需过滤 | 需过滤 | 需过滤 | ||||
| | 需过滤 | 需过滤 | |||||
@ | 需过滤 | 需过滤 | |||||
# | |||||||
$ | 需过滤 | ||||||
% | 需过滤 | 需过滤 | |||||
^ | 需过滤 | ||||||
& | 需过滤 | 需过滤 | 需过滤 | ||||
* | 需过滤 | ||||||
+ | 需过滤 | 需过滤 | 需过滤 | ||||
= | 需过滤 | 需过滤 | 需过滤 | ||||
~ | 需过滤 | ||||||
` | 需过滤 | ||||||
空格 | 需过滤 | 需过滤 | |||||
换行 | 需过滤 |
特殊字符实战
半角/全角之别
除了汉字是默认全角之外,其它很多字符,比如字母、数字、标点符号都是有半角/全角之分的,大家最常用的是半角,全角不常用。但是如果是涉及到写黑白名单的正则的时,如果不知道其中的差别,会导致写错。
在UE中可以显示字节长度,我们分别输入字母、数字、标点符号的半角(占一个字节宽度)、全角(占两个字节宽度)形式,对比如下:
通过如下验证,可以发现,^[a-zA-Z0-9,.]+$ 只能只能匹配半角的字符,全角的是没法匹配的。
想要匹配全角的字母,数字,可以使用^[\uFF21-\uFF3A\uFF41-\uFF5A\uFF10-\uFF19]+$,实际验证如下:
回车/换行符之别
回车(\r):CR(Carriage Return的缩写,ASCII码是13,16进制对应0D),告诉打字机需要“把打印头定位在行首”
换行(\n):LF(Line Feed的缩写,Ascii码是10,16进制对应0A),告诉打字机“把打印纸向下移动一行”
源自于二战中美国使用的打字机,电子计算机问世后,这两个概念也同时被引入。因为存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就够了。从此,计算机界就出现了分歧:
-
微软Windows系统:每行结尾有“<回车><换行>”,即“\r\n”
-
Unix/Linux系统: 每行结尾只有“<换行>”,即"\n"
-
苹果Mac系统: 每行结尾只有“<回车>”,即"\r"
如果不清楚这些概念,很容易导致写错正则表达式。我们分别在window、linux系统上创建文件,内容为AB{换行}AB。如下,通过肉眼是看不出区别的:
在UE中按下Ctrl+H可查看二进制,如下可以看到window文件的换行符实际上为0D 0A,即\r\n。
linux文件的换行符只有一个0A,即\n
通过代码将文件内容读取后,使用正则表达式做判断,发现^[AB\nAB]+$只能成功匹配linux下的文件。
通过debug也能看到两个文件读取出来的具体内容

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
京东哥伦布即时设计平台ChatGPT落地实践 | 京东云技术团队
一、平台介绍 🤖 即时设计平台是一个即时搭建c端楼层的开发平台,支持通过导入relay设计稿url完成Ui2Code,在此基础上完成前端可视化搭建,同时支持通过ChatGPT完成一句话需求,搭建后的楼层自动同步ihub楼层市场,提供到通天塔、哥伦布等搭建平台使用。 1.1 平台能力 🤖 在哥伦布即时设计中,即时设计能力主要包括以下几个方面: 1. 画布编辑能力:即时设计平台提供了丰富的画布编辑功能,包括添加、删除、复制、调整层级等操作,可以灵活地编辑页面的结构和布局。 2. 样式配置能力:即时设计平台支持对页面元素的样式进行配置,包括字体、颜色、大小、边框等,可以根据需求进行自定义的样式设置。 3. 数据接口配置能力:即时设计平台支持与数据接口的绑定,可以通过配置数据接口来实现页面内容的动态展示,提高页面的灵活性和可扩展性。 4. 交互事件配置能力:即时设计平台支持对页面元素的交互事件进行配置,包括点击、滑动、弹窗等,可以实现页面的交互效果,提升用户体验。 5. 预览和下载能力:即时设计平台提供了在线预览和下载代码的功能,可以实时查看页面效果,并将设计的页面代码下载到本地进行...
- 下一篇
开源 Serverless 框架 Laf 性能优化实践
介绍 Laf 是一个完全开源的 Serverless 框架,Laf 的 Node.js 运行时容器 (以下简称为 Runtime) 是 Laf 的函数执行环境,依托于 Express.js 框架。采用容器进程常驻的方式,每一个应用对应于一个或多个容器 (弹性伸缩下),底层使用了 Node.js 的 vm 模块,使用 MongoDB 的 watch() 方法来监听函数变更事件,以实现函数发布和配置发布。 Node.js vm 模块 Node.js 的 vm 模块是一个提供虚拟机功能的模块,用于在 Node.js 环境中创建一个独立的 JavaScript 执行环境。它允许在应用程序中运行和控制一段 JavaScript 代码,同时提供了一些安全性和隔离性。 这个模块包括一些可用于创建隔离的执行环境的函数,使得代码能够在独立的上下文中运行,防止对主应用程序的影响。这在某些情况下可以提供更高的安全性,例如在沙盒环境中执行用户提供的代码,或者实现一些动态加载和执行代码的需求。 原文链接:https://forum.laf.run/d/1146 为什么要优化 目前 Laf 的函数运行时存在以下问...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题