Udostępnij za pośrednictwem


CA3147: Oznacz procedury obsługi czasowników z wykorzystaniem ValidateAntiForgeryToken

Właściwości Wartość
Identyfikator reguły CA3147
Tytuł Oznaczanie procedur obsługi zleceń za pomocą tokenu ValidateAntiForgeryToken
Kategoria Bezpieczeństwo
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Nie.
Zastosowane języki C# i Visual Basic

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 metody akcji kontrolera MVC w ASP.NET:

Jak naprawić naruszenia

  • W przypadku akcji kontrolera MVC ASP.NET, które obsługują żądania HTTP GET i nie mają potencjalnie szkodliwych skutków ubocznych, dodaj HttpGetAttribute do metody.

    Jeśli masz akcję kontrolera ASP.NET MVC, która obsługuje żądania HTTP GET i ma potencjalnie szkodliwe skutki uboczne, takie jak modyfikowanie poufnych danych, Twoja aplikacja jest podatna na ataki fałszerstwa żądań między witrynami. Musisz przeprojektować aplikację, aby tylko żądania HTTP POST, PUT lub DELETE wykonywały poufne operacje.

  • W przypadku akcji kontrolera MVC w ASP.NET, które obsługują żądania HTTP POST, PUT lub DELETE, dodaj atrybut ValidateAntiForgeryTokenAttribute oraz atrybuty określające dozwolone czasowniki HTTP (AcceptVerbsAttribute, HttpPostAttribute, HttpPutAttribute lub HttpDeleteAttribute). Ponadto należy wywołać metodę HtmlHelper.AntiForgeryToken() z widoku MVC lub strony internetowej Razor. Aby zapoznać się z przykładem, zobacz Badanie metod edycji i widoku edycji.

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 2.

namespace TestNamespace
{
    using System.Web.Mvc;

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