防止 JavaScript 中的正则表达式回溯

这篇具有很好参考价值的文章主要介绍了防止 JavaScript 中的正则表达式回溯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

防止 JavaScript 中的正则表达式回溯

正则表达式是用于在软件应用程序中操作和验证文本的强大工具。然而,某些正则表达式模式可能容易受到回溯的影响,这可能会导致超线性运行时,并可能导致DoS攻击。在本文中,我们将探讨什么是回溯、它如何导致性能问题以及如何在正则表达式中防止回溯。

正则表达式中的回溯是什么

回溯是正则表达式引擎用来处理包含可选或重复子模式的复杂模式的技术。当正则表达式模式包含可选或重复的子模式时,引擎可能需要尝试子模式的多种组合才能找到匹配项。这个过程称为回溯。

例如,有以下正则表达式:

/^[a-zA-Z0-9\s]+$/

此正则表达式应匹配仅包含字母数字字符和空格的任何字符串。然而,它很容易受到回溯的影响,因为+字符类后面的运算符允许字符类的任意数量的重复。

攻击者可以通过发送包含一长串不匹配字符的恶意搜索查询来利用此漏洞,例如:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaab

该字符串包含 30 个a字符,后跟一个b. 当正则表达式引擎尝试匹配该字符串时,它将前 30 个a字符与字符类匹配,但无法匹配b字符。然后,引擎将回溯并尝试字符类的不同组合,直到匹配整个字符串或耗尽所有可能的组合。

在本例中,字符串中有 31 个字符,因此有 2 种可能的字符类组合可供尝试。这可能需要很长的时间,可能会导致服务器遭受 DoS 攻击。

为了防止此漏洞,您可以修改正则表达式以使用*运算符代替+运算符,如下所示:

/^[a-zA-Z0-9\s]*$/

使用*可以使正则表达式不易受到回溯并降低 DoS 攻击的风险,因为它减少了正则表达式引擎需要探索的可能路径的数量。

+的意思是“一个或多个”,而*的意思是“零个或多个”。使用+时,正则表达式引擎必须在放弃之前尝试与模式匹配的所有可能的字符组合。这可能会导致回溯并导致引擎花费过多的时间来尝试匹配字符串,从而更容易受到 DoS 攻击。

另一方面,使用*使子模式成为可选,这意味着如果不匹配,正则表达式引擎可以完全跳过它。这减少了引擎需要探索的可能路径的数量。

回溯如何导致性能问题

回溯可能会通过两种方式导致性能问题:

  1. 超线性运行时间:回溯可能会导致正则表达式模式的运行时间变得超线性,这意味着匹配模式所需的时间增长速度快于输入字符串的长度。这可能会使该模式对于长输入字符串极其缓慢,并且如果将该模式应用于不受信任的用户输入,则可能会导致 DoS 攻击。
  2. 高内存使用量:回溯还会导致正则表达式引擎使用大量内存,特别是当模式包含嵌套的可选或重复的子模式时。这可能会导致应用程序内存不足并崩溃。

如何防止正则表达式模式中的回溯

为了防止正则表达式模式中的回溯,我们需要以避免可选或重复子模式的方式设计思路。以下是我们可以使用的一些技巧:

使用特定的字符类:

使用特定的字符类可以通过限制可以匹配子模式的字符数来帮助防止回溯。例如,/[a-z]/匹配从 az 的任何小写字母。

使用非捕获组

使用非捕获组可以通过避免不必要的内存分配来帮助防止回溯。例如,/(?:ab)+/匹配字符串ab的一次或多次出现,而不创建捕获组。

使用原子组

使用原子组可以通过使子模式成为非可选来帮助防止回溯。例如,/a(?>b|c)/匹配包含字母a后跟bc的字符串,而不进行回溯。

使用多个子模式而不将其中任何一个设为可选

使用多个子模式而不将其中任何一个设为可选可以通过限制正则表达式引擎需要探索的可能路径的数量来帮助防止回溯。例如,/^(ab|cd|ef)$/匹配abcdef字符串,而不进行回溯。

使用所有格子模式:

使用所有格子模式可以通过使子模式成为非可选来帮助防止回溯。所有格子模式由语法(?+...)表示。例如,/a(?+b)/匹配包含字母a后跟字母b的字符串,而不进行回溯。

使用惰性量词:

使用惰性量词可以通过使子模式可选来帮助防止回溯,但仍然可以防止回溯。惰性量词由+?or*?符号表示。例如,/a+?/匹配一​​次或多次出现的字母a,但使用惰性量词来防止回溯。

使用有界量词:

