2012-04-14 23 views
0

已經寫了很多關於不僅僅依賴於客戶機驗證的文章;這只是爲用戶提供便利,並減少了服務器處理。這不是問題所在。ASP.NET MVC JQuery數據-val-regex-模式安全性

我不知道這是特定於ASP.NET MVC還是所有JQuery驗證,但這是我的問題來自何處。當你在啓用clientsidevalidation的情況下使用ReqularExpressionAttribute時,HTML輸出如下所示:data-val-regex-pattern =「^ [0-9a-zA-Z] {3,12} $」只是一個基本示例。

這不是非常不安全,明確地提供了你的表達檢查和沒有檢查什麼?當用戶可以很容易地讀取它的確切內容時,似乎在驗證方案中利用漏洞更容易。這與服務器使用的表達式是一樣的,所以他們可以看到服務器也檢查了什麼。

UPDATE

我的例子表達並不是描述問題非常好。這是關於更復雜的數據值,它有非常嚴格的格式,你無意中忽略了一些漏洞

+0

這取決於開發模式的後果。如果這是唯一的驗證放在字段和任何通過驗證可能會導致災難性的副作用,那麼我會添加一些額外的驗證。 – SilverlightFox 2012-04-16 08:39:10

回答

0

這可能是一個安全漏洞,取決於你正在驗證的內容。但是在N層應用程序中,大部分時間您的前端模型都不同於後端模型。而您的後端仍然會驗證它並拋出相應的異常。

約unobstrusive確認一些信息:

jQuery的unobstrusive驗證利用數據 - 屬性。

如果你不想unobstrusive驗證,你可以禁用它在web.config

嘗試去web.config文件和尋找這樣的:

<appSettings> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
</appSettings> 

並設置UnobtrusiveJavaScriptEnabled爲false。雖然它可能有更多的鍵。

+0

這部分是我的觀點。我在網站的客戶端驗證。我在後端的數據服務級別再次驗證。但是,如果你有一個使用表達式進行驗證的屬性,它將在客戶端使用該表達式(用戶可見),並且它將在後端再次使用該表達式。所以,如果他們發現你的表情有漏洞(查看它),它會檢查兩次,但它會通過兩次。你知道我的意思? – quitstalin 2012-04-15 01:38:15

+0

另一種選擇是不將正則表達式添加到模型中,並驗證HttpPost控制器中的特定屬性。並從控制器添加ModelState錯誤。 – 2012-04-15 14:20:33

1

你所描述的是通過默默無聞的安全。也就是說,如果攻擊者不知道如何利用它,則認爲某些東西是安全的。

這不是安全性,如果存在漏洞,則不安全。有一種說法,「通過默默無聞的安全性根本就不安全」。

它是否更容易被剝削?也許,但老實說,解決方案是修復你的代碼。

讓我們換一種方式,攻擊者也可能意外地發現了你的漏洞。你仍然很脆弱,而且仍然不安全。

+0

絕對正確,仍然存在漏洞。但我認爲這不會讓我的問題更加有效,因爲它更容易被剝削。我認爲有些事情「通過默默無聞的安全」。有一個人的元素。由於某些原因,人們被引導到事物。我儘量不給他們。你可以輕鬆地說「修復你的代碼」,但你怎麼知道你的代碼是否需要修復?如果我知道,我會解決它。這就像他們說單元測試一樣。你所有的測試都通過了,但這是否意味着你的代碼是完美的?不,這意味着你的測試是完美的。而且你不能測試超出你想象範圍的東西。 – quitstalin 2012-04-15 01:31:05

+0

@quitstalin - 更容易被剝削!=不太安全,這是你似乎錯過的部分。例如,15年前,緩衝區超限被認爲太複雜,無法利用。快進幾年並且利用它們的知識變得很普遍,因此它是最常見的一種利用。代碼之間沒有什麼變化,只有知識。代碼和當時一樣安全(或不安全)。也就是說,它總是不安全,無論它是多麼容易被利用 – 2012-04-15 01:33:18

+0

我沒有說他們是同一件事。我建議更傾向於剝削同樣重要。我會給你一個例子。幾年前,我在一家小公司工作。我的一位「朋友」問我在哪裏工作。我告訴他,他從來沒有聽說過。一段時間後,我發現他已經去了我們的網站,並試圖弄亂我們的系統。如果我沒有告訴他我在哪裏工作,他會把目標鎖定在那家公司上面嗎?一個他從未聽說過的公司?我敢打賭不。這就是我的意思,有一個人的元素。當他坐下來看他的不當行爲時,出於某種原因,這個想法突然出現在他的頭上。 – quitstalin 2012-04-15 01:53:09

0

問了這個問題一年後,我會對我以前的自己說,我認爲答案是驗證的目的是驗證輸入數據的類型,而不是驗證請求。因此,這不是一個需要擔心的問題。