Исправление CA2122 с помощью Process.Start

В приложении мы можем вывести отчет в виде CSV-файла и загрузить его, как в следующем коде:

Process.Start("C:\MyReport.csv") ' Not real path 

При запуске анализа кода выдает следующую ошибку:

CA2122 Не следует косвенно предоставлять методы с запросами ссылок «Form.Function (Definition)», вызываемые в «Process.Start (String)», у которого есть LinkDemand. Делая этот вызов, 'Process.Start (String)' косвенно предоставляется пользовательскому коду.

Я где-то видел, чтобы пометить сборку знаком SecurityTransparentAttribute, это просто подавляет сообщение? Если так, то я бы не хотел. Есть ли другой способ открыть файл, чтобы обойти это сообщение, не подавляя его? В идеале я бы хотел избежать автоматизации Excel, если это возможно, поскольку Excel в настоящее время больше нигде не используется.

Идеи?


person Stuart Blackler    schedule 15.03.2012    source источник
comment
Можно ли использовать атрибут SupressMessage?   -  person Silvermind    schedule 15.03.2012
comment
@Silvermind, подавление сообщения не устраняет основную проблему ...   -  person Stuart Blackler    schedule 15.03.2012
comment
Прости. Я неправильно понял вопрос.   -  person Silvermind    schedule 15.03.2012
comment
@silvermind обновил вопрос, чтобы, надеюсь, прояснить его :)   -  person Stuart Blackler    schedule 15.03.2012
comment
возможный дубликат предупреждения о требовании ссылки в C #   -  person Hans Passant    schedule 15.03.2012
comment
@StuartBlackler: Какая версия .NET?   -  person Nicole Calinoiu    schedule 15.03.2012
comment
@NicoleCalinoiu, 3.5 SP1   -  person Stuart Blackler    schedule 15.03.2012


Ответы (3)


Вы можете вообще не заботиться об этом (подавить сообщение локально) или о глобальном подавлении. Это зависит от вашей политики безопасности / запросов.

Что означает: Process.Start имеет некоторые примененные атрибуты безопасности, но он указал, что проверка должна выполняться только для него и для его вызывающего (SecurityAction.LinkDemand). Это означает, что если вы вызываете его в общедоступном методе, код, использующий ваш метод, пропустит эту проверку безопасности. Вашему коду можно доверять вызов Process.Start, но не их коду, но если они вызовут ваш метод, они получат эту привилегию.

Если вам нужно исправить это, вы можете применить те же атрибуты безопасности к своему коду, для этого у вызывающего абонента должны быть эти привилегии (SecurityAction.LinkDemand не проходит полный стек, поэтому он работает быстрее).

person Adriano Repetti    schedule 15.03.2012

Сегодня я наткнулся на ту же проблему и подумал, что следующий ответ будет полезен другим, поэтому решил написать его.

Итак, в основном мой код должен был открыть заданный путь к каталогу в проводнике, как показано ниже.

public static void OpenDirectoryPath(string directoryPath)
{
    if (Directory.Exists(directoryPath))
    {
        Process.Start(directoryPath);
    }
}

Приведенный выше код вызвал следующую ошибку

CA2122: Microsoft.Security: 'Helper.OpenDirectoryPath (string)' вызывает 'Process.Start (string)', который имеет LinkDemand. При выполнении этого вызова «Process.Start (string)» косвенно предоставляется пользовательскому коду. Просмотрите следующий стек вызовов, который может раскрыть способ обхода защиты:

Возникает вопрос: действительно ли вы хотите, чтобы этот метод был общедоступным? В моем случае ответ был «Нет». Изменение метода на внутренний устранило проблему.

internal static void OpenDirectoryPath(string directoryPath)
{
    if (Directory.Exists(directoryPath))
    {
        Process.Start(directoryPath);
    }
}
person Hamid Shahid    schedule 22.04.2014

Process.Start () имеет атрибут [PermissionSet (SecurityAction.LinkDemand, Name = "FullTrust", Unrestricted = false)].

Этот атрибут должен быть установлен для всех функций в иерархии.

Пример

[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust", Unrestricted = false)]
Method1()
{
    Process.Start(...);
}

[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust", Unrestricted = false)]
Method2()
{
    Method1();
}

[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust", Unrestricted = false)]
Method3()
{
    Method2();
}

[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust", Unrestricted = false)]
Method4()
{
    Method3();
}

...
...

Это устраняет эту проблему. Я не тестировал сценарий нарушения безопасности, но надеюсь, что это должно решить проблему.

person Khavasi    schedule 16.04.2013
comment
Спасибо за ответ, но я уже устранил проблему и больше не участвую в проекте. Я поддержал ваши усилия в любом случае :) - person Stuart Blackler; 16.04.2013