Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| 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;
        }
    }
}