Пытаюсь наложить ограничения по памяти на пользовательские php-скрипты.
FreeBSD6.1 Apache2+PHP4+fastcgi+suexec.
В login.conf завёл новый класс pupkiny со следующими ограничениям:
pupkiny:\
:passwd_format=blf:\
:path=/bin /usr/bin /usr/local/bin:\
:cputime-max=1h30m:\
:datasize-max=8m:\
:stacksize-max=2m:\
:memorylocked-max=4m:\
:memoryuse-max=10m:\
:filesize-max=8m:\
:coredumpsize=0:\
:openfiles-max=24:\
:maxproc-max=24:\
:vmemoryuse-max=10m:\
:priority=0:\
:requirehome:\
:nocheckmail=true:\
:ignoretime=false:\
:umask=027:
Присвоил пользователю pupkin этот класс.
Теперь, если пользователь pupkin напишет такой скрипт и запустит его на сервере, то получит облом, т.к. употребил всю доступную ему память.
Скрипт:
<?
set_time_limit(0);
for ($a=0; $a<3000000; $a++) {
if (!$flag) {
$tmp_arr[$a]='1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890';
}
if (!($a%100)) {
$tmp=memory_get_usage();
echo($tmp.'<br>');
}
if ($tmp>400000000) {
$flag=1; $a=$a-1;
//unset($tmp_arr);unset($a);
};
}
?>Вроде бы всё работает правильно, но стоит добавить в начало этого скрипта
строчку
ini_set('memory_limit','2048M');
и пользователь спокойно забирает всю память+своп.
Есть одно решение:
в php.ini записать disable_functions = ini_set
но оно не очень хорошее, т.к. с помощью ini_set можно установить кучу полезных настроек, не теребя админа и перестаёт работать phpMyAdmin и куча других прог.
Как в таком случае ограничить пользовательские скрипты?