Код безопасности доступа - это шутка?

Я только что прочитал об этой статье о безопасности доступа для кода. В нем есть такой пример:

using System.Security.Permissions;
public class MyFileAccessor 
{
  public MyFileAccessor(String path, bool readOnly)
  {
    path = MakeFullPath(path); // helper fcn
    FileIOPermissionAccess desiredAccess = readOnly
      ? FileIOPermissionAccess.Read
      : FileIOPermissionAccess.AllAccess;
    FileIOPermission p = new FileIOPermission(desiredAccess, path);
    p.Demand();
    // 
    ••• 
    open the file
   }
   // •••
}

Что, если бы я не использовал тип FileIOPermissionAccess и никогда не включал в свой код такой код, как p.Demand ()? Другими словами, если я хочу сделать что-то плохое, зачем мне спрашивать разрешения на это? Разве это не шутка? ИЛИ я ошибся?


person smwikipedia    schedule 18.10.2010    source источник


Ответы (3)


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

Дело в том, что Windows ничего не знает о CAS. Поэтому, если вы предоставляете такую ​​служебную функцию и хотите обеспечить соблюдение правил CAS, вам необходимо убедиться, что ваш вызывающий код имеет необходимое разрешение. Конечно, такой код действительно относится только к .NET framework. Взгляните на FileStream.Init () и обратите внимание, что перед вызовом CreateFile там требуется разрешение FileIOPermission.

person Hans Passant    schedule 18.10.2010
comment
Спасибо за четкий ответ. Итак, суть в том, чтобы предотвратить злоупотребление моим кодом, я должен включить определенный код CAS в свой компонент / функцию для обеспечения соблюдения правил CAS. - person smwikipedia; 18.10.2010
comment
Грубо. Не уверен, что слово «злоупотребление» уместно, если вы предоставите коду способ обойти обычную проверку CAS, встроенную в структуру, тогда, да, вы должны взять на себя ответственность за ее соблюдение. - person Hans Passant; 18.10.2010

Для доступа к файлу (например, с использованием FileStream) автоматически потребуется FileIOPermission. И это так для всех стандартных классов, когда они выполняют какое-либо действие, требующее разрешения, они потребуют его автоматически. См. Раздел Безопасность .NET Framework здесь. Таким образом, образец кода бесполезен, никто не будет явно требовать разрешения для файлов. Разумно, если вы разработаете какой-то API и ваш код будет подписан, чтобы никто не мог его изменить.

Читайте дальше, вот цитата из этой статьи:

Теперь в реальном мире вы не будете писать классы вроде MyFileAccessor для доступа к файлам. Вместо этого вы будете использовать классы, предоставляемые системой, такие как System.IO.FileStream, которые уже были разработаны для выполнения соответствующих проверок безопасности за вас. Они часто выполняются в конструкторе со всеми последствиями для производительности и безопасности, которые я обсуждал ранее.

person Andrey    schedule 18.10.2010
comment
Спасибо за ответ. Что делать, если я создаю новый класс? Означает ли это, что для того, чтобы CAS работала, должно быть какое-то сотрудничество / соглашение между честным разработчиком и инфраструктурой CAS? Я считаю это совершенно напрасным в том, что касается безопасности. - person smwikipedia; 18.10.2010
comment
Или мы всегда должны использовать программный компонент, написанный честными разработчиками? - person smwikipedia; 18.10.2010
comment
@smwikipedia Нет: все классы .NET Framework, которые выполняют ограниченные операции и получают доступ к ограниченным ресурсам, таким как файловая система, требуют разрешений для вас. В результате, когда вы используете классы .NET Framework, вы не должны дублировать требования разрешений. support.microsoft.com/kb/315529 случаи, когда вы явно запрашиваете разрешения, для меня непонятны. Не знаю ничего полезного. - person Andrey; 18.10.2010
comment
@smwikipedia Вот пример из той же статьи: Чтобы снизить вероятность злоупотребления вашим кодом другим вредоносным кодом, вы можете потребовать, чтобы всем вызывающим абонентам было предоставлено указанное разрешение. Если какой-либо вызывающий абонент в текущем стеке вызовов не имеет требуемого разрешения, генерируется исключение безопасности. - person Andrey; 18.10.2010

Внутри API java.io вы можете убедиться, что проверки выполняются. Если вы хотите контролировать доступ (избегая сбоя до того, как он произойдет), вы должны выполнить соответствующие проверки ДО внутренних проверок, выполняемых вызовами API.

Код Java часто запускается на компьютерах, которыми вы управляете, но он также часто запускается на компьютерах, которые вы не контролируете. Подумайте о Java-апплетах. Они должны запрашивать разрешение на доступ к файловой системе, потому что автору программы нельзя разрешать неконтролируемый доступ ко всем остальным файловым системам.

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

Исполняемый файл командной строки Java запускается по умолчанию с разрешениями, позволяющими вам прикоснуться к вашей собственной файловой системе. Предполагается, что если вы запустили программу локально, вы все равно могли испортить те части файловой системы, к которым у вас был доступ. Апплеты запускаются со всеми удаленными разрешениями по умолчанию. Таким образом, человек, просматривающий веб-страницу, на которой находится апплет, должен вручную предоставить разрешения удаленной программе (апплету) на доступ к их файловой системе.

То, что вы видите, является доказательством того, что не существует специального черного хода, который обходит безопасность для некоторых пользователей (или в некоторых условиях).

person Edwin Buck    schedule 18.10.2010
comment
Извините, ответил для Java, но .Net настолько похож, что ответ все еще остается в силе. - person Edwin Buck; 18.10.2010
comment
Нет. Вопрос был в том, что, если бы я не позвонил Demand, так что он очень конкретен, и вы говорите хорошо известную теорию - person Andrey; 18.10.2010