PHP песочница / санитарный код, переданный в функцию create_function - PullRequest
2 голосов
/ 05 мая 2009

Я использую функцию create_function для запуска некоторого пользовательского кода на стороне сервера. Я ищу любой из этих двух:

  1. Есть ли способ обезопасить переданный ему код, чтобы предотвратить выполнение чего-то вредного?
  2. В качестве альтернативы, есть способ указать этот код для запуска в изолированной среде, чтобы пользователь не мог поиграть с чем-либо еще.

Спасибо!

Ответы [ 8 ]

4 голосов
/ 10 июля 2010
3 голосов
/ 25 апреля 2010

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

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

Но ...

Поскольку PHP - довольно простая и глупая грамматика, и у вас есть доступ к токенизатору, вы можете фактически остановить большинство ошибок, запретив переменные функции и позволяя вызывать только небольшое количество функций из белого списка. Если вам не нужен ООП, даже лучше.

Тем не менее, мы не уверены в том, что преодолели 100% проблем, и мы используем это для питания «песочницы» для пользователей backend , которые платят клиентам, а не каждому пользователю на планете Земля с клавиатурой и, возможно, злобой.

Я тоже думаю, что люди здесь, которые пугают идею на 100% как "плохую практику", должны понять. Есть причины для этого.

3 голосов
/ 05 мая 2009

Вы можете использовать tonkenizer , чтобы выяснить, что будет делать код, а затем внести в белый список определенные функции и операции. Я думаю, что было бы очень трудно (или невозможно) сделать его надежным, особенно учитывая гибкость PHP:

$f = "shell_exec";
$arg = 'rm -rf /';

$f($arg); // ouch
call_user_func($f, $arg); // ouch
eval("$f('$arg');"); // ouch

$newF = create_user_function('', "$f('$arg');");
$newF(); // ouch

Единственный вид песочницы, который обеспечит вам 100% безопасность (ну, 99,9% ...), это виртуальная машина, которую вы можете просто потом выбросить.

2 голосов
/ 14 мая 2009

Вы можете попробовать использовать Quercus, интерпретатор PHP на основе Java, для создания безопасной изолированной среды PHP. Вы можете сделать то же самое для JavaScript с помощью Rhino, поэтому я думаю, что это возможно с Quercus.

2 голосов
/ 05 мая 2009

Вы не можете надежно дезинфицировать пользовательский ввод - решительный хакер найдет какой-то неясный способ обойти ваш код дезинфекции.

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

Я не думаю, что вы действительно хотите это допустить. Подумайте об этом так: вы предоставляете программный доступ к серверу!

1 голос
/ 02 июля 2011

Это класс на GitHub, который может помочь на ранних стадиях, но выглядит многообещающе.

https://github.com/fregster/PHPSandbox

1 голос
/ 05 мая 2009

Вы можете подумать о создании собственного (ized) языка, который могут использовать ваши пользователи. Затем вам нужно создать библиотеку поддерживаемых функций, которые вполне могут быть просто обертками нативных функций PHP. Но даже тогда, сделать его взломанным или просто работать - в лучшем случае утомительная работа. Возможно, вам следует переоценить, почему вы хотите, чтобы пользователи имели доступ к коду в первую очередь? Я хотел бы помочь, если вам нужен кто-то, чтобы обсудить это (или обновить ваш вопрос, я полагаю?)

Надеюсь, ты справишься!

-Dave

0 голосов
/ 28 марта 2010

В целом плохая идея и слишком опасная ИМО, независимо от того, какую защиту вы поставили на место. Лучше создать псевдо-язык, ограниченный в точности тем, что разрешено делать пользователям.

...