Udostępnij za pośrednictwem


CA3147: Oznaczanie procedur obsługi zleceń za pomocą tokenu ValidateAntiForgeryToken

Właściwości Wartość
Identyfikator reguły CA3147
Tytuł Oznaczanie procedur obsługi zleceń za pomocą tokenu ValidateAntiForgeryToken
Kategoria Bezpieczeństwo
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 9 Nie.

Przyczyna

Metoda akcji kontrolera MVC ASP.NET nie jest oznaczona atrybutem ValidateAntiForgeryTokenAttribute lub atrybutem określającym czasownik HTTP, taki jak HttpGetAttribute lub AcceptVerbsAttribute.

Opis reguły

Podczas projektowania kontrolera MVC ASP.NET należy pamiętać o atakach fałszerzowania żądań obejmujących wiele lokacji. Atak z żądaniem fałszerzowania między witrynami może wysyłać złośliwe żądania od uwierzytelnionego użytkownika do kontrolera MVC ASP.NET. Aby uzyskać więcej informacji, zobacz XSRF/CSRF prevention in ASP.NET MVC and web pages (Zapobieganie XSRF/CSRF w ASP.NET MVC i stronach internetowych).

Ta reguła sprawdza, czy ASP.NET metody akcji kontrolera MVC:

Jak naprawić naruszenia

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli:

  • Działanie kontrolera ASP.NET MVC nie ma szkodliwych skutków ubocznych.
  • Aplikacja weryfikuje token antyforgery w inny sposób.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykład atrybutu ValidateAntiForgeryToken

Naruszenie:

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

Rozwiązanie 2.

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

Przykład atrybutu HttpGet

Naruszenie:

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

Rozwiązanie:

namespace TestNamespace
{
    using System.Web.Mvc;

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