2011-08-02 23 views
1

我有一個JSP贖回XSS攻擊,在此檢查,如果內容的正則表達式匹配,以確定它是否是安全與否,這裏是代碼:爲什麼這個正則表達式顯示安全性?

String contents = bodyContent.getString(); 
String regExp = new String("^\\w{5,25}$"); 
// Do a regex to find the good stuff 
if (contents.matches(regExp)) { 
    //write the original content 
}else{ 
    //change content to make it safe and write it 
} 

我的問題是關於正則表達式「^ \ w {5,25} $」,您可以在視覺上看到它here。爲何匹配這個正則表達式顯示安全性

+0

不應該是^ \ w {5,25} $? – BonyT

+1

*爲什麼匹配這個正則表達式顯示安全?* - 說什麼? – aioobe

+0

@ BonyT-是的。你是對的 – Saeed

回答

3

如果正則表達式是:

^\w{5,25}$ 

那麼這將限制串字母,數字和下劃線 - 即沒有空格或其他標點符號。這意味着它不能是一個邪惡的腳本,因爲它肯定會包含空格或分號。

+0

你能告訴我爲什麼不少於5個字符? – Saeed

+1

但是代碼說了別的,它說一個字少於5個字,即使沒有標點符號和空格也是有害的。 – Saeed

+0

抱歉 - 是的 - 少於5個字符將無法匹配,所以會被修改......無法解釋 - tbh - 整個概念有點奇怪,所以我不會過於擔心細節 - 最好打賭是取代一個更好的解決方案,如BalusC的答案。 – BonyT

3

鐵路圖不正確,「\ w」是一個正則表達式,與所謂的單詞字符匹配。這些是A-Z,a-z,0-9和下劃線。

與此匹配的輸入通常被認爲是安全的,因爲它不能包含任何常用的特殊字符或轉義字符,但絕不是保證。

+0

你能告訴我爲什麼不少於5個字符? – Saeed

+0

你能告訴我你爲什麼寫這樣的正則表達式嗎?或者畢竟是從一些可憐的資源中拷貝出來的? – BalusC

+0

它只是拷貝了,但不是來自我認爲的可憐的消息來源。來源是本書「_Deadly Sins of Software Security_」。它是由OWASP – Saeed

3

除了別人已經回答的具體問題之外,這是防止您的JSP受到XSS攻擊的明顯錯誤方法。您應該只使用JSTL <c:out>標記或fn:escapeXml()函數重新顯示用戶控制的數據。

E.g.

<c:out value="${header['user-agent']}" /> 

<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" /> 

這樣HTML/XML特殊字符,如<>等不會被字面解釋(這將導致潛在的XSS漏洞),但也會因此逃脫他們只是按原樣顯示。

這是幕後剛剛完成的字面逐字符匹配和替換。全部<&lt;替代,所有>被替換爲&gt;,所有"被替換爲&quot;等。這是和不應該涉及正則表達式。

+0

感謝您的幫助,但這不是我的問題的答案 – Saeed

+0

我意識到這一點。我只是回答你真正需要達到你的功能要求的東西,而不是你問到你的解決方案的問題,它是你的功能需求的正確解決方案。我只是想阻止你走錯了方向。 – BalusC

2

您正在匹配一些「單詞」字符,將其固定到字符串的開頭和結尾處。所以我們知道除了那個集合中沒有標點符號。

任何匹配這個集合的東西都被認爲是安全的,我猜測作者認爲在這樣的字符串中沒有什麼邪惡可做。

我不明白爲什麼少於5個字符被認爲是不安全的。

我不明白爲什麼如果25個這樣的字符串是安全的,26不是。

1

您的正則表達式驗證該字符串只包含「字」字符類,[a-Z0-9]。所以,這只是驗證字符串中沒有標點符號或特殊字符。它也驗證了從5到25的長度。

XSS攻擊通常依賴於插入數據庫的<script>...</script>例程 - 顯然它有幾個特殊字符[<> /]。

+0

你能告訴我爲什麼不少於5個字符? – Saeed

+0

我假設長度標準與XSS保護無關,並且該應用只是希望該字段的有效輸入超過5個字符。 –

+0

對於少於5個字符的字符串,本質上是不安全的。 –

0

我能想出爲什麼少於五個字符會是「不安全」的唯一原因是,如果它被用於搜索查詢,則1到4個字符可能會返回過多的結果。許多數據庫驅動的搜索功能需要至少3-5個字符以避免大量點擊。這個字符串會被用於任何類型的字符串匹配嗎?

+0

不是。它是輸出字符串,不是輸入。這是將在頁面上顯示的字符串。 – Saeed