Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC-基于GET请求的CSRF_C#_Asp.net Mvc_Security_Csrf - Fatal编程技术网

C# ASP.NET MVC-基于GET请求的CSRF

C# ASP.NET MVC-基于GET请求的CSRF,c#,asp.net-mvc,security,csrf,C#,Asp.net Mvc,Security,Csrf,我们有一个ASP.NETMVC应用程序。通过使用@Html.AntiForgeryToken和ValidateAntiForgeryToken属性,所有POST请求(表单提交)都受到了CSRF的保护。 控制器上的操作方法之一是GET,它向用户返回报告(包含数据库数据的pdf文件)。签名为: [AcceptVerbs(HttpVerbs.Get)] public ActionResult GetReport() { // get data from db return GetRep

我们有一个ASP.NETMVC应用程序。通过使用
@Html.AntiForgeryToken
ValidateAntiForgeryToken
属性,所有POST请求(表单提交)都受到了CSRF的保护。 控制器上的操作方法之一是GET,它向用户返回报告(包含数据库数据的pdf文件)。签名为:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult GetReport()
{
    // get data from db
    return GetReport();

}
以下是针对该操作测试CSRF的步骤:

  • 用户登录到应用程序
  • 登录后,用户打开以下HTML文件并单击“提交”按钮:
  • 报告可以下载
  • 问题:

    <html>
          <body>
            <form action="https://<baseurl>/Analysis/GetReport">
                    <input type="submit" value="Submit request" />
                </form>
              </body>
    </html>
    
    这可以被视为CSRF攻击吗

    如果是,如何缓解?由于操作方法是GET请求,我如何使用MVC的CSRF方法(在操作方法上应用
    @Html.AntiForgeryToken
    ValidateAntiForgeryToken

    HTML文件:

    <html>
          <body>
            <form action="https://<baseurl>/Analysis/GetReport">
                    <input type="submit" value="Submit request" />
                </form>
              </body>
    </html>
    

    简而言之,您刚才描述的不是XSRF攻击的示例…


    什么是XSRF攻击?
    CSRF
    XSRF
    都用于描述所谓的
    跨站点请求伪造。恶意网站利用您在另一个网站上的身份验证状态执行欺诈性跨网站请求

    例如:网上银行。 银行 假设您在银行网站上通过了
    认证
    ,并且银行网站包含一个
    表单
    ,用于创建新交易,所有这些都非常简单

    <!-- Your bank -->
    <form action="/send_moneh" method="POST">
        <input type="text" name="amount" />
        <input type="text" name="accountNumber" />
        <input type="submit" value="Send Money" />
    </form>
    
    当提交恶意网站上的表单时,
    HTTP请求将直接从您发送到您的银行,并且由于您已在您的银行网站上通过身份验证,因此交易可能会被接受

    本质上,攻击者通过伪造请求并将您用作发送该请求的信使,对您使用自己的身份验证


    如何预防? 您使用防伪令牌,此
    令牌
    是一个包含随机值的字符串,除了HTML表单外,该令牌还放置在您的
    cookies

    当您收到请求时,您将验证表单是否包含防伪令牌,以及它是否与存储在cookie中的令牌匹配。恶意站点无法看到您的网站在客户端上设置的令牌,如果没有这些信息,XSRF攻击将停止


    如何在ASP.NET MVC中实现它? 在将处理请求的控制器操作上,添加属性
    [ValidateAntiForgeryToken]
    ,并在HTML表单中添加
    (@HTML.AntiForgeryToken())

    公共类示例控制器:控制器
    {
    [ValidateAntiForgeryToken]
    [HttpPost]
    公共行动结果测试(Foo-fooModel)
    { 
    //做你的事。。。
    返回这个.View();
    }
    }
    @Html.AntiForgeryToken()
    
    就这样


    提示/指针/建议 在执行
    GET
    请求时,防伪令牌没有多大意义,事实上,将它们放在您没有修改和持久化数据的任何地方都没有意义,因为任何GET请求都将返回给您的用户,而不是攻击者

    如果您正在创建、更新或删除数据。。。确保您当时正在使用它。

    通常不必受到CSRF的保护,因为他们不会对应用程序进行更改,即使他们返回敏感信息,浏览器中的也会受到保护

    如果您的站点是按照标准实现的,那么GET请求应该是安全的,因此不需要保护

    但是,有一种特殊情况,即可以执行“跨站点DoS”*攻击。假设您的报告页面执行需要10秒,数据库服务器上的CPU使用率为100%,web服务器上的CPU使用率为80%

    您网站的用户知道永远不要访问
    https:///Analysis/GetReport
    在办公时间内,因为它会杀死服务器并给其他用户带来不好的用户体验

    然而,他想让你的
    网站离线,因为他不喜欢你或你的公司

    在他经常发布的繁忙论坛上,
    http://forum.walkertexasranger.example.com
    ,他将签名设置为以下内容:

    <img src="https://yoursite.example.org/Analysis/GetReport" width=0 height=0 />
    
    
    
    他还知道,你的公司员工经常参加论坛,同时也经常登录到
    yoursite.example.org

    每次员工阅读Chuck的帖子时,都会向
    https://yoursite.example.org/Analysis/GetReport
    ,因此您的站点将处理请求并生成报告,而您的系统将脱机,因为这些持续的请求占用了CPU

    因此,即使该请求是GET请求,并且不会对系统进行任何永久性更改(也称为“安全”),但实际上每次运行时都会关闭系统。因此,最好用一些CSRF预防方法来保护这一点。最简单的方法是将其转换为只能通过POST请求生成报告,因此可以通过AntiForgeryToken验证请求


    *XSDoS或跨站点拒绝服务是我发明的一个短语,所以不要在谷歌上搜索它。

    谢谢Aydin。只是为了澄清用户打开的html文件不是web应用程序的一部分,而是用户现在不知不觉提交的另一个网站。Guess将保持问题的原样而不进行修复。我已对其进行了更新,以便让您对所涉及的内容有一个更全面的了解,再次查看您的代码,您可能会将其转化为XSRF攻击,问题是它当前只执行一个
    GET
    请求,您也可以使用链接
    ,甚至JavaScript重定向。
    <img src="https://yoursite.example.org/Analysis/GetReport" width=0 height=0 />