Вопрос по javascript, xss – Как избежать «межсайтовых скриптовых атак»

9

Как избежать межсайтовых скриптовых атак?

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

Я уверен, что это может быть сделано FX. вPHP отпроверочные формы но я не достаточно опытен, чтобы fx. запретить JavaScript или другие вещи, которые могут вам навредить.

Надеюсь, вы понимаете мой вопрос и можете мне помочь.

Целевая платформа? PHP? Arthur
Есть варианты для любого языка / рамки / и т. Д. Вы получите более конкретные ответы - например, htmlencode - если предоставите больше информации о настройке. (Stack). Tobiasopdenbrouw
Ты прав, Тобиасопденброу, но на самом деле это было больше похоже на общий вопрос, от которого другие люди могли бы также получить ответ :) Latze

Ваш Ответ

2   ответа
9

когда сервер принимает данные от клиента, а затем вслепую записывает их на страницу. Большая часть защиты от этих атак включает в себя выход из вывода, поэтому Javascript превращается в простой HTML.

Следует иметь в виду, что атака может содержать не только данные, поступающие непосредственно от клиента.Хранится XSS атака включает в себя запись вредоносного JavaScript в базу данных, содержимое которой затем запрашивается веб-приложением. Если база данных может быть записана отдельно от клиента, приложение не сможет быть уверенным в том, что данные были экранированы правильно. По этой причине веб-приложение должно обрабатывать ВСЕ данные, которые оно пишет клиенту, как если бы оно могло содержать атаку.

Смотрите эту ссылку для подробного ресурса о том, как защитить себя:http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

Проверка входов, выходов выхода Ryan Kinal
Замечательный момент - я часто вижу слишком много разговоров о «чистке входов», когда на самом деле это не всегда возможно или даже разумно, и в любом случае это не решает проблему полностью. Решения должны происходить во время выхода. Также важно отметить, что HTML не единственный уязвимый контекст - SQL-инъекция - это всего лишь вариация на одну и ту же тему. Pointy
14

На самом деле, нет. Стадия ввода - это совсем не то место, где нужно решать проблемы XSS.

Если пользователь печатает, скажем<script>alert(document.cookie)</script> во входе, в этом нет ничего плохого. Я только что сделал это в этом сообщении, и если бы StackOverflow не разрешил это, нам было бы очень трудно говорить о JavaScript на сайте! В большинстве случаев вы хотите разрешить любой ввод (*), чтобы пользователи могли использовать< символ буквально означает менее чем знак.

Дело в том, что когда вы пишете какой-то текст на HTML-страницу, вы должны корректно экранировать его для контекста, в который он входит. Для PHP это означает использованиеhtmlspecialchars() навыходной каскад:

<p> Hello, <?php echo htmlspecialchars($name); ?>! </p>

[Подсказка PHP: вы можете определить функцию с более коротким именем, чтобы сделатьecho htmlspecialchars, так как это достаточно много печатать каждый раз, когда вы хотите поместить переменную в некоторый HTML.]

Это необходимо независимо от того, откуда приходит текст, независимо от того, отправлена ​​ли пользовательская форма или нет. В то время как предоставленные пользователем данные - самое опасное место, чтобы забыть вашу HTML-кодировку, суть в том, что вы берете строку в одном формате (простой текст) и вставляете ее в контекст в другом формате (HTML). Каждый раз, когда вы бросаете текст в другой контекст, вам понадобится схема кодирования / экранирования, соответствующая этому контексту.

Например, если вы вставляете текст в строковый литерал JavaScript, вам придется экранировать символ кавычки, обратную косую черту и символы новой строки. Если вы вставите текст в компонент запроса в URL-адресе, вам нужно будет преобразовать большинство не буквенно-цифровых символов в%xx последовательности. Каждый контекст имеет свои собственные правила; Вы должны знать, какая функция подходит для каждого контекста в выбранном вами языке / структуре. Вы не можете решить эти проблемы, искажая представления форм на этапе ввода - хотя многие наивные PHP-программисты пытаются, именно поэтому так много приложений путают ваш ввод в угловых случаях и все еще не защищены.

(*: ну, почти любой. Есть разумный аргумент для фильтрации управляющих символов ASCII из представленного текста. Очень маловероятно, что разрешение на них пойдет на пользу. Плюс, конечно, у вас будут специальные проверки приложений, которые вы захотите сделать, например, убедиться, что поле электронной почты выглядит как адрес электронной почты, или что числа действительно являются числовыми. Но это не то, что может быть применено ко всему вводу, чтобы избавить вас от неприятностей.)

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