Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   innerHTML и безопасность (https://javascript.ru/forum/events/22501-innerhtml-i-bezopasnost.html)

sommer 22.10.2011 20:15

innerHTML и безопасность
 
Добрый день всем!
Сделал я форму для отправки сообщений и снизу этой формы отображаю все что вводится пользователем ( заменяя с помощью innerHTML смайлики на картинки )
Я понимаю, что с точки зрения безопасности это не сильно хорошо отображать введенный пользователем текст в виде html.
Пробовал множество скриптов, но ни один из них не сработал...
Вопрос насколько это безопасно?

dmitriymar 22.10.2011 20:24

Цитата:

Сообщение от sommer
Вопрос насколько это безопасно?

Открываете возможность для sql инъекции.-Внедрение нтмл кода(могут внедрить скрипт код в текст со свистом ). Соответственно, если этот текст будет отображаться у других пользователей,сможет делать всё что может JS.
Защита:
Вставляйте не в виде нтмл ,а в виде какойто последовательности символов.
Используйте хнтмл ,заключайте код смайликов в свои теги и на сервере удаляйте из полученного все теги кроме этих.

B@rmaley.e><e 22.10.2011 21:35

Цитата:

Сообщение от dmitriymar
Открываете возможность для sql инъекции.

При чём тут SQL инъекция?
Цитата:

Сообщение от sommer
Я понимаю, что с точки зрения безопасности это не сильно хорошо отображать введенный пользователем текст в виде html.

Отображать вводимый пользователем HTML вполне безопасно. Другое дело, когда злоумышленник имеет возможность сохранить HTML код (в теле сообщения, скажем) так, что его увидят другие пользователи, либо указать такой запрос, что код будет выполнен у другого пользователя автоматически (или по некоторому действию).

А юзер и так имеет возможность выполнить произвольный код на страничке у себя в браузере: банальный протокол javascript:, например.

dmitriymar 22.10.2011 22:09

Цитата:

Сообщение от B@rmaley.e><e
При чём тут SQL инъекция?

Это инъекция тоже,ничего не мешает и sql внедрять.
Да и нтмл внедрение тоже называют sql инъекцией-в нескольких источниках встречал.
Возможно изза того ,что скрипт код при выполнение на клиенте может инициировать свои запросы,а учитывая нтмл5(работу с базами) -это вообще чистейшая инъекция.

B@rmaley.e><e 23.10.2011 00:24

Цитата:

Сообщение от dmitriymar
Это инъекция тоже,ничего не мешает и sql внедрять.

И как оно связано с отображением вводимого текста? Правильно, никак.
Цитата:

Сообщение от dmitriymar
Да и нтмл внедрение тоже называют sql инъекцией-в нескольких источниках встречал.

"Не читайте до обеда советских газет" ©
Цитата:

Сообщение от dmitriymar
Возможно изза того ,что скрипт код при выполнение на клиенте может инициировать свои запросы,а учитывая нтмл5(работу с базами) -это вообще чистейшая инъекция.

И какие данные он из этой базы утащит?

melky 23.10.2011 04:18

плюс к этому xss, он имел в виду.

dmitriymar 23.10.2011 10:31

Цитата:

Сообщение от B@rmaley.e><e
И какие данные он из этой базы утащит?

если есть базы с какими можно работать с помощью js значит и есть данные какие можно утащить из них.
Те есть если ты вложешь sql код в текст сохраняемый в базе он не выполниться? выполниться вложенный запрос, если не защитит-это не sql инъекция?

sommer 23.10.2011 10:42

Господа! :)
Дайте лучше живой пример!
Так как все хак скрипты что я пробовал не сработали...
А вот если сохранить сообщение с внедренным скриптом в базе и потом его отобразить с помощью innerHTML, то они вполне работают.

B@rmaley.e><e 23.10.2011 10:52

Цитата:

Сообщение от dmitriymar
если есть базы с какими можно работать с помощью js значит и есть данные какие можно утащить из них.

Эти данные хранятся у клиента. Воровать данные у самого себя как-то глупо.
Цитата:

Сообщение от dmitriymar
Те есть если ты вложешь sql код в текст сохраняемый в базе он не выполниться? выполниться вложенный запрос, если не защитит-это не sql инъекция?

Про сохранение в базе в посте ТС ничего не говорилось.

dmitriymar 23.10.2011 11:29

Цитата:

Сообщение от B@rmaley.e><e
Эти данные хранятся у клиента. Воровать данные у самого себя как-то глупо.

да на почему у себя?увести данные сможет любой кто введёт скрипт код в сообщение.
Цитата:

Сообщение от B@rmaley.e><e
Про сохранение в базе в посте ТС ничего не говорилось.

учитывая что он смйлики и т.д хочет -эт чтото на манер форума-так что базы неизбежны по идее

dmitriymar 23.10.2011 11:31

Цитата:

Сообщение от sommer
А вот если сохранить сообщение с внедренным скриптом в базе и потом его отобразить с помощью innerHTML, то они вполне работают.

ну дак регулярками на серверной стороне удали теги <script></script> и перестанет работать.:)
или средствами того серверного языка на каком работаешь

sommer 23.10.2011 11:48

На серверную сторону валидация ASP.Net сама не пропустит любые тэги, ну а если все-таки каким-то чудом в базу сохранился код, то после обработки HtmlEncode любой код становится просто текстом...

Вопрос если в форме ввести текст с кодом и его же отобразить с помощью innerHTML - что такое страшное туда можно ввести? Желательно пример.

dmitriymar 23.10.2011 11:52

