2014-03-27 70 views
0

我有一個控制器(讓我們稱之爲IT用戶)和行動(讓我們稱之爲它AxGetUser) -鑄造一個參數爲MVC C#控制器,而不是使一個類型化的控制器操作

我想在一個Integer通過這樣它看起來像:

AxGetUser(INT ID)

但是,如果有人通過在字符串或其他任何東西 -

我希望能夠捕捉到它,並記錄它作爲一個可能的攻擊企圖。

所以我想知道它。因此,如果我的模型能夠使用INT,我知道它是一個有效的整數 - 但是如果我得到一個int以外的其他東西 - 我想知道它,所以我可以記錄它,並知道有人可能試圖操縱他們發送給我的參數,以便他們可能攻擊系統 -

我有什麼選擇?

+0

你可以接受一個字符串或對象,並立即做一個int。TryParse()'反對它 – Jonesopolis

回答

0

似乎過度保護,但肯定你有很多選擇。

默認情況下,如果有人試圖傳入字符串,ASP.NET MVC模型綁定將通過。如果你想看看有人試圖通過什麼,你可以隨時看看Request.FormRequest.Params。問題在於價值是否爲「發佈」或路線的一部分。

我的觀點是,您始終可以訪問通過請求對象傳入的所有數據,模型綁定只是一個抽象。

+0

這是錯誤的。 'Method(int id)'如果傳遞一個字符串將導致'參數字典包含參數'id'的一個空條目。一個可選參數必須是一個引用類型,可爲空類型...'。將其改爲「Method(int?id)」將按照您的建議進行(但不是OP所述)。 –

0

你有兩個選擇:

首個解決方案:爲您的參數指定一個默認值,如果該值仍然在你的代碼中的默認,然後瞧,你已經抓住了這種特殊情況:

void AxGetUser(int id = 0) 
{ 
    if(id == 0) 
    { 
    //you caught him !! 
    } 
} 

第二種解決方案:接受一個字符串參數並嘗試解析它。如果解析成功,那麼一切都很好,否則你有特殊情況:

void AxGetUser(string id) 
{ 
    if(!int.TryParse(id)) 
    { 
    //you caught him !! 
    } 
} 
0

你應該小心這個。您不希望A.以負面方式影響有效嘗試,阻止用戶繼續使用您的系統,並且B.創建一個過度複雜的系統,從而產生實施和維護噩夢。我會建議編程這些攻擊作爲例外,而不是規則。在這種情況下,我會打造出控制器,你通常會:

public ActionResult AxGetUser(int id) 
{ 
} 

然後,當異常發生在我的應用我會用Elmah登錄。

如果您碰巧知道某人可能使用的攻擊媒介,您可以構建自己的custom model binder並拋出將記錄在Elmah中的特定異常,以便您可以搜索這些特定問題。

相關問題