나는이 질문에 답하기에는 너무 늦을 수 있으며 같은 문제에 직면하고 있으므로 다음과 같은 방법으로 이러한 문제를 피할 수 있습니다.
은 당신이 사용자뿐만 아니라 그 항목을 편집 할 수있는 권한이로 다른 항목을 쓰기를 통해 할 수 있도록 항목 Id와 포스트 사람 중에 다른 값으로 항목 Id를 변경해야했다. 이 문제를 피하기 위해 ItemId 기반의 Id는 덜 예측 가능합니다 (항목 ID의 해시 값과 마찬가지로이 해시는 키를 기반으로하므로 응용 프로그램의 각 페이지마다 다른 키가 있으므로 itemid가 동일하면 생성됩니다) 다른 해시 값).
이제 양식을 가져올 때. 먼저 ItemId를 가져 와서 키를 기반으로 해시 값을 얻은 다음 이전에 생성 된 값과 비교하십시오. 비교가 ItemId 또는 해시 값과 함께 실패하면 실패 요청이 끝납니다.
다음은 작은 예제입니다.
public static class HtmlHelperExtentions
{
public static MvcHtmlString GenerateIntegrityToken(this HtmlHelper htmlHelper,
string name , string valuefromwhichtokengenerate , string key)
{
var builder = new TagBuilder("input");
builder.MergeAttribute("type", "hidden");
builder.MergeAttribute("name", "DataIntegrity_" + name);
builder.MergeAttribute("value", DataIntegrityHelper.GetTokenValue(valuefromwhichtokengenerate,key));
return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing));
}
}
public static class DataIntegrityHelper
{
public static bool IsValid(string value,string encryptedvalue,string key)
{
string tempEncryptedValue = GetTokenValue(value, key);
return string.Equals(tempEncryptedValue,encryptedvalue,StringComparison.InvariantCultureIgnoreCase);
}
public static string GetTokenValue(string value, string key)
{
if (string.IsNullOrEmpty(key))
key = "[email protected]#6";
else
key = "[email protected]#3" + key;
byte[] keys = System.Text.UTF8Encoding.UTF8.GetBytes(key);
byte[] messageBytes = System.Text.UTF8Encoding.UTF8.GetBytes(value);
HMAC mac = HMACSHA256.Create();
mac.Key = keys;
byte[] hashBytes = mac.ComputeHash(messageBytes);
return ByteToString(hashBytes);
}
public static string ByteToString(byte[] buff)
{
string sbinary = "";
for (int i = 0; i < buff.Length; i++)
{
sbinary += buff[i].ToString("X2"); // hex format
}
return (sbinary);
}
}
예시 사람 모델.
public class Person
{
public int Id { get; set; }
public string DataIntegrity_Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
보기 (사람.cshtml)
@using (Html.BeginForm())
{
@Html.GenerateIntegrityToken("Id",Model.Id.ToString(),"Hello")
@Html.HiddenFor(cc=>cc.Id)
<br />
@Html.TextBoxFor(cc=>cc.FirstName)
<br />
@Html.TextBoxFor(cc => cc.LastName)
<br />
<input type="submit" />
}
컨트롤러 작업
public ActionResult Person()
{
return View(new Person());
}
[HttpPost]
public ActionResult Person(Person person)
{
if (Extentions.DataIntegrityHelper.IsValid(person.Id.ToString(), person.DataIntegrity_Id, "Hello"))
{
return View(person);
}
else
{
return Content("Data integrity validation fails.");
}
}