国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

防止 JavaScript 中的正則表達(dá)式回溯

這篇具有很好參考價(jià)值的文章主要介紹了防止 JavaScript 中的正則表達(dá)式回溯。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

防止 JavaScript 中的正則表達(dá)式回溯

正則表達(dá)式是用于在軟件應(yīng)用程序中操作和驗(yàn)證文本的強(qiáng)大工具。然而,某些正則表達(dá)式模式可能容易受到回溯的影響,這可能會(huì)導(dǎo)致超線性運(yùn)行時(shí),并可能導(dǎo)致DoS攻擊。在本文中,我們將探討什么是回溯、它如何導(dǎo)致性能問(wèn)題以及如何在正則表達(dá)式中防止回溯。

正則表達(dá)式中的回溯是什么

回溯是正則表達(dá)式引擎用來(lái)處理包含可選或重復(fù)子模式的復(fù)雜模式的技術(shù)。當(dāng)正則表達(dá)式模式包含可選或重復(fù)的子模式時(shí),引擎可能需要嘗試子模式的多種組合才能找到匹配項(xiàng)。這個(gè)過(guò)程稱為回溯。

例如,有以下正則表達(dá)式:

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

此正則表達(dá)式應(yīng)匹配僅包含字母數(shù)字字符和空格的任何字符串。然而,它很容易受到回溯的影響,因?yàn)?code>+字符類后面的運(yùn)算符允許字符類的任意數(shù)量的重復(fù)。

攻擊者可以通過(guò)發(fā)送包含一長(zhǎng)串不匹配字符的惡意搜索查詢來(lái)利用此漏洞,例如:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaab

該字符串包含 30 個(gè)a字符,后跟一個(gè)b. 當(dāng)正則表達(dá)式引擎嘗試匹配該字符串時(shí),它將前 30 個(gè)a字符與字符類匹配,但無(wú)法匹配b字符。然后,引擎將回溯并嘗試字符類的不同組合,直到匹配整個(gè)字符串或耗盡所有可能的組合。

在本例中,字符串中有 31 個(gè)字符,因此有 2 種可能的字符類組合可供嘗試。這可能需要很長(zhǎng)的時(shí)間,可能會(huì)導(dǎo)致服務(wù)器遭受 DoS 攻擊。

為了防止此漏洞,您可以修改正則表達(dá)式以使用*運(yùn)算符代替+運(yùn)算符,如下所示:

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

使用*可以使正則表達(dá)式不易受到回溯并降低 DoS 攻擊的風(fēng)險(xiǎn),因?yàn)樗鼫p少了正則表達(dá)式引擎需要探索的可能路徑的數(shù)量。

+的意思是“一個(gè)或多個(gè)”,而*的意思是“零個(gè)或多個(gè)”。使用+時(shí),正則表達(dá)式引擎必須在放棄之前嘗試與模式匹配的所有可能的字符組合。這可能會(huì)導(dǎo)致回溯并導(dǎo)致引擎花費(fèi)過(guò)多的時(shí)間來(lái)嘗試匹配字符串,從而更容易受到 DoS 攻擊。

另一方面,使用*使子模式成為可選,這意味著如果不匹配,正則表達(dá)式引擎可以完全跳過(guò)它。這減少了引擎需要探索的可能路徑的數(shù)量。

回溯如何導(dǎo)致性能問(wèn)題

回溯可能會(huì)通過(guò)兩種方式導(dǎo)致性能問(wèn)題:

  1. 超線性運(yùn)行時(shí)間:回溯可能會(huì)導(dǎo)致正則表達(dá)式模式的運(yùn)行時(shí)間變得超線性,這意味著匹配模式所需的時(shí)間增長(zhǎng)速度快于輸入字符串的長(zhǎng)度。這可能會(huì)使該模式對(duì)于長(zhǎng)輸入字符串極其緩慢,并且如果將該模式應(yīng)用于不受信任的用戶輸入,則可能會(huì)導(dǎo)致 DoS 攻擊。
  2. 高內(nèi)存使用量:回溯還會(huì)導(dǎo)致正則表達(dá)式引擎使用大量?jī)?nèi)存,特別是當(dāng)模式包含嵌套的可選或重復(fù)的子模式時(shí)。這可能會(huì)導(dǎo)致應(yīng)用程序內(nèi)存不足并崩潰。

如何防止正則表達(dá)式模式中的回溯

為了防止正則表達(dá)式模式中的回溯,我們需要以避免可選或重復(fù)子模式的方式設(shè)計(jì)思路。以下是我們可以使用的一些技巧:

使用特定的字符類:

