Как защититься от кражи (с помощью javascript ) сессионных php кук

Приветствую вас дорогие друзья! Эта статейка будет посвящена защите веб приложения, а именно защите пользователей от кражи (с помощью javascript) их кук!

Как защититься от кражи cookie

Итак, давайте рассмотрим такую ситуацию.. Допустим, на моем сайте реализован функционал регистрации и авторизации пользователей, и если с защитой приложения при регистрации пользователей проблем возникнуть не должно, то вот после авторизации и создании кук, могут возникнуть проблемы, связанные с их кражей.

Как можно посмотреть сессионные cookie?

Вот такой вот незамысловатый javascript код выведет нам на экран куки (если они имеются), связанные с сайтом на котором вы находитесь:


После этого вы увидите всплывающее окошко, в котором будет указано названия кук (если их несколько) и PHPSESSID.

Как происходит кража кук?

Сам процесс похищения данных я бы разделил, условно, на 2 этапа:

1. Внедрение нужного кода на страницу.

Допустим, у нас на сайте организована гостевая книга (книга отзывов или ещё что-то подобное) – чтобы оставить свой отзыв, нужно заполнить поля – простая  формочка из 3 полей, код формы:

<form method="POST" action="">

        Логин: <input type="text" name="login">
        Пароль: <input type="password" name="pass">
        Отзыв: <input type="text" name="text">
        <input type="submit" name="send" value="Отправить">

</form>

Логика такая: если логин и пароль верны – авторизуем пользователя, создав cookie:

setcookie("login",$_POST['login'],time()+259200,"/");
setcookie("pass",$_POST['pass'],time()+259200,"/");

Вроде все хорошо, установили куки на 3 дня.

Далее выводим наш отзыв:


echo '<p>Автор '.$_POST['login'].'</p><p>Отзыв '.$_POST['text'].'</p>';

Все хорошо, как могут похитить данные? правильно?

А теперь представьте, к вам пришел хакер – что он сделает?

А сделать, благодаря вышеизложенному коду, он может все что душе угодно!

Он авторизуется под своим логином и паролем, но в поле отзыва он впишет следующее:


Отзыв

То есть теперь, когда какой-нибудь другой пользователь оставит свой отзыв, будет дергаться скрипт, которому будет передаваться GET параметр – куки пользователя.

2. Получение и обработка данных.

Получить и обработать данные – это уже дело второе, содержимое файла attack.php может быть таким:


file_put_contents("pass.txt",$_SERVER['REQUEST_URI'],FILE_APPEND);

То есть в файл pass.txt будут построчно записываться данные о куках пользователей.

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

Во-первых, всегда фильтруйте входные данные!

Немного о фильтрации данных – давайте рассмотрим на данном примере и выясним, как делать нельзя и как нужно делать.

Как нельзя делать:


echo '<p>Автор '.$_POST['login'].'</p><p>Отзыв '.$_POST['text'].'</p>';

Как нужно делать:


$login = check_data($_POST['login']);
$text= check_data($_POST['text']);

echo '<p>Автор '.$login.'</p><p>Отзыв '.$text.'</p>';

Где check_data – это написанная вами функция, в которой вы проверяете нужные данные должным образом!

Во-вторых: делайте куки недоступными для скриптовых языков, таких как javascript!

Для того, чтобы сделать просмотр кук с помощью javascript недопустимым, необходимо правильно устанавливать php cookie!

Как нельзя делать:


setcookie("pass",$_POST['pass'],time()+259200,"/");

Как нужно делать:


$pass= check_data($_POST['pass']);

setcookie("pass",$pass,time()+259200,"/","sergey-oganesyan.ru",false,true);

А теперь давайте пройдемся по всем параметрам (слева направо) функции setcookie:

1. Название куки
2. Значение
3. Время жизни
4. Путь к директории, в которой доступны куки (/ – доступны во всем домене)
5. Домен, на котором они разрешены
6. Куки должны передаваться только от пользователя по защищенному соединение HTTPS – ставим false
7. Ставим true и наши cookie будут доступны только через протокол HTTP

Седьмой параметр появился с версии php 5.2.0 – очень часто о нем забывают.

Вот, в принципе, и вся защита! Теперь фокус с кражей с помощью javascript не пройдет.

Не забывайте фильтровать данные и устанавливайте куки правильно!

На этом у меня все, удачи!

Если вам нужна помощь в создании какого-либо функционала, сайта, сервиса, тестов или калькуляторов, то готов помочь, подробнее на странице услуг.