Бөлісу құралы:


CA2234: передавайте объекты System.Uri вместо строк

Свойство Значение
Идентификатор правила CA2234
Заголовок Передавайте объекты System.Uri вместо строк
Категория Использование
Исправление является критическим или не критическим неразрывный
Включен по умолчанию в .NET 10 Нет
Применимые языки C# и Visual Basic

Причина

Выполнен вызов метода со строковым параметром, имя которого содержит "uri", "Uri", "urn", "Urn", "url" или "Url". Объявляющий тип метода содержит соответствующую перегрузку метода с параметром System.Uri.

По умолчанию это правило проверяет только видимые извне методы и типы, но это поведение можно настроить.

Описание правила

Имя параметра разбивается на токены в соответствии с соглашением 'CamelCase', а затем каждый токен проверяется на равенство значениям "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_surface. Например, чтобы указать, что правило должно выполняться только для непубличной поверхности API, добавьте следующую пару "ключ-значение" в файл .editorconfig в ваш проект:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Заметка

Замените XXXX частью CAXXXX идентификатором применимого правила.

Пример

В следующем примере показан метод 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();

    public void ErrorProne()
    {
        uriHistory.AddToHistory("http://www.adventure-works.com");
    }

    public void SaferWay()
    {
        try
        {
            Uri newUri = new("http://www.adventure-works.com");
            uriHistory.AddToHistory(newUri);
        }
        catch (UriFormatException) { }
    }
}