使用有界量词可以通过限制子模式的重复次数来帮助防止回溯。有界量词由语法{min,max}表示,其中minmax是指定最小和最大重复次数的整数。例如,/a{1,3}/匹配包含重复一到三次的字母a的字符串,而不回溯。文章来源地址https://www.toymoban.com/news/detail-651808.html

到了这里,关于防止 JavaScript 中的正则表达式回溯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • JavaScript正则表达式基础

    创建正则表达式,一般有两种写法 .test(\\\'需要验证的字符\\\'),正则的方法用来验证正则的匹配结果true or false 修饰符 写法:/正则/ 修饰符 示例:/abc/i (匹配字符串abc并且不区分大小) i:执行对大小写不敏感的匹配(不区分字母的大小写) g:执行全局匹配(查找所有匹配而非在

    2024年02月09日
    浏览(36)
  • JavaScript使用正则表达式

    正则表达式(RegExp)也称规则表达式(regular expression),是非常强大的字符串操作工具,语法格式为一组特殊字符构成的匹配模式,用来匹配字符串。ECMAScript 3以Perl为基础规范JavaScript正则表达式,实现Perl 5正则表达式的子集。JavaScript通过内置RegExp类型支持正则表达式,String和Re

    2024年02月05日
    浏览(47)
  • 【23JavaScript 正则表达式】深入解析JavaScript正则表达式:基础概念、常用方法和实例详解,轻松掌握强大的文本模式匹配工具

    正则表达式是一种强大的文本模式匹配工具,用于在字符串中搜索和操作特定的文本模式。在JavaScript中,正则表达式提供了一种灵活的方式来处理字符串操作。 在JavaScript中,可以通过使用字面量表示法或RegExp对象来创建正则表达式。 字面量表示法 RegExp对象 JavaScript中的正则

    2024年02月08日
    浏览(47)
  • javaScript基础语法之正则表达式

    表达式 描述 [0-9] 查找任何从 0 至 9 的数字。例如,匹配: \\\'111\\\' ,不匹配:\\\'eee\\\' [abc] 查找方括号之间的任何字符。例如,/[123]/ 匹配 \\\"1234567\\\" 中的 \\\"123\\\",\\\"1\\\" 中的 \\\"1\\\"。但是不匹配 \\\"4567890\\\"。 [^abc] 查找任何不在方括号之间的字符。例如,/[^123]/ 匹配 \\\"4567890\\\" 中的 \\\"4567890\\\"。但是不匹

    2024年02月09日
    浏览(41)
  • 15个常用的javaScript正则表达式

    c 《大厂前端面试题解析+Web核心总结学习笔记+企业项目实战源码+最新高清讲解视频》无偿开源 徽信搜索公众号【编程进阶路】 onsole.log(uPattern.test(“iFat3”)); 2密码强度正则 //密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符 var pPattern=/

    2024年01月17日
    浏览(47)
  • JavaScript |(四)正则表达式 | 尚硅谷JavaScript基础&实战

    学习来源 :尚硅谷JavaScript基础实战丨JS入门到精通全套完整版 系列笔记 : JavaScript |(一)JavaScript简介及基本语法 JavaScript |(二)JavaScript自定义对象及函数 JavaScript |(三)内建对象 | 数组 | string对象 JavaScript |(四)正则表达式👇 JavaScript |(五)DOM简介 JavaScript |(六)

    2024年02月14日
    浏览(38)
  • 前端JavaScript入门-day08-正则表达式

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 介绍 语法  元字符  边界符  量词  字符类: 修饰符 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象,通常用

    2024年02月13日
    浏览(46)
  • JavaScript Web APIs - 06 正则表达式

    目标:能够利用正则表达式完成小兔鲜注册页面的表单验证,具备常见的表单验证能力 正则表达式 综合案例 阶段案例 正则表达式 (

    2024年02月10日
    浏览(39)
  • 【JavaScript_2】语法、标准库、正则表达式

    1、强制转换 使用Number函数,可以将任意类型的值转化成数值。 Number函数将字符串转为数值,要比parseInt函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN。 上面代码中,parseInt逐个解析字符,而Number函数整体转换字符串的类型。 另外,parseI

    2024年02月13日
    浏览(42)
  • 【Java 进阶篇】JavaScript 正则表达式(RegExp)详解

    JavaScript 正则表达式,通常简写为 RegExp,是一种强大的文本匹配工具,它允许你通过一种灵活的语法来查找和替换字符串中的文本。正则表达式在编程中用途广泛,不仅限于 JavaScript,在许多编程语言中也都有类似的实现。 正则表达式,简称正则或RegExp,是一个用于描述字符

    2024年02月07日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包