Как избежать небезопасного содержимого в форме, чтобы предотвратить XSS? - PullRequest
2 голосов
/ 17 июня 2011

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

<input type="text" value="'test' "test" <script>alert('hacked');</script>" />

Когда я оставляю это так, оно выглядит правильно

'test' "test" <script>alert('hacked');</script>

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

Редактировать: я не сказал всю историю.Извини за это.Когда я использую htmlentities или htmlspecialchars, я получаю экранированные данные, которые мне не нужны.Я вижу это на входе, а не то, что было введено: (

'test' &quot;test&quot; &lt;script&gt;alert('hacked');&lt;/script&gt;

Я хочу запретить XSS и показывать содержимое, не изменяя его одновременно. Возможно ли это в этом случае. enter image description here

Ответы [ 4 ]

2 голосов
/ 17 июня 2011

Вы должны HTML кодировать текст, чтобы он заканчивался так:

<input type="text" value="'test' &quot;test&quot; &lt;script&gt;alert('hacked');&lt;/script&gt;" />

Для этого вы должны использовать язык сервера. В Javascript нет встроенной поддержки для этого, поэтому вам придется создать для этого функцию самостоятельно.

Например, в ASP.NET MVC это может выглядеть так:

<input type="text" value="<%= Server.HtmlEncode(Model.UserInput) %>" />

MVC 2 также имеет тег <%: %>, который автоматически кодирует текст:

<input type="text" value="<%: Model.UserInput %>" />

Edit:

Изучите источник страницы в браузере, чтобы увидеть, каков результат.

Похоже, вы дважды экранировали текст, так что, например, " экранируется в &quot;, а затем в &amp;quot;.

1 голос
/ 17 июня 2011

В PHP используйте htmlspecialchars() для экранирования символов XSS в любом содержимом GET или POST (например, если ваши данные называются $_POST['data'], экранируйте их следующим образом: $variable = htmlspecialchars($_POST['data']);).Кроме того, если вы используете базу данных, используйте addslashes() для экранирования кавычек и апострофов.

Надеюсь, это поможет.

0 голосов
/ 17 июня 2011

Поскольку знак кавычки используется для выделения из входного атрибута, просто замените все кавычки на "

0 голосов
/ 17 июня 2011

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

Пока вы дезинфицируете выход.Вы можете позволить пользователю вводить все, что он пожелает.Затем при отображении контента вам просто нужно закодировать его, чтобы браузер не выполнял его.Это можно сделать на любом языке PHP, JScript, ASP, VB, C # и т. Д. *

...