Пытаюсь наложить ограничения по памяти на пользовательские 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 и куча других прог.Как в таком случае ограничить пользовательские скрипты?
# cat php.ini |grep lim
memory_limit = 8M ; Maximum amount of memory a script may consume (8MB)>Пытаюсь наложить ограничения по памяти на пользовательские 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 и
> куча других прог.
>
>Как в таком случае ограничить пользовательские скрипты?
># cat php.ini |grep lim
>memory_limit = 8M ; Maximum amount of
>memory a script may consume (8MB)
:)Конечно это не работает. Функция ini_set как раз и переопределяет то, что вы задали в php.ini Почитайте описание функции ini_set. http://www.php.slaed.net/f/ini-set.html