> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ss14.art/llms.txt
> Use this file to discover all available pages before exploring further.

# Песочница

*или, как не разрушить чужой замок из песка.*

Поскольку нам нужно иметь возможность загружать код с серверов, но мы не хотим, чтобы это позволяло серверам устанавливать вредоносное ПО на компьютеры людей, SS14 применяет методы песочницы (sandboxing), чтобы контент не мог, ну... устанавливать вредоносное ПО.

## Текущая реализация

Песочница в настоящее время реализована с помощью анализа сборок контента до их загрузки. Сборки сначала проверяются на верифицируемость IL, чтобы убедиться, что они не делают никаких *забавных трюков с указателями*. Затем все ссылающиеся члены (методы и поля) сборки проверяются по белому списку. Все API, которые потенциально могут быть использованы для обхода песочницы, конечно, запрещены.

## «Помогите, я получил нарушение песочницы»

Я перечислю несколько советов по исправлению нарушений песочницы, если они возникнут.

### Ссылка на `System.Activator` из ниоткуда

Внутренне C# использует `Activator.CreateInstance()`, если вы инстанцируете обобщённый параметр следующим образом:

```csharp theme={null}
public static T Foo<T>() where T : new()
{
    return new T();
}
```

На самом деле это компилируется в:

```csharp theme={null}
public static T Foo<T>() where T : new()
{
    return (T)Activator.CreateInstance(typeof(T));
}
```

Как видите, теперь есть ссылка на `System.Activator`. Мы не можем разрешить прямое использование этого класса, так как его можно очень легко использовать для обхода песочницы, например, через конструкторы `StreamReader`.

Чтобы исправить это, используйте `IDynamicTypeFactory.CreateInstance` или `ISandboxHelper.CreateInstance`. Они проверяют, что создаваемый тип определён в контенте и, следовательно, разрешён.

### Неверифицируемая инструкция

`stackalloc` в C# является неверифицируемым IL во всех случаях (да, даже при выделении в `Span<T>`, что не является небезопасным), так как используемая инструкция `localloc` всегда неверифицируема. Здесь мало что можно сделать, кроме как «не используйте `stackalloc`».

### Всё остальное

Конечно, количество API, не внесённых в белый список, слишком велико, чтобы перечислять, поэтому для всего остального я отсылаю к «спросите в Discord, если не можете найти альтернативу самостоятельно».
