Найти тему
Kangaroo

Межсайтовый скриптинг (XSS) - Что это такое? И как недопустить такую уязвимость в Django проекте?

Люди, очень интересующиеся компьютерами, становятся злобными компьютерными вандалами, прилагающими все усилия, чтобы показать, насколько они умны. - Кевин Митник
Люди, очень интересующиеся компьютерами, становятся злобными компьютерными вандалами, прилагающими все усилия, чтобы показать, насколько они умны. - Кевин Митник

XSS - атаки часто применяются для кражи информации из cookie и сеансов или для того, чтобы обманом выкрасть у пользователя конфиденциальную информацию.

В двух словах, атака методом межсайтового скриптинга возможна в том случае когда веб-приложение не экранирует полученные от пользователя данные перед вставкой их в HTML-разметку. В результате хацкер получает возможность поместить в произвольный HTML-код что угодно, например тег <script>…

Например, наш метод содержит такие строки:

name = request.GET.get('name')
return HttpResponse('<h1>Hello {} </h1>'.format(name))

Вот так мы получим имя из параметра GET-запроса и вставим его в HTML-разметку. Но на самом деле, мы допустили возможность вставить в нашу HTML-разметку что угодно. Не делайте так, это грубейшая ошибка!

Просто представьте что будет, в случае если переменная name из примера выше будет равна

</h1><br /><h1> Вас взломали

Можете проверить ;)

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

Кроме того, данные могут быть доступны в базе данных, и при определенном сценарии отобразиться на сайте. Был реальный случай когда пользователь вставил в свой профиль javascript-код, который автоматически добавлял его в список друзей любого, кто просматривал его профиль.

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

Для защиты от этой атаки система шаблонов Django автоматически экранирует значение всех переменных.

В примере ранее мы использовали
return HttpResponse('<h1>Hello {} </h1>'.format(name))
Но это было не правильно, и лучше было бы заменить эту строку на
return render_to_response('index.html', {'name': name})
Безопасность ваших проектов - залог доверия пользователей ваших сервисов. - Роман Татаринов
Безопасность ваших проектов - залог доверия пользователей ваших сервисов. - Роман Татаринов