整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

正则表达式速查手册

正则表达式速查手册
>^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$

常处理文字资料或程序代码,常会涉及到在多个文件中对内容进行统一处理的情形。如对批量替换某些文字或按行替换某些内容,或对文档按内容进行分割、合并等,这些操作单靠常用编辑器来完成,效率不会很高,难点在于多个文件。一款专门用于多文件内容转换的软件TextConverter,可以轻松高效地完成各种文件内容批量转换任务。

1. 构建条件 批量替换文档内容

如果要批量替换一批文档中的某些内容,点击“File→Open Files”命令(或按Ctrl+O组合键),打开这些文档。选择右侧窗格中的Replace Text复选框,点击其后的Options按钮,在Search for框中输入要替换的内容,在Replace by框中输入要替换为的内容。这时在左侧窗格下部的Preview窗口中,会显示替换前后的内容预览。点击Replace按钮执行替换(图1)。

如果文档中需替换的内容不止一处,则可以先构造所有替换条件,再行替换。为此,只需在输入完一组Search for和Replace by条件后,点击Add按钮,将该条件加入复合替换列表。选中Show Settings for mutiple Replacements选项,显示所有构造的条件。所有替换条件构造完成后,点击Convert and Save按钮完成替换并保存文件(图2)。

替换的文件也可以保存到一个新文件中,以便留存原文件。先通过“View→Saving Options”命令开启保存选项对话框,然后选择Save as new File选项,在Floder框中指定保存新文件的文件夹,在Name框中指定文件名称格式(支持通配符格式和自定义格式),在Format框中指定文件格式类型(支持文本、图片、网页、程序代码和用户自定义格式)。若不需要保留原文件,选择Delete Original Files选项,替换后会自动删除原文件。条件设好之后,点击Convert and Save替换保存(图3)。

2. 按行批量替换文档内容

文档内容不但可以按关键词实现批量替换,还可以按照行来实现替换。这里的“行”我们可以理解为一个自然段,它可以是一行程序代码,也可以是文章中的一段文字。如果要将某几个行的内容替换为同一段内容,选中Line Number选项,然后输入行号(两个行号之间用半角逗号分隔),在Replace with框中输入要替换为的内容(图4)。按行替换还可以改用行中包含某个文本内容为条件,选择Text选项即可实现。如果选择RegEx选项,则可以构造正则表达式,以应对更为复杂多变的需求。

替换的其他设置与上述类似。设好之后,执行替换和保存操作即可。

3. 多行或多段的批量删除

不但可以实现成批替换,我们还可以用TextConverter一次性删除多个文本中的多行或多段内容。

要删除某些文本,在Actions栏内选择Delete Text,然后在Delete this Text框中输入要删除的内容,点击Add添加更多要删除的内容,执行删除操作。如果要按行作为删除条件进行删除,则选择Delete Lines复选框,然后从列表中选择条件方式,例如按行的范围删除、删除某行之后的行、删除行中包含某文本的行等(图5)。条件构造好之后,点击Convert and Save删除内容并保存文件。

4. HTML代码批量处理

编写网页时,如果要批量处理HTML代码,也可以利用上述软件的批量功能来完成。

在Actions窗格中选择HTML Actions复选框,然后在列表中就可以通过选择,完成移除HTML标记、建立Web链接、建立E-mail链接、删除无用的制表符、替换各种网页代码符号等网页文件的处理任务(图6)。

5. 批量连接和分割文件

有时,我们需要将一些分散的文本连接成一个文件,例如小说章回的连接;有时,又可能需要将其分割开来进行处理。要实现此类任务,可利用TextConverter软件的Join Files和Split Files两个Action选项来完成。只需在选中了Join Files和Split Files复选框之后,点击选项后的Options按钮,构造连接条件或指定分割位置,执行连接或分割操作即可。

6. 在文档中显示文件属性

如果希望在许多文档中自动显示其所在文件的某些属性,例如路径和文件、扩展名文件日期、文件大小、文件类型等,可在文档中以一个通用的常量来表示这些值,在用TextConverter软件转换时,会自动把这些常量转换为该文件的对应属性(图7)。具体操作时,只需在文档的适当位置引用如图所示的常量,在TextConverter中对Constant选项打钩,执行成批转换即可。

文分享自华为云社区《【安全攻防】深入浅出实战系列专题-特殊字符校验-云社区-华为云》,作者: 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。如下,通过肉眼是看不出区别的:


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

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

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

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

关注#华为云开发者联盟# 点击下方,第一时间了解华为云新鲜技术~

华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云