@Angelxalfa

Фильтрация входящих данных?

Здравствуйте! Недавно мой сайт на Wordpress был взломан, и заражен вирусами. Сайт почистил, работоспособность наладил... По рекомендации о защите сайта, на одном из интернет-ресурсов, добавил вот этот скрипт фильтрации входящих данных:
$patt = "~\<\?~i";

if (is_array($_FILES)) {
foreach($_FILES as $anystring=>$file_data) {
if (preg_match($patt,file_get_contents($file_data['tmp_name']))) die("denied by antivirus-alarm 3");
}
}

$patt = "~\/\.\.\/\.\.\/\.\.\/|{0-9a-zA-Z}[80]|eval[^\(]*\(|include[^\(]*\(|base64_decode[^\(]*\(|stripslashes[^\(]*\(|strip_tags[^\(]*\(|fopen[^\(]*\(|chmod[^\(]*\(|chown[^\(]*\(|chgrp[^\(]*\(|unlink[^\(]*\(|unset[^\(]*\(|fgetc[^\(]*\(|fgets[^\(]*\(|file_get_contents[^\(]*\(|file_put_contents[^\(]*\(|fwrite[^\(]*\(|move_uploaded_file[^\(]*\(|is_uploaded_file[^\(]*\(|rmdir[^\(]*\(|fromCharCode[^\(]*\(|tmpfile[^\(]*\(|tempnam[^\(]*\(|phpinfo[^\(]*\(|basename[^\(]*\(|curl_init[^\(]*\(|socket_create[^\(]*\(|popen[^\(]*\(|exec[^\(]*\(|system[^\(]*\(|passthru[^\(]*\(|proc_open[^\(]*\(|gzuncompress[^\(]*\(|shell_exec[^\(]*\(|delete from|insert into~i";


foreach ($_REQUEST as $v1x1) prfilter_x1($v1x1,$patt);

function prfilter_x1($v1x1,$patt) {

ob_start();

if (is_array($v1x1)) {
foreach ($v1x1 as $vx) prfilter_x1($vx,$patt);
}
else {	

if ( preg_match($patt, $v1x1) || preg_match($patt, stripslashes($v1x1) ) ) die("denied by antivirus-alarm 1");
if ( preg_match($patt, base64_decode($v1x1) ) || preg_match($patt, stripslashes(base64_decode($v1x1) ) ) ) die("denied by antivirus-alarm 2");

}

ob_end_clean();

}


И команду на его исполнение прописал в .htaccess

php_value auto_prepend_file /путь к фалу/prfilter.php

Он работает отлично, но слишком жестко ограничивает (например не дает загрузить даже изображения на сервер, через админ панель wordpress). Подскажите пожалуйста, как сделать так, чтобы он обрезал загрузку всех файлов кроме изображений (например)?
И если дадите еще какие-нибудь дельные советы, по защите от будущего взлома, буду очень признателен.
Заранее спасибо!
  • Вопрос задан
  • 4161 просмотр
Решения вопроса 1
banderos120
@banderos120
Играю на балалайке
All in one WP security . Установите этот плагин, он отслеживает изменения файлов на вашем сайте и присылает на почту уведомления. Так вы сможете отследить, если были залиты shell скрипты, или прописан вредоносный код в какие-либо файлы вашего сайта.
Так же, можете запихнуть в крон эту команду:
date >> /home/username/shells_find_log.txt; find /home/username/www/ -name "*.php" -type f | xargs grep -l "eval(base64_decode(" >> /home/username/shells_find_log.txt && echo "[END]" >> /home/username/shells_find_log.txt

, будет искать типовые eval() строки в новых файлах и скидывать их названия в файл shells_find_log.txt.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
eucalipt
@eucalipt
Самоделкин.
Советы есть. Пиши такие вещи сам, абсолютно точно такого же, что необходимо именно тебе, ты не найдешь. Ты можешь найти похожее, но точно такое же, как в твоей голове ты можешь только сам написать.

А теперь ближе к делу.
Во-первых, для передачи данных в БД, используй подготавливаемые запросы MySQLi.
Кроме того, все данные обрабатывай следующими функциями.
trim($enteredData); // Удалит все пробелы в начале и в конце стоки
htmlspecialchars($enteredData); // Сделает невозможный SQL инъекцию.


SQL инъекция - это когда пользователь вводит какую-то команду из MySQL в строку (например - удалить все строки), а эта строка (если нет защиты от этих инъекций) просто попадает в БД и выполняется, то бишь чистит базу в нашем примере.

trim не будет удалять вообще все пробелы, можете не волноваться, она удалит только те ненужные символы (такие как пробелы, alt+255 и прочие "невидимые" символы), который находятся в начале и конце стоки.

Естественно, в эти переменные для начала нужно записать то, что пользователь вводит:
$enteredData = $_POST['field'];
// или
$enteredData = $_GET['field'];


В зависимости от метода, который Вы используете.

Эти функции - только самые основные, вы можете добавить и еще нужные Вам в конкретном случае, но, обычно, этого достаточно.
Ответ написан
GRbit
@GRbit
Linux, гитара, паяльник
У меня просто слов нет, нашёл эту штуку на сайте у клиента. Он тоже жаловался что картинки не загружают.
Руки надо отрывать за такие проверки БЛЖАД!!11!#"!%:№*:;
Такая регулярка "~\<\?~i" сработает положительно на 90% картинок, проверять из на такое это дебилизм, уж простите меня. Человек кроме всего поставил флаг caseless, т.е. одинаковая чувствительность к большим и маленьким буквам, при том что в регулярке вообще букв нет. Только абсолютно безмозглый человек может так проверять загружаемые файлы.

Стоит отключить на сервере short_open_tag а проверку исправить хотя бы на такую
"~\<\?php[ a-zA-Z0-9]{5}~" и то я думаю ложные срабатывания будут
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы