Ломай меня полностью
или Как мой сайт подвергся хакерской атаке

Видеоуроки по PHP без категории

Не так давно на мой сайт http://simple-training.com была совершена хакерская атака.
Негативных последствий она не принесла и ничего серьезного она из себя не представляла,
но факт атаки заставил меня пересмотреть и оптимизировать код.

В данном видео я покажу вам каким образом сайт пытались взломать, расскажу ошибки хакера и мои ошибки. И самое главное расскажу и покажу какие уроки вы можете извлечь для себя, чтобы обезопасить создаваемые вами сайты.

Ответы на некоторые вопросы о защите.


Как защититься?

Фильтровать все входящие данные. Примите за правило следующее - Все данные приходящие из вне - потенциально опасные и должны быть проверены.

Как производится фильтрование данных.

Если вы программируете на базе какого-то фреймворка, то принимать данные лучше средствами фреймворка. То есть можно принять данные базовыми средствами PHP $_POST, $_GET, $REQUEST, а можно методами фреймворка.
Приведу пример:
//CodeIgniter
$filename = $this->security->sanitize_filename($this->input->post('filename'));

Тут мы видим что
1) POST данные мы берем средствами CI - $this->input->post('filename');
Который уже делает некоторые проверки на попытки взлома.

2) С помощью $this->security->sanitize_filename();
Проверяется имя файла на предмет обхода каталогов.

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


Валидация средствами фреймворков.

Практически у каждого современного фреймворка есть механизмы валидации данных. Так называемые валидаторы. Они придуманы не от хорошей жизни и необходимы к использованию.


Фильтрация данных средствами PHP.

Если фреймворк у вас самописный и в нем еще нет механизмов валидации и фильтров.
То необходимые манипуляции можно сделать средствами PHP.
Наиболее мощная и популярная функция для этого filter_var();

Вот примеры её самого простого использования.
$userEmail  = filter_var($_GET['user_mail'], FILTER_VALIDATE_EMAIL);
$userName   = filter_var($_GET['user_name'], FILTER_SANITIZE_STRING);
$userAge    = filter_var($_GET['user_age'],  FILTER_VALIDATE_INT);

$userIp     = filter_var($_GET['user_ip'],   FILTER_VALIDATE_IP);
$userUrl    = filter_var($_GET['user_url'],  FILTER_VALIDATE_URL);


Более подробный рассказ смоти в видео...

Добавить отзыв (пожелание, комментарий)

Ivan
А как вам такой способ защиты http://habrahabr.ru/post/148701/ ? не лучше ли валидировать данные на этапе составления запроса в бд? в QueryBuildera-x популярных фрейворков есть похожие механизмы, если я не ошибаюсь.
Александр
спасибо за материал. а я по незнанию стринг-риплейсом заморачивался ))