Поделиться через


Практическое руководство. Отклонение запроса разрешений с помощью флага RequestRefuse

Важно!

В версии .NET Framework 4 удалена поддержка среды выполнения для принудительного применения запросов разрешений Deny, RequestMinimum, RequestOptional и RequestRefuse.Эти запросы нельзя использовать в коде, основанном на .NET Framework 4 или более поздних версиях.Дополнительные сведения об этом и других изменениях см. в разделе Изменения системы безопасности в платформе .NET Framework 4.

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

RequestRefuse позволяет запрашивать большие наборы разрешений как дополнительные, обеспечивая в то же время отсутствие некоторых определенных разрешений.

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

Пример

Imports System
Imports System.IO
Imports System.Security
Imports System.Security.Permissions
'The request is placed at the assembly level.<assembly: FileIOPermission(SecurityAction.RequestRefuse, Unrestricted := True)>

Namespace MyNameSpace
   Public Class MyClass1
      Public Sub New()
      End Sub
      
      Public Shared Sub Main()
         'Creation of the log is attempted in the try block.Try
            Dim TextStream As New StreamWriter("Log.txt")
            TextStream.WriteLine("This Log was created on {0}", DateTime.Now)
            TextStream.Close()
            Console.WriteLine("The Log was created")
         'Catch the Security exception and inform the user that the 
         'application was not granted FileIOPermission.Catch
            Console.WriteLine("This application does not have permission to write to the disk.")         
         End Try
      End Sub
   End Class
End Namespace
//The request is placed at the assembly level.using System.Security.Permissions;
[assembly:FileIOPermission(SecurityAction.RequestRefuse ,Unrestricted = true)]

namespace MyNameSpace
{
   using System;
   using System.Security;
   using System.Security.Permissions;
   using System.IO;

   public class MyClass
   {
      public MyClass()
     {       
     }
      
      public static int Main(string[] args)
      {
         //Creation of the log is attempted in the try block.try
         {   
            StreamWriter TextStream = new StreamWriter("Log.txt");
            TextStream.WriteLine("This Log was created on {0}", DateTime.Now);
            TextStream.Close();
            Console.WriteLine("The Log was created");
         }
         //Catch the Security exception and inform the user that the 
         //application was not granted FileIOPermission.catch(SecurityException)
        {
            Console.WriteLine("This application does not have permission to write to the disk.");
        }
      

         return 0;
      }
   }
}

Приведенный пример не получает разрешения на создание файла и создает исключение безопасности.Оператор catch перехватывает исключение, и приложение выводит на консоль следующее сообщение:

This application does not have permission to write to the disk.

См. также

Основные понятия

Расширение метаданных с помощью атрибутов

Запрос разрешений

Управление доступом для кода