[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Может ли пользователь напакостить на сервере?
vasily
На сайте предлагается пользователям решить задачу на PHP. К примеру написать код который будет складывать два числа и выводить ответ. Пользователь вставляет код который он написал в текстовое поле, затем сервер создает файл с этим кодом и его исполняет, тем самым проверяем верно ли пользователь решил задачу. Пользователю доступны только функции работы с массивами и математические функции, остальные функции которые я нашел запрещены в php.ini Запретил 3361 функцию. Список в приложенном файле. Также запретил доступ к сторонним ресурсам allow_url_fopen = off и allow_url_include = off. Может ли пользователь напакостить на сервере при таких запретах, к примеру наделать сотню папок?



Спустя 3 часа, 4 минуты, 54 секунды (16.04.2010 - 18:45) Jinus написал(а):
эээм, а не проще было написать некий парсер, который запрещал бы все ф-ции, которые не разрешены?

Спустя 7 часов, 15 минут, 1 секунда (17.04.2010 - 02:00) vasily написал(а):
Цитата (Jinus @ 16.04.2010 - 15:45)
эээм, а не проще было написать некий парсер, который запрещал бы все ф-ции, которые не разрешены?

Дело в том, что я не знаю как его написать.

Спустя 26 минут, 11 секунд (17.04.2010 - 02:26) krasilich написал(а):


$array = array(); //массив с перечнем запрещенных функций

$code; // то, что приходит из формы

str_replace($array, '', $code);


Это самый элементарный вариант, который просто вырежет не нужные слова, если таковые имеются.

Спустя 4 часа, 35 минут, 13 секунд (17.04.2010 - 07:01) glock18 написал(а):
все опасные функции никогда не будешь знать. хоть завырезайся.

vasily
список достаточно большой, и на первый взгляд, опасные функции запрещены. но очень вероятно, что не все

Спустя 22 минуты, 27 секунд (17.04.2010 - 07:23) twin написал(а):
В таких случаях предпочтительнее разрешительная политика, а не запретительная. Удалить все, кроме разрешенных.

Спустя 1 час, 47 минут, 19 секунд (17.04.2010 - 09:11) vasily написал(а):
Цитата (twin @ 17.04.2010 - 04:23)
В таких случаях предпочтительнее разрешительная политика, а не запретительная. Удалить все, кроме разрешенных.

А как это можно сделать?

Спустя 50 минут, 56 секунд (17.04.2010 - 10:02) twin написал(а):
Ну как вариант - заменить все разрешенные функции на какие то токены. Потом удалить все, что имеет признак функций. Потом вернуть обратно то, что меняли. Если не понятно, через часок освобожусь, напишу код.

Спустя 1 час, 55 минут, 25 секунд (17.04.2010 - 11:57) vasily написал(а):
Цитата (twin @ 17.04.2010 - 07:02)
Ну как вариант - заменить все разрешенные функции на какие то токены. Потом удалить все, что имеет признак функций. Потом вернуть обратно то, что меняли. Если не понятно, через часок освобожусь, напишу код.

Буду благодарен за код.

Спустя 1 час, 20 минут, 7 секунд (17.04.2010 - 13:17) twin написал(а):
// Текст от юзера
$text = 'unlink(); implode(",", $var); trim ($var); ';
// Разрешенные функции
$accept_func = array(
'explode',
'implode',
'trim'
);

$check_text = preg_replace("#".implode("\s*\(|", $accept_func)."\s*\("."#i", '', $text);

if(preg_match("#[a-z0-9_]+\s*\(#i", $check_text))
exit('Куда прешь?');
else
echo 'Хороший мальчик<br>'. $text;

Спустя 19 минут, 52 секунды (17.04.2010 - 13:37) vasily написал(а):
Цитата (twin @ 17.04.2010 - 10:17)
// Текст от юзера
$text = 'unlink(); implode(",", $var); trim ($var); ';
// Разрешенные функции
$accept_func = array(
'explode',
'implode',
'trim'
);

$check_text = preg_replace("#".implode("\s*\(|", $accept_func)."\s*\("."#i", '', $text);

if(preg_match("#[a-z0-9_]+\s*\(#i", $check_text))
exit('Куда прешь?');
else
echo 'Хороший мальчик<br>'. $text;

А он обнаружит к примеру запрещенную функцию mkdir в следующем коде:

<?php
$mk="mk"."d"."ir";
$mk("folder");
?>

Спустя 10 минут, 21 секунда (17.04.2010 - 13:47) twin написал(а):
Кто мешает попробовать? smile.gif

Спустя 51 минута, 33 секунды (17.04.2010 - 14:39) vasily написал(а):
Цитата (twin @ 17.04.2010 - 10:47)
Кто мешает попробовать? smile.gif

Работает!
Спасибо за код!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.