1

我正在学习如何保护网站免受未经授权的访问,并且我遇到了防伪。这是我的想法(和我的问题)。如果我错了,请纠正我。防伪 - 更好地理解它的工作原理

通过在存在于网页上的Form中插入@Html.AntiForgeryToken(),可以防止防伪在ASP.NET MVC应用程序中处理(可能有许多其他方式,但这种方式很常见)。

此令牌后使用一次的用户尝试将数据POST到系统中,在那里,如果我们装点我们的IActionResultJsonResult[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> 

现在在这里,我(和潜在的黑客)可以看到,是特殊防伪关键我们刚刚讨论过。为什么使用该网站的人可以看到这个密钥?我的理解是,我们基本上是向黑客提供我们的代码,他现在可以在发布到数据库时轻松使用它来验证自己;或者我错了?

我现在很困惑,因此任何关于此事的帮助/信息或建议都将不胜感激。

+0

我建议你检查'__RequestVerificationToken'的值,并将其与cookie进行比较。您应该多次发布表单并验证隐藏的输入字段“__RequestVerificationToken”的值是** unique **。这意味着如果您通过HTTP发送数据并且有人看到了流量,那么他仍然无法发布他自己的请求,因为AntiForgeryToken在这种情况下会失败。例如,请参阅[这里](http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks)。 – Oleg

+0

'AntiForgeryToken()'与授权无关。它用于防止跨站请求伪造(CSRF)攻击。请参阅[本文](http://www.devcurry.com/2013/01/what-is-antiforgerytoken-and-why-do-i.html)和[this one](http://stackoverflow.com/问题/ 38555299 /反伪造 - 更好理解 - 它是如何工作的)来理解它的用途 –

回答

0

令牌用于防止人们伪造表单请求。每次需要时也会重新生成 - 至少每个用户和可能每个请求(我不确定最后一点)。这意味着攻击者不能只复制他们自己的令牌或者补充;他们将不得不从用户的页面拿走它,如果他们能够做到这一点,那么他们可能有足够的信息绕过令牌。

攻击者可能在另一个网站上制作带有一些值的表单并将其指向您网站上的某个页面。如果管理员提交此表单(例如通过javascript无意中),那么他们实际上只是用他们的特权和攻击者指定的值执行该操作。这是不好的,有足够的知识,你可以欺骗某人删除一个帐户,发布淫秽内容等。