CA2234: передавайте объекты System.Uri вместо строк
Свойство | Значение |
---|---|
Идентификатор правила | CA2234 |
Заголовок | Передавайте объекты System.Uri вместо строк |
Категория | Использование |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 8 | No |
Причина
Выполнен вызов метода со строковым параметром, имя которого содержит "uri", "Uri", "urn", "Urn", "url" или "Url". Объявляющий тип метода содержит соответствующую перегрузку метода с параметром System.Uri.
По умолчанию это правило проверяет только видимые извне методы и типы, но это поведение можно настроить.
Описание правила
Имя параметра разбивается на маркеры в соответствии с соглашением о "верблюжьем" стиле, а затем каждый маркер проверяется на равенство значениям "uri", "Uri", "urn", "Urn", "url" или "Url". При совпадении предполагается, что параметр представляет универсальный код ресурса (URI). В строковых представлениях кода URI часто встречаются ошибки синтаксического анализа и кодирования, которые могут привести к уязвимостям системы безопасности. Класс Uri предоставляет аналогичные услуги более надежным и безопасным способом. Если существует выбор между двумя перегрузками, которые отличаются только представлением URI, пользователь должен выбрать перегрузку, которая принимает аргумент Uri.
Устранение нарушений
Чтобы устранить нарушение этого правила, вызовите перегрузку, которая принимает аргумент Uri.
Когда лучше отключить предупреждения
Вывод предупреждения для этого правила можно отключить, если строковый параметр не представляет URI.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA2234
// The code that's violating the rule is on this line.
#pragma warning restore CA2234
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA2234.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка кода для анализа
Используйте следующий параметр, чтобы выбрать части базы кода для применения этого правила.
Этот параметр можно настроить только для этого правила, для всех правил, к которым он применяется, или для всех правил в этой категории (использование), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.
Включение определенных контактных зон API
Вы можете настроить, для каких частей базы кода следует выполнять это правило в зависимости от их доступности. Например, чтобы указать, что правило должно выполняться только для закрытой контактной зоны API, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Пример
В следующем примере показан метод ErrorProne
, который нарушает правило, и метод SaferWay
, который правильно вызывает перегрузку Uri:
Imports System
Namespace ca2234
Class History
Friend Sub AddToHistory(uriString As String)
End Sub
Friend Sub AddToHistory(uriType As Uri)
End Sub
End Class
Public Class Browser
Dim uriHistory As New History()
Sub ErrorProne()
uriHistory.AddToHistory("http://www.adventure-works.com")
End Sub
Sub SaferWay()
Try
Dim newUri As New Uri("http://www.adventure-works.com")
uriHistory.AddToHistory(newUri)
Catch uriException As UriFormatException
End Try
End Sub
End Class
End Namespace
class History
{
internal void AddToHistory(string uriString) { }
internal void AddToHistory(Uri uriType) { }
}
public class Browser
{
History uriHistory = new History();
public void ErrorProne()
{
uriHistory.AddToHistory("http://www.adventure-works.com");
}
public void SaferWay()
{
try
{
Uri newUri = new Uri("http://www.adventure-works.com");
uriHistory.AddToHistory(newUri);
}
catch (UriFormatException) { }
}
}