Цитата:

Сообщение от sommer
Вопрос если в форме ввести текст с кодом и его же отобразить с помощью innerHTML - что такое страшное туда можно ввести? Желательно пример.

код без тегов <script> в тексте ,это не код а просто текст.какая может быть опасность от просто текста?

sommer 23.10.2011 13:19

Но ведь если я введу такой текст, то это явно может быть опасно ( хотя запуск сообщения и не происходит )

<script type="text/javascript" language="javascript">
alert('попытка');
</script>

dmitriymar 23.10.2011 13:24

Цитата:

Сообщение от sommer
Но ведь если я введу такой текст, то это явно может быть опасно ( хотя запуск сообщения и не происходит )

чем? если теги <script> из него удалятся на сервере.
но исходя из вопроса,прочтите основы js , а именно первую страницу любого учебника по скрипту,где объясняется где js а где просто текст:-E

sommer 23.10.2011 14:17

Нет! Теги <script> удалятся только после публикации.
А при предпросмотре они не удаляются....
Предложение прочитать первую страничку учебника несерьезно.
Я на JavaScript достаточно написал кода... ( хотя я и не эксперт )

sommer 23.10.2011 14:18

PS:
Нашел вот такую функцию для энкодинга:

function encodeHTML(s) {
return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
}

somediv.innerHTML= '<p>Hello, '+encodeHTML(name)+'</p>';

B@rmaley.e><e 23.10.2011 18:09

Цитата:

Сообщение от sommer
Вопрос если в форме ввести текст с кодом и его же отобразить с помощью innerHTML - что такое страшное туда можно ввести? Желательно пример.

Я уже ответил:
Цитата:

Сообщение от B@rmaley.e><e
Отображать вводимый пользователем HTML вполне безопасно. Другое дело, когда злоумышленник имеет возможность сохранить HTML код (в теле сообщения, скажем) так, что его увидят другие пользователи, либо указать такой запрос, что код будет выполнен у другого пользователя автоматически (или по некоторому действию).



Цитата:

Сообщение от dmitriymar
увести данные сможет любой кто введёт скрипт код в сообщение.

Угу, только ввести этот код сможет только текущий юзер.

Цитата:

Сообщение от dmitriymar
учитывая что он смйлики и т.д хочет -эт чтото на манер форума-так что базы неизбежны по идее

Какая связь между смайликами и базой? Смайлики организуются простой заменой ключевых слов.

dmitriymar 23.10.2011 18:27

Цитата:

Сообщение от B@rmaley.e><e
Угу, только ввести этот код сможет только текущий юзер.

Цитата:

Сообщение от B@rmaley.e><e
Какая связь между смайликами и базой? Смайлики организуются простой заменой ключевых слов.

да почему?-он ведь практически явно пишет что у него за проект. и это предполагает в 99% базу. и соответственно код с инъекцией получат все, при просмотре страницы сайта.

B@rmaley.e><e 23.10.2011 18:32

Цитата:

Сообщение от dmitriymar
да почему?-он ведь практически явно пишет что у него за проект. и это предполагает в 99% базу. и соответственно код с инъекцией получат все, при просмотре страницы сайта.

В сообщениях ТС написано обратное:
Цитата:

Сообщение от sommer
Теги <script> удалятся только после публикации.

Таким образом, вредоносный код получит только текущий юзер.

sommer 23.10.2011 19:02

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 132427)
Таким образом, вредоносный код получит только текущий юзер.

Ну, да, - действительно....
100% верный ответ относительно JavaScript.
Остаются небольшие сомнения по поводу других скриптов, которые могут быть введены. php, например

dmitriymar 23.10.2011 19:08

Цитата:

Сообщение от B@rmaley.e><e
Сообщение от sommer
Теги <script> удалятся только после публикации.
Таким образом, вредоносный код получит только текущий юзер.

но он это сравнительно недавно сказал,до этого было:

Цитата:

Сообщение от sommer
А вот если сохранить сообщение с внедренным скриптом в базе и потом его отобразить с помощью innerHTML, то они вполне работают.

Цитата:

Сообщение от sommer
На серверную сторону валидация ASP.Net сама не пропустит любые тэги, ну а если все-таки каким-то чудом в базу сохранился код, то после обработки HtmlEncode любой код становится просто текстом...


B@rmaley.e><e 23.10.2011 21:30

Цитата:

Сообщение от sommer
php, например

Ну это тут вообще не при чём. Для исполнения php нужен интерпретатор php, которого в браузере нет.

Цитата:

Сообщение от dmitriymar
до этого было

В самом начале этого не было. Судя по первому посту, подразумевалось копирование содержимого какого-нибудь textarea в innerHTML, скажем, div'а. Без использования серверной стороны вообще.

dmitriymar 23.10.2011 21:34

Цитата:

Сообщение от B@rmaley.e><e
В самом начале этого не было. Судя по первому посту, подразумевалось копирование содержимого какого-нибудь textarea в innerHTML, скажем, div'а. Без использования серверной стороны вообще.

мы по разному поняли его)

Magneto 23.10.2011 21:37

Нет никакой опасности. Давно известно что валидацию данных нужно проводить на серверной стороне. То что делается силами javascript, на стороне клиента, предназначенно только для удобства пользователя.

sommer 24.10.2011 10:39

Бормалей меня правильно понял.
Вопрос был именно о клиентской стороне. С серверной стороной я разобрался.
Пожалуй, успокоюсь ответами. Спасибо.
Но для большей уверенности добавлю энкодинг приведенный мною выше.
( на всякий случай )


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