我正在学习如何保护网站免受未经授权的访问,并且我遇到了防伪。这是我的想法(和我的问题)。如果我错了,请纠正我。防伪 - 更好地理解它的工作原理
通过在存在于网页上的Form
中插入@Html.AntiForgeryToken()
,可以防止防伪在ASP.NET MVC应用程序中处理(可能有许多其他方式,但这种方式很常见)。
此令牌后使用一次的用户尝试将数据POST
到系统中,在那里,如果我们装点我们的IActionResult
或JsonResult
法[ValidateAntiForgeryToken]
属性,它会检查该密钥是否期望的结果相匹配。下面是我通过装修意味着一个例子:
[Route("")]
[HttpPost("")]
[ValidateAntiForgeryToken]
public JsonResult UpdateRecords([FromBody]CustomRequest request)
{
if (ModelState.IsValid)
{
//...do some logic here
}
}
为什么webistes使用防伪键,所以我们不希望让尽可能数据库对我们的业务未经授权的访问对象,其原因。问题是,如果一个网站使用cookie认证,并将其存储到本地缓存中,黑客可以轻松检索到这个存储的值,并在将数据发布到我们的网站时使用它。因此,我们正在实施另一级别的保护,即通过在网页上插入特殊(唯一)密钥,在发布数据时对其进行检查。如果密钥不匹配,则整个发布过程失败。
这是我不明白的东西。比方说,我们已经实现了我们的反伪造超级简单的形式在我们的网页上是这样的:
<form method="post" ng-submit="addItem()" id="main-form">
@Html.AntiForgeryToken()
<input placeholder="Add New Item" ng-model="newItem" id="new-item" />
</form>
我知道它什么都不做,但让我们想象一下,通过点击input
按钮,用户试图将一些数据上传到数据库。如果我们考察的网页,我们会突然看到,这是产生什么样的HTML代码是这样:
<form class="ng-pristine ng-valid" method="post" ng-submit="addItem()" id="main-form">
<input name="__RequestVerificationToken" value="CfDJ8Ig8dRjRrw9FjKYv6kYaxVu7APOddjpVxQ3ZxGaamjVzV03eQEG7tgRe5q2uXJkKkbUf4RqzRCtJ1DGMK5C-ymroTBe_J9XQ-...(more text here)" type="hidden">
<input class="ng-pristine ng-valid ng-touched" placeholder="Add New Item" ng-model="newItem" id="new-item">
</form>
现在在这里,我(和潜在的黑客)可以看到,是特殊防伪关键我们刚刚讨论过。为什么使用该网站的人可以看到这个密钥?我的理解是,我们基本上是向黑客提供我们的代码,他现在可以在发布到数据库时轻松使用它来验证自己;或者我错了?
我现在很困惑,因此任何关于此事的帮助/信息或建议都将不胜感激。
我建议你检查'__RequestVerificationToken'的值,并将其与cookie进行比较。您应该多次发布表单并验证隐藏的输入字段“__RequestVerificationToken”的值是** unique **。这意味着如果您通过HTTP发送数据并且有人看到了流量,那么他仍然无法发布他自己的请求,因为AntiForgeryToken在这种情况下会失败。例如,请参阅[这里](http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks)。 – Oleg
'AntiForgeryToken()'与授权无关。它用于防止跨站请求伪造(CSRF)攻击。请参阅[本文](http://www.devcurry.com/2013/01/what-is-antiforgerytoken-and-why-do-i.html)和[this one](http://stackoverflow.com/问题/ 38555299 /反伪造 - 更好理解 - 它是如何工作的)来理解它的用途 –