首先考虑下面由ASP.NET Core MVC脚手架生成的代码片段。如何防止访问者篡改POST操作中的ID字段?
// GET: Students/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null)
{
return NotFound();
}
var student = await _context.Students
.SingleOrDefaultAsync(m => m.ID == id);
if (student == null)
{
return NotFound();
}
return View(student);
}
// POST: Students/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
var student = await _context.Students.SingleOrDefaultAsync(m => m.ID == id);
_context.Students.Remove(student);
await _context.SaveChangesAsync();
return RedirectToAction("Index");
}
有如下的HttpGet
和HttpPost
操作方法一定的差异:
id
是获取可空,但在后不能为空。- 初步检查如下仅在Get中进行。
代码:
if (id == null)
{
return NotFound();
}
var student = await _context.Students
.SingleOrDefaultAsync(m => m.ID == id);
if (student == null)
{
return NotFound();
}
问题:
例如,访问者请求id=5
在GET被删除,但后来他将其设置为一个号码与POST的id
篡改如id=6
或将其设置为无效值,如id=xodsfsdofsdfosdfsd
。由于HttpPost
没有初步检查,如何防止这种情况?
其实我也想知道为什么脚手架默认不提供POST初步检查的原因。你知道吗? –
在将Cookie加载到表单元素之前将值存储在cookie中,并使用发布的值对其进行验证。如果两者都相同,则继续前进,否则抛出错误。 –
用户删除student_may或者可能没有授权删除学生。这取决于您的应用程序来决定。您可能希望在您的POST操作中添加一个检查来验证用户**,因为**您无法防止篡改值**。这不是一个脚手架工具可以为你决定的事情。 – Jasen