CA3002: проверка кода уязвимостей XSS
Свойство | Значение |
---|---|
Идентификатор правила | CA3002 |
Заголовок | Проверьте код на наличие уязвимостей к межсайтовым сценариям (XSS) |
Категория | Безопасность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
Потенциально ненадежные входные данные HTTP-запроса попадают в необработанные выходные данные HTTP.
По умолчанию это правило анализирует всю базу кода, но такое поведение можно настроить.
Описание правила
При работе с ненадежными входными данными из веб-запросов следует учитывать возможность атак с использованием межсайтовых сценариев (XSS). При атаке XSS ненадежные входные данные внедряются в необработанные выходные данные HTML-ответа, что позволяет злоумышленнику выполнять вредоносные сценарии или умышленно изменять содержимое на веб-странице. Типичный прием включает размещение элементов <script>
с вредоносным кодом во входных данных. Дополнительные сведения см. в руководстве по XSS на сайте OWASP.
Это правило пытается найти все места, где входные данные из HTTP-запросов могут попасть в необработанные данные HTML-ответа.
Примечание.
Это правило не отслеживает передачу данных между разными сборками. Например, если одна сборка считывает входные данные HTTP-запроса и передает результаты другой сборке, которая создает необработанный HTML-ответ, это правило не создаст предупреждение.
Примечание.
Можно указать, насколько глубоко это правило будет анализировать поток данных между вызовами методов. Сведения о настройке этого ограничения в файле EditorConfig см. на странице, посвященной конфигурации анализатора.
Устранение нарушений
- Вместо вывода необработанных данных HTML используйте метод или свойство, которые предварительно кодируют входные данные в безопасный для HTML формат.
- Кодируйте ненадежные данные в безопасный для HTML формат, прежде чем создавать необработанные данные HTML.
Когда лучше отключить предупреждения
Можно отключить вывод предупреждений для этого правила в следующих случаях:
- Если известно, что все входные данные проверяются на соответствие известному надежному набору символов, не содержащих HTML.
- Если известно, что данные кодируются в формат HTML таким способом, который не обнаруживается этим правилом.
Примечание.
Это правило может генерировать ложноположительный результат для некоторых методов или свойств, которые кодируют выходные данные в безопасный для HTML формат.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA3002
// The code that's violating the rule is on this line.
#pragma warning restore CA3002
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA3002.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка кода для анализа
Используйте следующие параметры, чтобы указать части базы кода, к которым будет применяться это правило.
Эти параметры можно настроить только для этого правила, для всех правил, к которым она применяется, или для всех правил в этой категории (безопасности), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.
Исключение определенных символов
Вы можете исключить из анализа определенные символы, например типы и методы. Например, чтобы указать, что правило не должно выполняться для какого-либо кода в типах с именем MyType
, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Допустимые форматы имени символа в значении параметра (разделенные |
):
- Только имя символа (включает все символы с этим именем, любого типа и в любом пространстве имен).
- Полные имена в формате идентификатора документации для символа. Для каждого имени символа требуется префикс в виде символа, например
M:
для методов,T:
для типов иN:
для пространств имен. .ctor
используется для конструкторов, а.cctor
— для статических конструкторов.
Примеры:
Значение параметра | Итоги |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Соответствует всем символам с именем MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Соответствует всем символам с именем MyType1 или MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Соответствует конкретному методу MyMethod с заданной полной сигнатурой. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Соответствует конкретным методам MyMethod1 и MyMethod2 с соответствующими полными сигнатурами. |
Исключить определенные типы и их производные типы
Из анализа можно исключать определенные типы и их производные типы. Например, чтобы указать, что правило не должно выполняться в каких-либо методах типов MyType
и их производных типов, добавьте следующую пару "ключ-значение" в файл .editorconfig своего проекта:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Допустимые форматы имени символа в значении параметра (разделенные |
):
- Только имя типа (включает все типы с этим именем, любого типа и в любом пространстве имен).
- полные имена в формате идентификатора документации для символа с необязательным префиксом
T:
.
Примеры:
Значение параметра | Итоги |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Соответствует всем типам с именем MyType и всем их производным типам. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Соответствует всем типам с именем MyType1 или MyType2 и всем их производным типам. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Соответствует конкретному типу MyType с заданным полным именем и всем производным от него типам. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Соответствует конкретным типам MyType1 и MyType2 с заданным полным именем и всем производным от них типам. |
Примеры псевдокода
Нарушение
using System;
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string input = Request.Form["in"];
Response.Write("<HTML>" + input + "</HTML>");
}
}
Imports System
Partial Public Class WebForm
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs)
Dim input As String = Me.Request.Form("in")
Me.Response.Write("<HTML>" + input + "</HTML>")
End Sub
End Class
Решение
using System;
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string input = Request.Form["in"];
// Example usage of System.Web.HttpServerUtility.HtmlEncode().
Response.Write("<HTML>" + Server.HtmlEncode(input) + "</HTML>");
}
}
Imports System
Partial Public Class WebForm
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, e As EventArgs)
Dim input As String = Me.Request.Form("in")
' Example usage of System.Web.HttpServerUtility.HtmlEncode().
Me.Response.Write("<HTML>" + Me.Server.HtmlEncode(input) + "</HTML>")
End Sub
End Class