C# Sandbox Environment

Я работаю над проектом Small sandbox в Visual Studio. Вот мой код:

namespace Andromeda.PCTools
{
    public partial class Sandbox : MetroForm
    {
        private AppDomain sandbox;

        public Sandbox()
        {
            InitializeComponent();
        }

        private void Sandbox_Load(object sender, EventArgs e)
        {

        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Applications|*.exe", ValidateNames = true, Multiselect = false })
            {
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    listBoxItems.Items.Add(ofd.FileName);

                }
            }
        }

        private void removeSelectedToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (listBoxItems.SelectedItems.Count != 0)
            {
                while (listBoxItems.SelectedIndex != -1)
                {
                    listBoxItems.Items.RemoveAt(listBoxItems.SelectedIndex);
                }
            }
        }

        private void btnLoad_Click(object sender, EventArgs e)
        {
            PermissionSet ps = new PermissionSet(PermissionState.None);
            ps.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));

            AppDomainSetup setup = new AppDomainSetup();

            Evidence ev = new Evidence();
            //ev.AddHostEvidence(new Zone(SecurityZone.Internet));
            PermissionSet internetPS = SecurityManager.GetStandardSandbox(ev);

            setup.ApplicationBase = Path.GetFullPath(Application.StartupPath);



            //StrongName fullTrustAssembly = typeof(Sandboxer).Assembly.Evidence.GetHostEvidence<StrongName>();

            sandbox = AppDomain.CreateDomain(listBoxItems.SelectedItem.ToString(), ev, setup, ps);

            try
            {
                sandbox.ExecuteAssembly(listBoxItems.SelectedItem.ToString());
                btnLoad.Enabled = false;
                btnUnload.Enabled = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("The following error occurred!\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void btnUnload_Click(object sender, EventArgs e)
        {
            try
            {
                AppDomain.Unload(sandbox);
                btnLoad.Enabled = true;
                btnUnload.Enabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show("The following error occurred!\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

    }
}

Но я получаю следующую ошибку:

Возникло исключение: "System.Security.SecurityException" в Andromeda 4.0.exe ("Запрос разрешения типа" System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture= нейтральный, PublicKeyToken=b77a5c561934e089 "завершился ошибкой).")

1 ответ

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

ps.AddPermission(new FileIOPermission(PermissionState.Unrestricted));

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

Другие вопросы по тегам