Asp.net mvc 3 如何确保我的asp.net mvc web应用程序中的攻击者用户未修改对象ID
我有两个对象具有一对多关系LabTest和LabTestDetail。当我想添加一个新的LabTestDetail对象时,我将LabTestID和父ID传递给Ajax.actionlink中的LabTestDetail创建操作方法,如下所示Asp.net mvc 3 如何确保我的asp.net mvc web应用程序中的攻击者用户未修改对象ID,asp.net-mvc-3,security,Asp.net Mvc 3,Security,我有两个对象具有一对多关系LabTest和LabTestDetail。当我想添加一个新的LabTestDetail对象时,我将LabTestID和父ID传递给Ajax.actionlink中的LabTestDetail创建操作方法,如下所示 @Ajax.ActionLink("+ Add New Lab Test Detail", "Create", "LabTestDetail", new { labtestid = Model.LabTestID }, new Aj
@Ajax.ActionLink("+ Add New Lab Test Detail",
"Create", "LabTestDetail",
new { labtestid = Model.LabTestID },
new AjaxOptions
{
InsertionMode = InsertionMode.Replace,
HttpMethod = "Get",
UpdateTargetId = "replace",
LoadingElementId = "progress"
})
LabTestDetail创建操作方法如下所示;其中,我将labtestid的值存储在viewbag中:-
然后在创建视图上,我将Viewbag的值存储在隐藏的html字段中,如下所示:-
<input type= "hidden" name = "labtestid" value = @ViewBag.labtestid />
[Authorize(Roles = "Doctor")]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(LabTestDetail ltr, int labtestid)
{
try
{
if (ModelState.IsValid)
{
ltr.LabTestID = labtestid;
repository.AddLabTestDetail(ltr);
repository.Save();
return PartialView("_datails", ltr);
}
}
//code goes here
当我测试labtestid时,上面的操作对我来说很好,,,但我最关心的是如何确保labtestid的值在以下操作期间没有被攻击者修改:-
当我将labtestid值从ajax.action链接传递到createaction方法时
当我将labtestid值作为视图包传递时
最后,当我将labtestid值赋给html隐藏字段时
致意
提前感谢您的帮助。
BR如果您使用身份验证,并且只有经过身份验证的用户才能执行这些操作,那么在应该执行更新的操作中,您可以验证当前经过身份验证的user.Identity.Name是否是实验室测试的所有者。要实现这一点,意味着您需要将这些实验室测试ID与用户关联。是的,在操作方法“我更新我的原始代码”之前,我正在使用[AuthorizeRoles=Doctor],但是任何医生都可以添加LabTestDetails,而不管他是否是LabTest对象的所有者。但我担心的是,如果我的应用程序允许专业攻击者修改ID值,那么这可能会导致我可能不知道的安全问题。。所以我想防止攻击者修改ID只是为了给我的应用程序提供一个新的安全层,那么有没有办法做到这一点??
[Authorize(Roles = "Doctor")]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(LabTestDetail ltr, int labtestid)
{
try
{
if (ModelState.IsValid)
{
ltr.LabTestID = labtestid;
repository.AddLabTestDetail(ltr);
repository.Save();
return PartialView("_datails", ltr);
}
}
//code goes here