nginx + php-fpm

Maxim Dounin mdounin at mdounin.ru
Thu Apr 11 11:17:47 UTC 2013


Hello!

On Thu, Apr 11, 2013 at 02:11:18PM +0400, Anton Kiryushkin wrote:

> Всем добрый день
> 
> Возможно это боян и только я не знаю как так получается. Но столкнулся с
> интересной вещью.
> Есть сайт, туда пользователи могут загружать картинки. И загружают. Но,
> если вместо картинки, под видом картинки, они загрузят php-код, то,
> казалось бы, и черт с ним. Сервер его не обработает. Но нашли ведь лаз
> обращаться к файлу так:
> ff9cf78666f326226e5328cd01e82e53804d7a44.png/.php
> 
> В location nginx прописано тоже вроде бы корректно:
> 
>        location ~ "^(.+\.php)($|/)" {
>                 set $script $uri;
>                 if ($uri ~ "^(.+\.php)($|/)") {
>                         set $script $1;
>                 }
>                 if ($uri ~ "^(.+\.php)(/.+)") {
>                         set $script $1;
>                 }
>                fastcgi_index  index.php;
>                 fastcgi_split_path_info         ^(.+\.php)(.*)$;
>                 fastcgi_param  PATH_INFO        $fastcgi_path_info;
>                 fastcgi_pass   fpm-backend;
>                 include fastcgi_params;
>                 fastcgi_param SCRIPT_NAME $script;
>                 fastcgi_param  SCRIPT_FILENAME
>  $document_root$fastcgi_script_name;
> }
> 
> То есть все, что оканчивается на .php. Соблюдается. Но ведь файла нет. Я
> имею ввиду ".php". Почему nginx считает файлом
> ff9cf78666f326226e5328cd01e82e53804d7a44.png/.php, ведь тут есть обычный
> слэш?

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

В данном случае, однако, правильное решение - это не городить 
костыли в nginx'е, а исправить поведение php, чтобы он открывал 
ровно то, что сказали, а не пытался придумать правильное имя файла 
сам.  AFAIK, выключить cgi.fix_pathinfo - помогает.

-- 
Maxim Dounin
http://nginx.org/en/donation.html



Подробная информация о списке рассылки nginx-ru