Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Экранирование Input (https://javascript.ru/forum/dom-window/30508-ehkranirovanie-input.html)

svs_js 07.08.2012 01:08

Экранирование Input
 
Всем привет,

такая проблема :)
есть у меня Инпут
<input type="text" value="<script>alert(1)</script>" />

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

Deff 07.08.2012 01:10

<input type="text" value="&lt;script&gt;alert(1)&lt;/script&gt;" />

oneguy 07.08.2012 01:11

< и > экранруются как &lt; и &gt;

svs_js 07.08.2012 01:13

да, я так и делал :)
но тогда ж и выводится внутрь инпута lt и gt )))) что не очень красиво

svs_js 07.08.2012 01:17

я при срабатывании аккордеона делал что-то похожее на это

$(this).value = $(this).value.replace('<', '&lt;').replace('>', '&gt;');

Deff 07.08.2012 01:19

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

oneguy 07.08.2012 01:22

Если вы записываете свойство value через DOM, то никакие символы не нужно экранировать - текст выводится такой же, как и в строке значения свойства value (без замен &lt; на < и т.д.)

svs_js 07.08.2012 01:23

Теги <script> ? а их пользователь может ввести в инпут и сохранить на сервер, а потом снова вывести в эту форму.. в иторе VALUE будет иметь такой вид :)
Отправлять на сервер, заменяя специсимволы, у меня нет возможности :) нет события, к какому привязаться.

А вот при срабатывании аккордеона можно :)

Deff 07.08.2012 01:26

svs_js,
Чот невнятно как то задача...

Что - зачем откуда и зачем вообще конструкция нужна

svs_js 07.08.2012 01:29

Есть форма :) в форме инпут.
заполняем форму и в один из инпутов пишем <script>alert(1)</script>
вот прям тег и пишем :)
вместо алерта может быть совсем другой код ЖС

и вот смысл в том, что когда мы выводим значение инпута, код ЖС, какой записан в качестве значения поля, выполняется :)

и нам нужно обезопасить себя от таких умных пользователей :)

Deff 07.08.2012 01:31

svs_js,
Зачем ?
Цитата:

Сообщение от svs_js
и вот смысл в том, что когда мы выводим значение инпута, код ЖС, какой записан в качестве значения поля, выполняется

Чем Вы выводите значение инпута ?
Когда должен выполниться этот код ?
Есть еще куча вопросов - потому, что так не стоит делать, посколь можно и элегантней, безопасней и проще

oneguy 07.08.2012 01:32

Тогда нужно в любом тексте, приходящем от пользователей, который вписывается в HTML код, экранировать чувствительные символы на сервере.
Например, в PHP для этого есть функция htmlspecialchars.

oneguy 07.08.2012 01:33

Цитата:

Сообщение от Deff
svs_js,
Зачем ?

Если я правильно понял, автор хочет защититься от атаки XSS.

svs_js 07.08.2012 08:41

oneguy,

совершенно верно. а вот функции ПХП нет возможности использовать, сайт не на пхп :)

bes 07.08.2012 12:08

Ну и сделайте перед отправкой проверку на присутствие слова script в value


<input type="text" value="<script>alert(1)</script>" 
  onclick=" (value.indexOf('script') != -1) ? alert('есть script') : alert('нет script')" 
/>

oneguy 07.08.2012 19:49

Цитата:

Сообщение от svs_js
совершенно верно. а вот функции ПХП нет возможности использовать, сайт не на пхп

Если не на ПХП, то эту функцию несложно написать самому. Нужно заменить в строке символы "&", "<", ">", "\"" на соответственно "&amp;", "&lt;", "&gt;", "&quot;".

oneguy 07.08.2012 19:51

Цитата:

Сообщение от bes
Ну и сделайте перед отправкой проверку на присутствие слова script в value

Этого недостаточно, так как скрипт можно вставлять не только с помощью элемента <script>, а ещё с помощью атрибута on...
Да если ещё проверку делать только на клиенте, то это не помешает хакерам обойти эту защиту.

bes 07.08.2012 19:54

Цитата:

Сообщение от oneguy
Этого недостаточно, так как скрипт можно вставлять не только с помощью элемента <script>, а ещё с помощью атрибута on..

а также href = "javascript:


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