1 回答

TA貢獻1797條經驗 獲得超4個贊
熱點與漏洞
首先請注意,SonarQube 通知您的是安全熱點,而不是漏洞。這意味著(引自文檔):
安全熱點突出顯示開發人員需要審查的安全敏感代碼段。經過審查,您會發現沒有威脅,或者您需要應用修復程序來保護代碼。
[...]
使用熱點,一段安全敏感的代碼會被突出顯示,但整體應用程序的安全性可能不會受到影響。由開發人員檢查代碼以確定是否需要修復來保護代碼。
這里重要的一點是,SonarQube 并沒有告訴你有什么問題。它告訴您應該仔細查看代碼以確定是否有問題。
換句話說,它告訴您您的正則表達式可能容易受到 ReDoS 攻擊,但實際上并非如此。如果您查看代碼并確定不存在漏洞,那么在不更改任何內容的情況下忽略該問題是完全可以的。
那么,SonarQube 究竟為什么要讓您查看這段代碼呢?
SonarQube 實際上并不檢測正則表達式是否容易受到 ReDoS 攻擊(這就是為什么它被標記為安全熱點,而不是漏洞)。相反,它會標記所有重要的正則表達式,并提醒您檢查它們以確定它們是否易受攻擊。正如規則文檔中所解釋的,它認為任何包含不止一次出現的任何字符的正則表達式都是不平凡的*+{
。
由于根據該標準,您的兩個正則表達式都不是微不足道的,因此都被標記了。
更新:以上適用于編寫此答案時的 ReDoS 規則。同時,該規則已被棄用,取而代之的是一條新規則,該規則只應抱怨實際上具有超線性運行時的正則表達式。新規則不會抱怨這個問題中的正則表達式。
那么你的代碼容易受到攻擊嗎?
不,您的正則表達式都不容易受到攻擊。事實上,兩個表達式中使用的唯一重復運算符是{}
并且由于您在所有情況下都提供了上限,因此甚至沒有任何無限重復。
但是,我想說您的第一個正則表達式足夠復雜,以至于成為可讀性和維護的噩夢。因此,您應該考慮用另一種方法替換它(例如將字符串拆分為單獨的數字并檢查每個數字是否在所需的范圍內)。
那你該怎么辦?
確定正則表達式不易受到攻擊后,您應該關閉熱點。
在評論中指出,如果您將正則表達式字符串拆分為多個連接字符串或將其移動到變量中,該消息將消失。起作用的原因很簡單,就是它欺騙 SonarQube 找不到正則表達式。因此,這種更改不會使您的代碼變得更好或更安全,只會使 SonarQube 感到困惑,并且絕不比僅僅關閉消息更可取。通常不建議為了讓您的靜態分析工具閉嘴而混淆您的代碼。
添加回答
舉報