html - 防伪 - 更好地了解其工作原理

标签 html asp.net-mvc asp.net-core csrf-protection antiforgerytoken

我正在学习如何保护网站免受未经授权的访问,并且遇到了防伪功能。这是我的想法(以及我遇到的问题)。如果我错了,请纠正我。

防伪造是在 ASP.NET MVC 应用程序中通过将 @Html.AntiForgeryToken() 插入到 来处理的(可能还有许多其他方法,但这一种很常见)网页上出现的表单

一旦用户尝试将数据POST到系统,就会使用此 token ,如果我们用以下方法装饰我们的IActionResultJsonResult方法[ValidateAntiForgeryToken] 属性,它检查 key 是否与预期结果匹配。以下是我所说的装饰含义的示例:

    [Route("")]
    [HttpPost("")]
    [ValidateAntiForgeryToken]
    public JsonResult UpdateRecords([FromBody]CustomRequest request)
    {
        if (ModelState.IsValid)
        {
            //...do some logic here
        }
    }

网站使用防伪 key 的原因是,我们不希望允许未经授权的访问我们的业务对象(例如数据库)。问题是,如果网站使用存储在本地缓存中的 cookie 身份验证,黑客可以轻松检索此存储值并在将数据发布到我们的网站时使用它。因此,我们正在实现另一级别的保护,即通过在网页中插入特殊(唯一) key ,在发布数据时检查该 key 。如果 key 不匹配,则整个发布过程将失败。

这是我不明白的事情。假设我们已经在网页上以 super 简单的形式实现了防伪造,如下所示:

    <form method="post" ng-submit="addItem()" id="main-form">
        @Html.AntiForgeryToken()
        <input placeholder="Add New Item" ng-model="newItem" id="new-item" />
    </form>

我知道它什么也没做,但让我们想象一下,通过单击“输入”按钮,用户尝试将一些数据发布到数据库。如果我们检查网页,我们会突然发现 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>

现在,我(和潜在的黑客)可以看到的是我们刚才谈到的特殊防伪 key 。为什么使用该网站的任何人都可以看到此 key ?我从中了解到的是,我们基本上是在向黑客提供我们的代码,他现在可以在发布到数据库时轻松使用它来验证自己的身份;还是我错了?

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

最佳答案

token 的作用是防止人们伪造表单请求。每次需要时它也会重新生成 - 至少是每个用户并且可能每个请求(我不确定最后一点)。这意味着攻击者不能只是复制自己的 token ,或者编造它;他们必须从用户的页面获取它,如果他们能做到这一点,那么他们可能有足够的信息来绕过 token 。

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

关于html - 防伪 - 更好地了解其工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38555299/

相关文章:

android - 隐藏标题栏时删除 Android 应用程序上可见的底部填充

c# - 使用 AngularJS 将 ASP.NET CORE Web 应用程序发布到 IIS

javascript - 在 Javascript 中将文本条目保存到本地存储

javascript - JS中的触摸板滚动检测,没有库

c# - 如何实现类似SO的url重写

asp.net-mvc - 如何实现子菜单

javascript - 来自 JQuery 填充字段的值未绑定(bind)到 MVC 模型

asp.net-core - Razor Pages 路由技术

c# - Directory.GetCurrentDirectory() 不返回正确的目录

javascript - jQuery:当点击的元素都共享相同的 CSS 类时,我如何定位它们?