使用特定的字符類可以通過(guò)限制可以匹配子模式的字符數(shù)來(lái)幫助防止回溯。例如,/[a-z]/匹配從 az 的任何小寫(xiě)字母。

使用非捕獲組

使用非捕獲組可以通過(guò)避免不必要的內(nèi)存分配來(lái)幫助防止回溯。例如,/(?:ab)+/匹配字符串ab的一次或多次出現(xiàn),而不創(chuàng)建捕獲組。

使用原子組

使用原子組可以通過(guò)使子模式成為非可選來(lái)幫助防止回溯。例如,/a(?>b|c)/匹配包含字母a后跟bc的字符串,而不進(jìn)行回溯。

使用多個(gè)子模式而不將其中任何一個(gè)設(shè)為可選

使用多個(gè)子模式而不將其中任何一個(gè)設(shè)為可選可以通過(guò)限制正則表達(dá)式引擎需要探索的可能路徑的數(shù)量來(lái)幫助防止回溯。例如,/^(ab|cd|ef)$/匹配ab、cdef字符串,而不進(jìn)行回溯。

使用所有格子模式:

使用所有格子模式可以通過(guò)使子模式成為非可選來(lái)幫助防止回溯。所有格子模式由語(yǔ)法(?+...)表示。例如,/a(?+b)/匹配包含字母a后跟字母b的字符串,而不進(jìn)行回溯。

使用惰性量詞:

使用惰性量詞可以通過(guò)使子模式可選來(lái)幫助防止回溯,但仍然可以防止回溯。惰性量詞由+?or*?符號(hào)表示。例如,/a+?/匹配一??次或多次出現(xiàn)的字母a,但使用惰性量詞來(lái)防止回溯。

使用有界量詞:

使用有界量詞可以通過(guò)限制子模式的重復(fù)次數(shù)來(lái)幫助防止回溯。有界量詞由語(yǔ)法{min,max}表示,其中minmax是指定最小和最大重復(fù)次數(shù)的整數(shù)。例如,/a{1,3}/匹配包含重復(fù)一到三次的字母a的字符串,而不回溯。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-651808.html

