Share via


CA3147: Werkwoordhandlers markeren met ValidateAntiForgeryToken

Eigenschappen Weergegeven als
Regel-id CA3147
Titel Werkwoordhandlers markeren met ValidateAntiForgeryToken
Categorie Beveiliging
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Nee

Oorzaak

Een ASP.NET actiemethode voor de MVC-controller is niet gemarkeerd met ValidateAntiForgeryTokenAttribute of een kenmerk dat het HTTP-werkwoord opgeeft, zoals HttpGetAttribute of AcceptVerbsAttribute.

Beschrijving van regel

Wanneer u een ASP.NET MVC-controller ontwerpt, moet u rekening houden met vervalsingsaanvallen op meerdere sites. Een aanval op aanvraagvervalsing op meerdere sites kan schadelijke aanvragen verzenden van een geverifieerde gebruiker naar uw ASP.NET MVC-controller. Zie XSRF/CSRF-preventie in ASP.NET MVC en webpagina's voor meer informatie.

Met deze regel wordt gecontroleerd of ASP.NET MVC-controlleractiemethoden:

  • Laat validateAntiforgeryTokenAttribute en geef toegestane HTTP-woorden op, niet inclusief HTTP GET.

  • Geef HTTP GET op als een toegestaan werkwoord.

Schendingen oplossen

  • Voor ASP.NET MVC-controlleracties die HTTP GET-aanvragen verwerken en geen mogelijk schadelijke bijwerkingen hebben, voegt u een HttpGetAttribute toe aan de methode.

    Als u een ASP.NET MVC-controlleractie hebt die HTTP GET-aanvragen verwerkt en mogelijk schadelijke bijwerkingen heeft, zoals het wijzigen van gevoelige gegevens, is uw toepassing kwetsbaar voor vervalsingsaanvallen op meerdere sites. U moet uw toepassing opnieuw ontwerpen, zodat alleen HTTP POST-, PUT- of DELETE-aanvragen gevoelige bewerkingen uitvoeren.

  • Voor ASP.NET MVC-controlleracties die HTTP POST-, PUT- of DELETE-aanvragen verwerken, voegt u ValidateAntiForgeryTokenAttribute en kenmerken toe die de toegestane HTTP-woorden opgeven (AcceptVerbsAttribute, HttpPostAttribute, HttpPutAttribute of HttpDeleteAttribute). Daarnaast moet u de methode HtmlHelper.AntiForgeryToken() aanroepen vanuit uw MVC-weergave of Razor-webpagina. Zie De bewerkingsmethoden bekijken en de bewerkingsweergave bekijken voor een voorbeeld.

Wanneer waarschuwingen onderdrukken

Het is veilig om een waarschuwing van deze regel te onderdrukken als:

  • De actie ASP.NET MVC-controller heeft geen schadelijke bijwerkingen.
  • De toepassing valideert het antiforgery-token op een andere manier.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Voorbeeld van het kenmerk ValidateAntiForgeryToken

Schending:

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;
        }
    }
}

Oplossing:

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;
        }
    }
}

Voorbeeld van httpGet-kenmerk

Schending:

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;
        }
    }
}

Oplossing:

namespace TestNamespace
{
    using System.Web.Mvc;

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