bind 属性を使用する目的は、リクエストの投稿中に攻撃者がプロパティ値を割り当てないようにすること、またはバインドするプロパティを制御することです。
呼び出されたクラスとMember
、メンバーを保存する create メソッドがあるとします。MemberType
しかし、ユーザーにプロパティの値を送信してほしくありません。
Class Member
{
public int MemberId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MemberType { get; set; }
}
[HttpPost]
Public ActionResult Create(Member member)
{
Save(member);
}
ここでは、デフォルト値である正規メンバー タイプのみを提供しているとします。Propertyの入力を許可しないことで、ユーザーが MemberType プロパティの値を送信できないようにできると考えるかもしれませんMemberType
。しかし、ユーザーがメンバー オブジェクトを投稿すると、攻撃者はリクエストを傍受し、リクエストで MemberType 値を送信し
、メンバーをプレミアムMemberId=1&FirstName=Chandra&LastName=Malla&MemberType=Premium
メンバーとして保存する可能性があります。これを防ぐために、クラスを属性で装飾できます。 Member
Bind
[Bind(Include="MemberId,FirstName,LastName")]
Class Member
{
...
また
[Bind(Exclude="MemberType")]
Class Member
{
...
オブジェクトが投稿された場合、 MemberTypeMember
プロパティの値は投稿されません。
ViewModel を使用している場合は、ViewModel で MemberType プロパティを省略できるため、必ずしも bind 属性を使用する必要はありません。
Class Member
{
public int MemberId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string MemberType { get; set; }
}
Class MemberViewModel
{
public int MemberId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
[HttpPost]
Public ActionResult Create(MemberViewModel memberviewmodel)
{
Save(memberviewmodel);
}
モデルや ViewModel を適切に設計せず、バインド属性を使用して不要なプロパティの投稿を回避しないと、悪影響が生じる可能性があります。