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:
das ValidateAntiforgeryTokenAttribute aufweisen und zulässige HTTP-Verben angeben, HTTP-Get nicht eingeschlossen.
HTTP-Get als zulässiges Verb angeben.
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;
}
}
}