Исправление CA2122 с помощью Process.Start - PullRequest
3 голосов
/ 15 марта 2012

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

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

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

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

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

Идеи?

Ответы [ 3 ]

7 голосов
/ 22 апреля 2014

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

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

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);
    }
}
3 голосов
/ 16 апреля 2013

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();
}

...
...

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

1 голос
/ 15 марта 2012

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

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

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

...