知识卡片
解析别贪正则
内容
正则适合识别局部模式(如数字格式、URL片段),但不严谨的正则易留安全漏洞——如用 [^?#]* 匹配URL路径会连行结束符、控制字符等一起放行。正则规则复杂到同一字符可能只因位置不同而含义不同,结构复杂的正则难阅读,还可能导致移植性和性能问题(嵌套回溯)。发散:表达式开始模拟嵌套结构或多阶段语法时,应考虑专门解析器而非堆叠量词分组。
参考来源
- 位置:《JavaScript语言精粹(修订版)》第7章《正则表达式 Regular Expressions》"一个例子"一节
- 结论依据:原文在讲解 parse_url 正则的路径捕获分组 `(?:\/([^?#]*))?` 时明确承认"注意我在这里的处理是不严谨的……某些恶意文本可能会有渗漏进来的风险。不严谨的正则表达式是一个常见的安全漏洞发源地",并总结"结构复杂或令人费解的正则表达式很有可能导致移植性问题……嵌套的正则表达式也能导致极恶劣的性能问题。因此简单是最好的策略",据此推出正则应保持简单、复杂语法解析不宜硬塞进正则的结论。
- 原始内容:这个类匹配除?和#之外的所有字符,其中包括了行结束符、控制字符,以及其他大量不应在此被匹配的字符……不严谨的正则表达式是一个常见的安全漏洞发源地……结构复杂或令人费解的正则表达式很有可能导致移植性问题。在执行某些匹配时,嵌套的正则表达式也能导致极恶劣的性能问题。因此简单是最好的策略。