Megosztás a következőn keresztül:


CA3147: Igekezelők megjelölése az ValidateAntiForgeryToken használatával

Tulajdonság Érték
Szabályazonosító CA3147
Cím Igekezelők megjelölése az ValidateAntiForgeryToken használatával
Kategória Biztonság
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Nem

Ok

Az ASP.NET MVC vezérlőműveleti metódus nincs megadva ValidateAntiForgeryTokenAttribute vagy a HTTP-parancsot megjelölő attribútummal( például HttpGetAttribute vagy AcceptVerbsAttribute).

Szabály leírása

ASP.NET MVC-vezérlő tervezésekor ügyeljen a helyek közötti hamisítási támadásokra. A helyek közötti hamisítási támadások rosszindulatú kéréseket küldhetnek egy hitelesített felhasználótól a ASP.NET MVC-vezérlőnek. További információ: XSRF/CSRF-megelőzés ASP.NET MVC-ben és weblapokon.

Ez a szabály ellenőrzi, hogy ASP.NET MVC-vezérlő műveleti módszereit:

  • Kérje meg a ValidateAntiforgeryTokenAttribute parancsot, és adja meg az engedélyezett HTTP-parancsokat, a HTTP GET-t nem beleértve.

  • Adja meg a HTTP GET-t engedélyezett parancsként.

Szabálysértések kijavítása

  • Ha ASP.NET MVC-vezérlőműveleteket, amelyek HTTP GET-kéréseket kezelnek, és nincsenek potenciálisan káros mellékhatásai, adjon hozzá egy HttpGetAttribute-et a metódushoz.

    Ha olyan ASP.NET MVC-vezérlőművelete van, amely HTTP GET-kérelmeket kezel, és potenciálisan káros mellékhatásokkal rendelkezik, például bizalmas adatok módosításával, akkor az alkalmazás sebezhető a helyek közötti kérelemhamisítási támadásokkal szemben. Újra kell terveznie az alkalmazást, hogy csak a HTTP POST, PUT vagy DELETE kérelmek hajtsanak végre bizalmas műveleteket.

  • A HTTP POST, PUT vagy DELETE kéréseket kezelő ASP.NET MVC-vezérlőműveletek esetén adja hozzá az ValidateAntiForgeryTokenAttribute parancsot, és adja hozzá az engedélyezett HTTP-parancsokat (AcceptVerbsAttribute, HttpPostAttribute, HttpPutAttribute vagy HttpDeleteAttribute) megadva. Emellett meg kell hívnia a HtmlHelper.AntiForgeryToken() metódust az MVC nézetből vagy a Razor weblapról. Példa: A szerkesztési módszerek és a szerkesztési nézet vizsgálata.

Mikor kell letiltani a figyelmeztetéseket?

A szabály figyelmeztetését nyugodtan letilthatja, ha:

  • A ASP.NET MVC vezérlőműveletnek nincsenek káros mellékhatásai.
  • Az alkalmazás más módon ellenőrzi az antiforgery tokent.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

#pragma warning disable CA3147
// The code that's violating the rule is on this line.
#pragma warning restore CA3147

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

[*.{cs,vb}]
dotnet_diagnostic.CA3147.severity = none

További információ: Kódelemzési figyelmeztetések letiltása.

ValidateAntiForgeryToken attribútum példa

Megsértése:

namespace TestNamespace
{
    using System.Web.Mvc;

    public class TestController : Controller
    {
        public ActionResult TransferMoney(string toAccount, string amount)
        {
            // You don't want an attacker to specify to who and how much money to transfer.

            return null;
        }
    }
}

Megoldás:

using System;
using System.Xml;

namespace TestNamespace
{
    using System.Web.Mvc;

    public class TestController : Controller
    {
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult TransferMoney(string toAccount, string amount)
        {
            return null;
        }
    }
}

Példa HttpGet-attribútumra

Megsértése:

namespace TestNamespace
{
    using System.Web.Mvc;

    public class TestController : Controller
    {
        public ActionResult Help(int topicId)
        {
            // This Help method is an example of a read-only operation with no harmful side effects.
            return null;
        }
    }
}

Megoldás:

namespace TestNamespace
{
    using System.Web.Mvc;

    public class TestController : Controller
    {
        [HttpGet]
        public ActionResult Help(int topicId)
        {
            return null;
        }
    }
}