2015-11-29 19 views
2

我正在向控制器發佈表單並使其異步。我以隱藏的輸入形式存儲值。當點擊一個按鈕時,會調用一個javascript函數。它既從輸入字段獲取值,又從隱藏的輸入表單獲取值。然後它發送一個json字符串到控制器來處理這個請求。防止參數篡改並使用Javascript發送值的最佳方法?

控制器:

[HttpPost, Authorize] 
public ActionResult DoSomeStuff (string leagueName, string doSomething) { 
    var service = new Service(_db); 
    var league = service.GetLeague(leagueName); 
    if (league != null) { 
     // validate doSomething 
     league.Action = doSomething; 
     _db.SaveChanges(); 
    } 

    return new EmptyResult(); 
} 

的Javascript:

$(document).on("click", "#submitForm", function() { 
    var json = { 
      "leagueName": $("input[name=leagueName]").val(), 
      "doSomething": $("input[name=doSomething]").val() 
    }; 

    $.post("/Home/DoSomeStuff/", json, function() { 
     // async display something 
    }); 
} 

HTML:

<input type="text" name="doSomething"> 
<button type="submit" id="submitForm"</button> 
<input type="hidden" name="leagueName" value="@item.League.LeagueName" /> 

是什麼讓JavaScript抓取存儲值的最佳方式(更安全,然後方式輸入類型隱藏)?

如何防止某些用戶改變輸入類型的值 hidden field?

回答

4

如何防止某些用戶改變輸入 類型隱藏字段的值?

你不能!

什麼是讓javascript獲取存儲值的最佳方式(更多 安全方式,然後輸入類型隱藏)?

一般的規則是,不要信任來自客戶端的數據。在做任何事之前,您應該始終在服務器上驗證它。

如果您擔心用戶將表單中的聯盟名稱字段值更新爲某個其他用戶的聯盟名稱併發布,您應該做的是明確檢查用戶是否擁有適當的權限在你的服務器代碼中發佈聯盟。

[HttpPost, Authorize] 
public ActionResult DoSomeStuff (string leagueName, string doSomething) { 
    var service = new Service(_db); 
    var league = service.GetLeague(leagueName); 

    // Now check whether the current user has access/permission 
    // to perform some operation on this league. 
    // Ex : if(!service.IsUserAuthorizedToDoSomething(league)) 
    //  { 
    //  return View("NotAuthorized"); 
    //  } 
    //to do: Return something 
} 
+0

嗨,謝謝你的回答!如果我驗證此用戶是否有權訪問兩個聯賽,該怎麼辦?那麼是否無法查看聯盟名稱是否被更改? –

+0

如果用戶有權訪問兩個聯賽。他可以更新/執行任何操作。你可以做的另一件事是保持獨特的聯盟'身份證'也在形式隱藏的領域。並使用它來驗證/從數據庫獲得聯賽。既然用戶也可以訪問這個聯盟,如果他願意,他可以改變這個ID。沒有什麼可以做的。如果您絕對想要阻止這種情況,請在GET操作中生成一個隨機字符串,並將其設置爲隱藏字段中的表單,然後在HttpPost上對其進行驗證。由於這是每個請求會話。你的第二個用戶不會知道這個祕密字符串。這是一個骯髒的方式,雖然 – Shyju

+0

感謝您的幫助! :) –

3

如果該值需要來自客戶端(並且是HTTP請求的一部分),那麼絕對沒有辦法阻止客戶端修改其內容。如果客戶端不應該修改某些字段的內容,那麼這些字段在您的標記中無關並且成爲回發HTTP請求的一部分(不管它是隱藏字段還是您想到的任何標記元素)。他們應該安全地駐留在您的服務器(數據庫?)上,並使用來自客戶端的一些標識符進行檢索。顯然,客戶端是否可以訪問與此標識符相關的信息受制於稱爲授權的內容。基本上你應該首先知道你的客戶是誰(認證),然後在你的數據模型中驗證這個客戶是否可以訪問相應的記錄。就這麼簡單。

[HttpPost] 
[Authorize] 
public ActionResult DoSomeStuff (string id, string doSomething) 
{ 
    var service = new Service(_db); 
    var league = service.GetLeagueById(id); 
    if (!HasAccessToLeague(User.Identity.Name, league)) 
    { 
     // you are not suppose to modify the contents of this league 
     // throw him a 404 or something 
    } 
    else 
    { 
     if (league != null) 
     { 
      // validate doSomething 
      league.Action = doSomething; 
      _db.SaveChanges(); 
     } 
    } 

    return new EmptyResult(); 
} 

顯然HasAccessToLeague(string username, string leagueId)法的實施,將在很大程度上取決於你的數據模型,以及如何您的授權邏輯。

此外,您在問題標題中使用XSS,但您的問題不是XSS或javascript,而是在您的Web應用程序中設計授權層。

+0

嗨,謝謝你的回答!如果我驗證此用戶是否有權訪問兩個聯賽,該怎麼辦?那麼是否無法查看聯盟名稱是否被更改? –

+0

如果用戶被允許修改聯盟名稱,那麼不要將聯盟名稱作爲隱藏輸入,而應該是一個普通的文本框,用戶可以在其中修改其名稱。但在查詢時使用聯盟的唯一標識符作爲id。如果用戶可以訪問兩個聯賽,那麼爲什麼要關心他是否修改了名字?如果你需要大量的檢測這種情況,那麼你可以讓你的UPDATE語句除了'id'之外還包含來自用戶的WHERE語句中的聯盟名稱。在這種情況下,如果0行受到影響,您將知道用戶更改了名稱。 –

+0

感謝您的幫助! :) –