Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   XSS и html - безопасно? (https://javascript.ru/forum/jquery/71193-xss-i-html-bezopasno.html)

dima85 01.11.2017 11:16

XSS и html - безопасно?
 
Скажите пожалуйста безопасно ли использовать такую конструкцию?

Такой url вроде как проглатывается и alert не вылетает.
/?test=<script>alert('ALARM');</script>text


Код:

window.onload = function() {
$("#test").html(window.location.search);
}

<span id="test"></span>



На странице я вижу:
<span id="test">%3Cscript%3Ealert(%27ALARM%27);%3C/script%3E!</span>

laimas 01.11.2017 11:28

dima85,
зачем выводить на страницу параметры поиска?

dima85 01.11.2017 11:33

Меня просто сам факт интересует. Безопасно ли это. Если нет, то каким образом можно вывести alert на страницу и как обезопаситься.

laimas 01.11.2017 11:45

Цитата:

Сообщение от dima85
Меня просто сам факт интересует.

Факт чего? Это действие на самой странице и показывает url-кодированный текст. Но параметры поиска для сервера, и не дай бог в этом случае вы выведите то что он получил, то таки "ALARM" вы увидите.

dima85 01.11.2017 11:54

То есть если у меня простая html страничка, без всяких php запросов и скриптов. Такой js код безопасен?


Цитата:

Но параметры поиска для сервера, и не дай бог в этом случае вы выведите то что он получил, то таки "ALARM" вы увидите.
Можете показать какой-то простой пример?

Rasy 01.11.2017 12:01

dima85,
надо алерт выполнить?

dima85 01.11.2017 12:04

@Rasy, надо, пытаюсь разобраться в XSS атаках. :)

Rasy 01.11.2017 12:12

Цитата:

Сообщение от dima85
без всяких php запросов и скриптов

там атаковать нечего)

dima85 01.11.2017 12:14

Ну а coockie слить например? Есть ведь и другие страницы на сервере.

Мы уходим от вопроса. Как вывести alert на страницу, возможно ли это?

laimas 01.11.2017 12:18

Цитата:

Сообщение от dima85
То есть если у меня простая html страничка, без всяких php запросов и скриптов.

У РНР нет запросов, это к нему запросы, и ваша задача контролировать вывод клиенту со стороны сервера. Вот где можно ожидать XSS. Если в этом посте я помещу текст <script>alert('ALARM');</script>, а сервер его необработанный выведет на страницу, то скрипт будет запущен:

//это опасно
echo "<script>alert('ALARM');</script>";
//это безопасно
echo htmlspecialchars("<script>alert('ALARM');</script>");


Ваш код вреда не принесет, но он и бесполезен на все 100.

dima85 01.11.2017 12:30

Немного отойду от темы, вот есть rettyPhoto Plugin - это JS галерея.
И вот пишут, мол она не безопасна.
https://packetstormsecurity.com/file...Scripting.html
Если сформировать url: /#!%22%3E%3Cimg%20src=1%20onerror=prompt%280%29;%3E//
мы на страницу можем вставить вредный код.
Нужно сделать вот такой фикс:
hashIndex = parseInt(hashIndex);
hashRel = hashRel.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/])/g,'\\$1');


А почему на свою страницу, которая тупо смотрит URL и показывает его в HTML я не могу вывести вредный код?

laimas 01.11.2017 12:50

Цитата:

Сообщение от dima85
Если сформировать url: /#!%22%3E%3Cimg%20src=1%20onerror=prompt%280%29;%3E//

Это на стороне клиента, то есть клиент ввел, клиент что-то получил. Вам это нужно? На здоровье, тренируйтесь. Пока вами введенное не будет на страницах других пользователей, это никому угрожать не будет.

Rasy 01.11.2017 12:58

Цитата:

Сообщение от dima85
я не могу вывести вредный код?

var ex = 'alert(%27ALARM%27);';
  eval(decodeURI(ex));

dima85 01.11.2017 12:59

Насколько я понял проблема rettyPhoto Plugin в том что они используют decodeURI

Если я у себя сделаю вот так, из плюсов будет правильно отображаться русские символы. Но из минусов я смогу добавлять вредный код.
window.onload = function() {
$("#test").html(decodeURI(window.location.search));
}


Вопрос, есть какой-то еще способ безопасно в читаемом виде выводить русские символы с url?

laimas 01.11.2017 13:17

Цитата:

Сообщение от dima85
Вопрос, есть какой-то еще способ безопасно в читаемом виде выводить русские символы с url?

Других способов, кроме замены опасных символов на безопасные, нет.

ruslan_mart 01.11.2017 16:11

Скрипты (<script>) при добавлении через innerHTML не срабатывают. А вот через jQuery сработает, так как там метод "html" не через innerHTML вставляет данные. Для безопасной вставки достаточно использовать метод "text" (или свойство textContent в нативном JS).


Часовой пояс GMT +3, время: 22:03.