Node.js和javascript中RegExp對象的風險及防范

注:標題上囊括了Node.js和javascript,但這里僅以Node.js作為討論,因為兩者的語法是一致的,只是使用的地方不一樣!

RegExp是Node.js的原生對象,會有什么風險呢?

下面我們做一個簡單的示例:

 let str = "\\";
 let regx = new RegExp(str);

結果輸出如下:

SyntaxError: Invalid regular expression: /\/: \ at end of pattern

設想一種情況,當我們在Node.js里面,使用mongoose對mongodb按用戶輸入關鍵字來進行模糊查詢時,一般情況下,都會使用RegExp來創(chuàng)建正則表達式對象。那么當用戶輸入了\\(兩個反斜杠),我們后臺的程序就拋出異常了,如果錯誤數量巨大 ,那么就可能發(fā)生程序掛掉,這是后端開發(fā)需要避免的風險。

如何防范?

在討論如何防范之前,我們得弄明白,出錯的原因在哪里,向下看:

  1. 在Node.js中,字符串中的\(反斜杠)代表轉義標記,是對其后的一個或多個字符進行轉義操作,解決字符串的嵌套及特殊字符間的表達沖突問題。而在字符串中\\(兩個反斜杠)僅表示一個字符\(反斜杠),而在正則表達里面,\也代表轉義。
  2. 在Node.js中, RegExp的作用是以傳入的字符串參數創(chuàng)建一個正則表達式對象,而其內部并沒有對\進行轉義,于是,本來我們期望的正則/\\/在這里卻變成了/\/,這是不符合語法規(guī)范的,所以這就是為什么會報上面的SyntaxError的原因了。

好了,知道出錯原因,我們開始做防范措施了,以下是我的一個解決方案,可以根據需要自行制訂:

let str = "\\";
str = str.replace(/\\/ig, "\\\\");
let regx = new RegExp(str);

等等,為什么要替換成功\\\\(四個反斜杠),而不是兩個反斜杠?以下解釋一下(這里有點繞):
let str = "\\";表示要匹配的是一個\(一個反斜杠)字符;
str.replace表示替換把一個反斜杠替換成兩個反斜杠, 所以此時str的值為\\\\;
經過以上的操作,結果regx的值為/\\/;
如果替換成兩個反斜杠,最終也會報SyntaxError的錯誤。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容