Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA3002 |
| Заголовок | Проверьте код на наличие уязвимостей к межсайтовым сценариям (XSS) |
| Категория | Безопасность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Потенциально ненадежные входные данные 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
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка кода для анализа
Используйте следующие параметры, чтобы указать части базы кода, к которым будет применяться это правило.
Эти параметры можно настроить только для этого правила, для всех правил, к которым они применяются, или для всех правил в этой категории (безопасности), к которым они применяются. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.
Исключение определенных символов
Вы можете исключить определенные символы, такие как типы и методы, из анализа, задав параметр excluded_symbol_names. Например, чтобы указать, что правило не должно выполняться для какого-либо кода в типах с именем MyType, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Примечание.
Замените XXXX частью CAXXXX идентификатором применимого правила.
Допустимые форматы имени символа в значении параметра (разделенные |):
- Только имя символа (включает все символы с этим именем, независимо от типа или пространства имен).
- Полностью квалифицированные имена в формате идентификатора документации символа. Для каждого имени символа требуется префикс в виде символа, например
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 с соответствующими полными квалифицированными сигнатурами. |
Исключить определенные типы и их производные типы
Вы можете исключить определенные типы и производные типы из анализа, задав параметр excluded_type_names_with_derived_types. Например, чтобы указать, что правило не должно выполняться в каких-либо методах типов MyType и их производных типов, добавьте следующую пару "ключ-значение" в файл .editorconfig своего проекта:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Примечание.
Замените XXXX частью CAXXXX идентификатором применимого правила.
Допустимые форматы имени символа в значении параметра (разделенные |):
- Только имя типа (включает все типы с этим именем, независимо от содержащего типа или пространства имен).
- полные квалифицированные имена в формате идентификатора документации для символа, с необязательным префиксом
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