到了這里,關(guān)于防止 JavaScript 中的正則表達(dá)式回溯的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JavaScript正則表達(dá)式基礎(chǔ)

    JavaScript正則表達(dá)式基礎(chǔ)

    創(chuàng)建正則表達(dá)式,一般有兩種寫(xiě)法 .test(\\\'需要驗(yàn)證的字符\\\'),正則的方法用來(lái)驗(yàn)證正則的匹配結(jié)果true or false 修飾符 寫(xiě)法:/正則/?修飾符 示例:/abc/i (匹配字符串a(chǎn)bc并且不區(qū)分大小) i:執(zhí)行對(duì)大小寫(xiě)不敏感的匹配(不區(qū)分字母的大小寫(xiě)) g:執(zhí)行全局匹配(查找所有匹配而非在

    2024年02月09日
    瀏覽(27)
  • JavaScript使用正則表達(dá)式

    JavaScript使用正則表達(dá)式

    正則表達(dá)式(RegExp)也稱規(guī)則表達(dá)式(regular expression),是非常強(qiáng)大的字符串操作工具,語(yǔ)法格式為一組特殊字符構(gòu)成的匹配模式,用來(lái)匹配字符串。ECMAScript 3以Perl為基礎(chǔ)規(guī)范JavaScript正則表達(dá)式,實(shí)現(xiàn)Perl 5正則表達(dá)式的子集。JavaScript通過(guò)內(nèi)置RegExp類型支持正則表達(dá)式,String和Re

    2024年02月05日
    瀏覽(21)
  • 【23JavaScript 正則表達(dá)式】深入解析JavaScript正則表達(dá)式:基礎(chǔ)概念、常用方法和實(shí)例詳解,輕松掌握強(qiáng)大的文本模式匹配工具

    正則表達(dá)式是一種強(qiáng)大的文本模式匹配工具,用于在字符串中搜索和操作特定的文本模式。在JavaScript中,正則表達(dá)式提供了一種靈活的方式來(lái)處理字符串操作。 在JavaScript中,可以通過(guò)使用字面量表示法或RegExp對(duì)象來(lái)創(chuàng)建正則表達(dá)式。 字面量表示法 RegExp對(duì)象 JavaScript中的正則

    2024年02月08日
    瀏覽(27)
  • javaScript基礎(chǔ)語(yǔ)法之正則表達(dá)式

    表達(dá)式 描述 [0-9] 查找任何從 0 至 9 的數(shù)字。例如,匹配: \\\'111\\\' ,不匹配:\\\'eee\\\' [abc] 查找方括號(hào)之間的任何字符。例如,/[123]/ 匹配 \\\"1234567\\\" 中的 \\\"123\\\",\\\"1\\\" 中的 \\\"1\\\"。但是不匹配 \\\"4567890\\\"。 [^abc] 查找任何不在方括號(hào)之間的字符。例如,/[^123]/ 匹配 \\\"4567890\\\" 中的 \\\"4567890\\\"。但是不匹

    2024年02月09日
    瀏覽(54)
  • 15個(gè)常用的javaScript正則表達(dá)式

    c 《大廠前端面試題解析+Web核心總結(jié)學(xué)習(xí)筆記+企業(yè)項(xiàng)目實(shí)戰(zhàn)源碼+最新高清講解視頻》無(wú)償開(kāi)源 徽信搜索公眾號(hào)【編程進(jìn)階路】 onsole.log(uPattern.test(“iFat3”)); 2密碼強(qiáng)度正則 //密碼強(qiáng)度正則,最少6位,包括至少1個(gè)大寫(xiě)字母,1個(gè)小寫(xiě)字母,1個(gè)數(shù)字,1個(gè)特殊字符 var?pPattern=/

    2024年01月17日
    瀏覽(30)
  • JavaScript |(四)正則表達(dá)式 | 尚硅谷JavaScript基礎(chǔ)&實(shí)戰(zhàn)

    JavaScript |(四)正則表達(dá)式 | 尚硅谷JavaScript基礎(chǔ)&實(shí)戰(zhàn)

    學(xué)習(xí)來(lái)源 :尚硅谷JavaScript基礎(chǔ)實(shí)戰(zhàn)丨JS入門到精通全套完整版 系列筆記 : JavaScript |(一)JavaScript簡(jiǎn)介及基本語(yǔ)法 JavaScript |(二)JavaScript自定義對(duì)象及函數(shù) JavaScript |(三)內(nèi)建對(duì)象 | 數(shù)組 | string對(duì)象 JavaScript |(四)正則表達(dá)式?? JavaScript |(五)DOM簡(jiǎn)介 JavaScript |(六)

    2024年02月14日
    瀏覽(63)
  • JavaScript Web APIs - 06 正則表達(dá)式

    目標(biāo):能夠利用正則表達(dá)式完成小兔鮮注冊(cè)頁(yè)面的表單驗(yàn)證,具備常見(jiàn)的表單驗(yàn)證能力 正則表達(dá)式 綜合案例 階段案例 正則表達(dá)式 (

    2024年02月10日
    瀏覽(20)
  • 【JavaScript_2】語(yǔ)法、標(biāo)準(zhǔn)庫(kù)、正則表達(dá)式

    1、強(qiáng)制轉(zhuǎn)換 使用Number函數(shù),可以將任意類型的值轉(zhuǎn)化成數(shù)值。 Number函數(shù)將字符串轉(zhuǎn)為數(shù)值,要比parseInt函數(shù)嚴(yán)格很多?;旧?,只要有一個(gè)字符無(wú)法轉(zhuǎn)成數(shù)值,整個(gè)字符串就會(huì)被轉(zhuǎn)為NaN。 上面代碼中,parseInt逐個(gè)解析字符,而Number函數(shù)整體轉(zhuǎn)換字符串的類型。 另外,parseI

    2024年02月13日
    瀏覽(32)
  • 前端JavaScript入門-day08-正則表達(dá)式

    前端JavaScript入門-day08-正則表達(dá)式

    (創(chuàng)作不易,感謝有你,你的支持,就是我前行的最大動(dòng)力,如果看完對(duì)你有幫助,請(qǐng)留下您的足跡) 目錄 介紹 語(yǔ)法? 元字符? 邊界符? 量詞? 字符類: 修飾符 正則表達(dá)式(Regular Expression)是用于匹配字符串中字符組合的模式。在 JavaScript中,正則表達(dá)式也是對(duì)象,通常用

    2024年02月13日
    瀏覽(40)
  • 【Java 進(jìn)階篇】JavaScript 正則表達(dá)式(RegExp)詳解

    【Java 進(jìn)階篇】JavaScript 正則表達(dá)式(RegExp)詳解

    JavaScript 正則表達(dá)式,通常簡(jiǎn)寫(xiě)為 RegExp,是一種強(qiáng)大的文本匹配工具,它允許你通過(guò)一種靈活的語(yǔ)法來(lái)查找和替換字符串中的文本。正則表達(dá)式在編程中用途廣泛,不僅限于 JavaScript,在許多編程語(yǔ)言中也都有類似的實(shí)現(xiàn)。 正則表達(dá)式,簡(jiǎn)稱正則或RegExp,是一個(gè)用于描述字符

    2024年02月07日
    瀏覽(49)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包