欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何防止JavaScript中的正則表達式回溯

 更新時間:2023年08月15日 10:08:56   作者:dralexsanderl  
某些正則表達式模式可能容易受到回溯的影響,這可能會導致超線性運行時,并可能導致DoS攻擊,本文就來介紹一下如何防止JavaScript中的正則表達式回溯,感興趣的可以了解一下

正則表達式是用于在軟件應用程序中操作和驗證文本的強大工具。然而,某些正則表達式模式可能容易受到回溯的影響,這可能會導致超線性運行時,并可能導致DoS攻擊。在本文中,我們將探討什么是回溯、它如何導致性能問題以及如何在正則表達式中防止回溯。

正則表達式中的回溯是什么

回溯是正則表達式引擎用來處理包含可選或重復子模式的復雜模式的技術。當正則表達式模式包含可選或重復的子模式時,引擎可能需要嘗試子模式的多種組合才能找到匹配項。這個過程稱為回溯。

例如,有以下正則表達式:

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

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

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

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaab

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

在本例中,字符串中有 31 個字符,因此有 2 種可能的字符類組合可供嘗試。這可能需要很長的時間,可能會導致服務器遭受 DoS 攻擊。

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

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

使用*可以使正則表達式不易受到回溯并降低 DoS 攻擊的風險,因為它減少了正則表達式引擎需要探索的可能路徑的數(shù)量。

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

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

回溯如何導致性能問題

回溯可能會通過兩種方式導致性能問題:

  • 超線性運行時間:回溯可能會導致正則表達式模式的運行時間變得超線性,這意味著匹配模式所需的時間增長速度快于輸入字符串的長度。這可能會使該模式對于長輸入字符串極其緩慢,并且如果將該模式應用于不受信任的用戶輸入,則可能會導致 DoS 攻擊。
  • 高內存使用量:回溯還會導致正則表達式引擎使用大量內存,特別是當模式包含嵌套的可選或重復的子模式時。這可能會導致應用程序內存不足并崩潰。

如何防止正則表達式模式中的回溯

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

使用特定的字符類:

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

使用非捕獲組

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

使用原子組

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

使用多個子模式而不將其中任何一個設為可選

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

使用所有格子模式:

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

使用惰性量詞:

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

使用有界量詞:

使用有界量詞可以通過限制子模式的重復次數(shù)來幫助防止回溯。有界量詞由語法{min,max}表示,其中minmax是指定最小和最大重復次數(shù)的整數(shù)。例如,/a{1,3}/匹配包含重復一到三次的字母a的字符串,而不回溯。

到此這篇關于如何防止JavaScript中的正則表達式回溯的文章就介紹到這了,更多相關JavaScript 正則表達式回溯內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Bootstrap各式各樣的按鈕(推薦)

    詳解Bootstrap各式各樣的按鈕(推薦)

    Bootstrap為我們提供了各式各樣漂亮的按鈕,我們無需自己給按鈕寫樣式,直接使用它給我們提供的類樣式,使用在我們的按鈕上,非常的簡單方便
    2016-12-12
  • JavaScript中this詳解

    JavaScript中this詳解

    都說 JavaScript 是一種很靈活的語言,這其實也可以說它是一個混亂的語言。它把函數(shù)式編程和面向對象編程糅合一起,再加上動態(tài)語言特性,簡直強大無比,下面小編給大家介紹Javascript中this詳解,需要的小伙伴可以來參考下
    2015-09-09
  • 深入理解ES6學習筆記之塊級作用域綁定

    深入理解ES6學習筆記之塊級作用域綁定

    本篇文章主要介紹了深入理解ES6學習筆記之塊級作用域綁定,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • JavaScript超詳細實現(xiàn)網頁輪播圖

    JavaScript超詳細實現(xiàn)網頁輪播圖

    這篇文章主要介紹了JavaScript超詳細實現(xiàn)網頁輪播圖,我們經常會看到各種輪播圖的效果,它們到底是怎樣實現(xiàn)的呢?今天我們就一起來看一下具體實現(xiàn)方法吧
    2021-12-12
  • js優(yōu)化針對IE6.0起作用(詳細整理)

    js優(yōu)化針對IE6.0起作用(詳細整理)

    js優(yōu)化針對IE6.0起作用,總結一下幾點:字符串拼接、for 循環(huán)、減少頁面的重繪、減少作用域鏈上的查找次數(shù)、避免雙重解釋等等,需要了解的朋友可以參考下,或許會有所幫助
    2012-12-12
  • tangram.js庫實現(xiàn)js類的方式實例分析

    tangram.js庫實現(xiàn)js類的方式實例分析

    這篇文章主要介紹了tangram.js庫實現(xiàn)js類的方式,結合實例形式分析了tangram.js庫實現(xiàn)類的創(chuàng)建、繼承等相關操作技巧,需要的朋友可以參考下
    2018-01-01
  • 基于JavaScript實現(xiàn)飄落星星特效

    基于JavaScript實現(xiàn)飄落星星特效

    這篇文章主要為大家詳細介紹了基于JavaScript實現(xiàn)飄落星星特效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • ES6基礎之 Promise 對象用法實例詳解

    ES6基礎之 Promise 對象用法實例詳解

    這篇文章主要介紹了ES6基礎之 Promise 對象用法,結合實例形式詳細分析了ES6中 Promise 對象功能、用法及相關操作注意事項,需要的朋友可以參考下
    2019-08-08
  • JS實現(xiàn)二維數(shù)組橫縱列轉置的方法

    JS實現(xiàn)二維數(shù)組橫縱列轉置的方法

    下面小編就為大家分享一篇JS實現(xiàn)二維數(shù)組橫縱列轉置的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • JavaScript實現(xiàn)點擊出現(xiàn)子菜單效果

    JavaScript實現(xiàn)點擊出現(xiàn)子菜單效果

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)點擊出現(xiàn)子菜單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02

最新評論