Пятница , 19 Апрель 2024
ДомойБезопасностьобработка пользовательских переменных, предотвращение php-инъекций

обработка пользовательских переменных, предотвращение php-инъекций

php

многие слышали про такие вещи, как php-инъекция, sql-инъекция, xss, которые объединяет одно общее название — уязвимости. кто-то не только слышал, но даже сталкивался с этим. самое обидное, что это, как правило, недосмотр программиста. но в некоторых случаях уязвимость основана на принципе работы скрипта (точнее, работы не так, как того ожидалось разработчиком). что же делать, чтобы эти уязвимости не появлялись?

далее идёт первая часть статьи, посвящённая php-инъекциям

php-инъекция

как правило, возникает чаще всего у начинающих программистов. допустим, есть раздел из 10 статей. не мудрствуя лукаво, программист пишет скрипт articles.php, который просто подгружает файл по имени, переданном в параметрах.

$file = 'articles/' . $_GET['file'];
echo file_get_contents($file);

вроде бы всё довольно логично. но что будет, если передать скрипту такое значение:

http://site.ru/articles.php?file=../articles.php

в этом случае перед злоумышленником предстанет полный код файла articles.php. и хорошо, если веб-сервер настроен корректно и у php нет доступа к системным файлам. иначе можно будет если и не распрощаться с сервером, то рассчитывать на трояны точно.

поэтому всегда и все переменные, пришедшие от пользователя, требуют обработки. если было решено передавать в параметрах полный путь к файлу, то в скрипте обязательно нужно сделать проверку на то, что запрашивается разрешённый файл. в данном примере лучше вообще запретить слэши и точки, оставив лишь буквы латинского алфавита, цифры и небольшой набор символов-разделителей. например, так:

$file = 'articles/' . preg_replace('![^a-z0-9_-]!i', '', $_GET['file']) . '.txt';
if (file_exists($file)) {
    echo file_get_contents($file);
} else {
    echo 'Ошибка. Статьи не существует';
}

после этого имена файлов следует составлять только из допустимых символов: буквы латинского алфавита, цифры и символы _ и -.

краткий итог:

1. никаким данным, пришедшим от пользователя, доверять нельзя. это могут переменные из $_GET, $_POST, $_COOKIE, $_REQUEST, а также из $_SERVER с ключами, начинающимися с HTTP_*. использовать их в «ключевых местах» (работе с файлами, запросах в бд, выводе в браузер и т. п.) можно только после предварительной фильтрации/проверки;

2. при формировании структуры навигации (в примере выше — по статьям), использовать минимально возможный достаточный набор символов. если статьи пронумерованы и лежат в отдельной папке, проще передавать скрипту только число (номер статьи), который будет легко обезопасить с помощью кода:
$file = (int) $_GET['file']; — здесь принудительно преобразуется тип к целому.

Рейтинг: 0

Автор публикации

2 070
не в сети 12 месяцев

x64 (aka andi)

Комментарии: 2893Публикации: 405Регистрация: 02-04-2009
Так себеНеплохоХорошоЗамечательноСупер! (1 голосов, в среднем: 5,00 из 5)
Загрузка...

8 комментариев

  1. Надежда Давыдова

    Мой сервер тестировал один знакомы программист. Сказал, что уязвимости есть, но ими воспользоваться могут только очень опытные хакеры. Так что радуюсь пока, может и пронесет.

    Самостоятельно мне во всем этом не разобраться. А нанимать денег нет.

    Рейтинг: 0

Оставить комментарий

Политика конфиденциальности

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

Принять