特殊字符:安全攻防中容易遗漏的细节

这篇具有很好参考价值的文章主要介绍了特殊字符:安全攻防中容易遗漏的细节。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文分享自华为云社区《【安全攻防】深入浅出实战系列专题-特殊字符校验》,作者: MDKing。

特殊字符校验的背景

  • SQL注入、XSS等常见的安全攻击场景会涉及到一些特殊字符的利用。尤其是界面输入框、API接口可支持输入字符串的情况,如果对来历不明的用户输入如果不加防范,很容易产生安全问题。

  • 正确的做法是在根据业务流程在各个环节添加合适的安全防护、处理逻辑。例如:对于输入的字符串参数做一定的参数校验、对参与执行SQL操作的参数进行预编译、对于参与界面回显的参数针对回显的上下文领域做对应领域的编码等。

  • 由于根据不同的业务流程需要针对特殊字符做的安全防护各有不同,相应的设计、实现等成本较高,所以通常大家会倾向于尽量在第一道防线(参数校验)上解决大部分的问题,降低后续流程处理的工作量跟难度。所以本文旨在分析探讨如何在参数校验阶段,设计好针对不可信字符串的校验、过滤,尤其是特殊字符相关的校验。

特殊字符校验的原则

参考华为Web应用安全开发规范:确保输入数据只包含允许的字符集,不包含不合法和危险的字符,尽可能采取“白名单”的方式进行输入校验。

总体思路是分两种情况:

  1. 输入范围较为明确的字段,如XXid、XXname、邮箱、手机号等。可以明确列出允许输入范围的,要使用白名单的校验方式。例如如果对于用户名只允许包含字母、数字和下划线,则可以使用正则表达式对输入做白名单校验:^[0-9A-Za-z_]+$

  2. 输入范围较大、较不明确的字段,如备注、富文本内容等,由于全量的特殊字符(包括键盘可直接输入、键盘不可直接输入)集数量还是非常大的,当业务上也没法通过简单的白名单枚举的方式枚举出合法字符的范围时,就需要根据业务流程,选择相关的危险字符,进行黑名单的过滤校验。例如,存在一个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。如下,通过肉眼是看不出区别的:

 文章来源地址https://www.toymoban.com/news/detail-759292.html

在UE中按下Ctrl+H可查看二进制,如下可以看到window文件的换行符实际上为0D 0A,即\r\n。

linux文件的换行符只有一个0A,即\n

通过代码将文件内容读取后,使用正则表达式做判断,发现^[AB\nAB]+$只能成功匹配linux下的文件。

通过debug也能看到两个文件读取出来的具体内容

点击关注,第一时间了解华为云新鲜技术~

 

到了这里,关于特殊字符:安全攻防中容易遗漏的细节的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [网络安全/前端XSS防护]一文带你了解HTML的特殊字符转义及编码

    在 HTML 中,有一些特殊字符不可直接使用,需要使用转义字符或实体编码来表示。这是为了避免这些字符与 HTML 标签和语法产生冲突。同时,也是为了防范前端XSS。 例如,有些特殊字符(如 和 )作为HTML标签的一部分,要是没有被特殊处理可能被恶意XSS。 HTML的特殊字符转义

    2024年02月06日
    浏览(57)
  • 【网络安全/前端XSS防护】一文带你了解HTML的特殊字符转义及编码

    在 HTML 中,有一些特殊字符不可直接使用,需要使用转义字符或实体编码来表示。这是为了避免这些字符与 HTML 标签和语法产生冲突。同时,也是为了防范前端XSS。 例如,有些特殊字符(如 和 )作为HTML标签的一部分,要是没有被特殊处理可能被恶意XSS。 HTML的特殊字符转义

    2024年02月04日
    浏览(45)
  • 【学习】Web测试是在测什么?有哪些容易被忽视的小细节?

    Web测试,这个看似简单的词汇,却关乎着互联网产品的质量和用户体验。那么,Web测试到底在测什么呢? 在探讨这个问题之前,让我们先了解一下Web测试的定义:Web测试是一种针对Web应用程序的测试过程,旨在发现并纠正其中的错误和缺陷,以确保产品的稳定性和可靠性。在

    2024年03月20日
    浏览(47)
  • 容易忽视的细节:Log4j 配置导致的零点接口严重超时

    作者:vivo 互联网服务器团队- Jiang Ye 本文详细的记录了一次0点接口严重超时的问题排查经历。本文以作者自身视角极具代入感的描绘了从问题定位到具体的问题排查过程,并通过根因分析并最终解决问题。整个过程需要清晰的问题排查思路和丰富的问题处理经验,也离不开

    2023年04月23日
    浏览(45)
  • Python程序员如何写简历容易找到好工作?分享4个制作简历的细节

    在写简历时,你需要注意很多细节,因为简历是展示你个人能力和经验的关键。在本次前端简历写作法文章中,我们分享了一些写简历的技巧和要点,以帮助你写出一份优秀的简历。我们将进一步探讨一些你不应该在简历中写的东西,以及你应该如何避免一些常见的错误。

    2024年02月02日
    浏览(37)
  • ERP系统安全遗漏:企业资源规划(ERP)系统未得到适当保护

    近年来,随着信息化程度的不断加深和供应链管理的复杂化需求增长, 企业资源规划(ERP)系统成为越来越多企业的核心业务支持工具之一. 然而,由于缺乏有效的安全管理措施和安全意识培训等方面的原因 ,许多企业在实施和使用 ERP 系统时未能重视安全问题 。这使得一些

    2024年02月19日
    浏览(42)
  • 移动应用安全遗漏:组织内使用的移动应用未被纳入防火墙策略

    随着企业越来越依赖移动设备来处理敏感信息和执行关键任务, 移动应用的潜在安全风险也随之上升. 其中一些风险包括未经授权的访问、数据泄露和恶意软件感染等. 因此在企业中实施有效的移动风险管理方案是至关重要的.本文将探讨移动应用安全问题以及组织如何制定合适

    2024年02月02日
    浏览(35)
  • 如何判断某列某个单元格是否包含特殊字符(如空格、数字、下划线等等),并返回特殊字符

    VBA代码已写好,直接粘贴到VBA编辑器并保存,即可使用。也可以下载我写好的保存了宏代码的excel文件,直接调用即可。我的excel文件中也包含了很多重度办公人士经常需要用到的其他函数,目前的函数较少,后续会不断更新新的宏函数进去,并会在我的博客中进行功能介绍使

    2024年02月13日
    浏览(66)
  • Java截取某个特殊字符前后的字符串

    思路:想要根据某个特殊字符进行截取字符串,最终是要用到 substring() 函数,那么关键,是要找到特殊字符所在的位置,也就是要用到函数 indexOf() 和 laseIndexOf() 两个函数。 举例:  1.找到第一个“_”的位置。 2.找到第二个“_”的位置。是在第一个“_”的基础上寻找。 3.找

    2024年02月11日
    浏览(38)
  • MySQL 特殊字符

    大咖好呀,我是恋喵大鲤鱼。 鄙人第三本开源书籍《MySQL快速上手》上线啦,欢迎大家协同共建。 SQL 注释是用来在 SQL 语句中添加对代码的解释说明。SQL 支持两种类型的注释符号。 单行注释:使用两个连续的减号(–)表示。减号后面的内容将被视为注释,直到该行结束。

    2024年02月10日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包