Freigeben über


CA3147: Verbhandler mit ValidateAntiForgeryToken markieren.

Eigenschaft Wert
Regel-ID CA3147
Titel Verbhandler mit ValidateAntiForgeryToken markieren.
Kategorie Security
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 9 aktiviert No

Ursache

Eine ASP.NET MVC-Controller-Aktionsmethode ist nicht mit ValidateAntiForgeryTokenAttributegekennzeichnet, oder mit einem Attribut, das das HTTP-Verb angibt, z. B. HttpGetAttribute oder AcceptVerbsAttribute.

Regelbeschreibung

Achten Sie beim Entwerfen eines ASP.NET MVC-Controllers besonders auf mögliche Angriffe durch websiteübergreifende Anforderungsfälschung. Mit einem websiteübergreifenden Anforderungsfälschungsangriff können schädliche Anforderungen von einem authentifizierten Benutzer an Ihren ASP.NET MVC-Controller gesendet werden. Weitere Informationen finden Sie unter XSRF/CSRF-Verhinderung in ASP.NET MVC und Web Pages.

Diese Regel überprüft, ob ASP.NET MVC-Controller Aktionsmethoden:

Behandeln von Verstößen

  • Fügen Sie für ASP.NET-MVC-Controller-Aktionen, die HTTP GET-Anforderungen verarbeiten und keine potenziell schädlichen Nebenwirkungen haben, ein HttpGetAttribute zur Methode hinzu.

    Wenn Sie über eine ASP.NET MVC-Controller-Aktion verfügen, die HTTP-GET-Anforderungen verarbeitet und potenziell schädliche Nebenwirkungen aufweist, wie z. B. das Ändern von sensiblen Daten, ist Ihre Anwendung für Websiteübergreifende Anforderungsfälschungsangriffe anfällig. Sie müssen Ihre Anwendung so umgestalten, dass nur HTTP Post-, Put-oder DELETE-Anforderungen sensible Vorgänge ausführen.

  • Fügen Sie für ASP.NET-MVC-Controller-Aktionen, die HTTP-Post-, Put-oder DELETE-Anforderungen verarbeiten, ValidateAntiForgeryTokenAttribute und Attribute hinzu, die die zulässigen HTTP-Verben angeben (AcceptVerbsAttribute, HttpPostAttribute, "HttpPutAttribute oder HttpDeleteAttribute). Außerdem müssen Sie die HtmlHelper.AntiForgeryToken()-Methode über die MVC-Ansicht oder die Razor-Webseite abrufen. Ein Beispiel finden Sie unter Untersuchung der Bearbeitungsmethoden und Bearbeiten der Ansicht.

Wann sollten Warnungen unterdrückt werden?

Eine Warnung aus dieser Regel kann sicher unterdrückt werden, wenn Folgendes gilt:

  • Die ASP.NET MVC-Controller-Aktion hat keine schädlichen Nebenwirkungen.
  • Die Anwendung überprüft das Antifälschungstoken auf andere Weise.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

ValidateAntiForgeryToken-Attribut (Beispiel)

Verstoß:

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

Lösung:

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

Beispiel: HttpGet-Attribut

Verstoß:

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

Lösung:

namespace TestNamespace
{
    using System.Web.Mvc;

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