Легкий и безопасный способ предотвращения XSS - PullRequest
0 голосов
/ 30 мая 2011

Каждое текстовое поле в этом текущем проекте является обычным плоским текстом без тегов ubb или html. Однако это должен быть Unicode, поэтому я думаю, что массив с поддерживаемыми символами не является оптимальным.

Я знаю, что существует множество выделенных классов для обнаружения xss, однако не все xss включают эти 2 символа:

Символ <</p>

<
%3C
&lt
&#60;
&60;
&#x3C;
PA==

Символ;

;
%3B
&#x3B;
&#59
Ow==
&59;

Если я проверю весь ввод пользователя (get, post, cookie) для символов в кодовых блоках выше, тогда все должно быть на 100% безопасно? Проект не работает на MySQL, он использует Cassandra, поэтому внедрение MySQL не должно быть проблемой.

Я уверен, что что-то забыл, но я не знаю, что ... Или действительно ли так легко создавать 100% безопасные приложения, когда пользовательский ввод представляет собой плоский текст?

Edit: Список немного длиннее, здесь можно найти первый символ: http://ha.ckers.org/xss.html

 <
    %3C
    &lt
    &lt;
    &LT
    &LT;
    &#60
    &#060
    &#0060
    &#00060
    &#000060
    &#0000060
    &#60;
    &#060;
    &#0060;
    &#00060;
    &#000060;
    &#0000060;
    &#x3c
    &#x03c
    &#x003c
    &#x0003c
    &#x00003c
    &#x000003c
    &#x3c;
    &#x03c;
    &#x003c;
    &#x0003c;
    &#x00003c;
    &#x000003c;
    &#X3c
    &#X03c
    &#X003c
    &#X0003c
    &#X00003c
    &#X000003c
    &#X3c;
    &#X03c;
    &#X003c;
    &#X0003c;
    &#X00003c;
    &#X000003c;
    &#x3C
    &#x03C
    &#x003C
    &#x0003C
    &#x00003C
    &#x000003C
    &#x3C;
    &#x03C;
    &#x003C;
    &#x0003C;
    &#x00003C;
    &#x000003C;
    &#X3C
    &#X03C
    &#X003C
    &#X0003C
    &#X00003C
    &#X000003C
    &#X3C;
    &#X03C;
    &#X003C;
    &#X0003C;
    &#X00003C;
    &#X000003C;
    \x3c
    \x3C
    \u003c
    \u003C

Ответы [ 2 ]

2 голосов
/ 30 мая 2011

Нет смысла пытаться запретить «злые» символы при вводе, и еще меньше смысла пытаться запретить версии, закодированные в различных формах. Вы будете ложно-положительными и заблокируете действительный ввод, не защищая себя от всех возможных форм отверстия для инъекций. Я не уверен, какую атаку вы пытаетесь предотвратить, запретив Ow== , а не, скажем, & или ".

Правильный способ остановить внедрение HTML - это вызвать htmlspecialchars() для любой текстовой строки, выводимой на страницу HTML. Правильный способ остановить внедрение URL-компонента - вызвать rawurlencode() для текстовых строк, выводимых в URL. Правильный способ остановить SQL-инъекцию - вызвать соответствующую функцию экранирования БД (например, mysql_real_escape_chars()) для любого текста, выводимого в строковый литерал SQL.

И так далее, для каждого, кто может сбежать, вы можете столкнуться. Дело в том, что это функция выходного уровня, которую нужно применять, когда вы помещаете текст в новый контекст, используя правильную функцию для того типа контекста, который у вас есть. Это не то, что вы можете сделать один раз на этапе ввода, а затем забыть о нем, потому что на этапе ввода вы не знаете, будет ли текст, который вы обрабатываете, заканчиваться литералом SQL, страницей HTML, строкой JavaScript литерал, параметр URL или что.

Это не значит, что проверка на этапе ввода бесполезна; Вы хотите, чтобы проверенное поле, которое должно быть числом, действительно выглядело как число, или дата, дата или что-то еще. Но проверка правильности ввода не является решением проблем с выходом, таких как проблема внедрения HTML, которая вызывает большинство XSS. Чтобы это сработало, вам придется запретить почти все знаки препинания, что будет довольно враждебно для пользователя.

1 голос
/ 30 мая 2011

однако не все xss включают эти 2 символа: (...) [

Нет, они не ... как шпаргалка , на которую вы ссылаетесь, предложит.например (MG Embedded command part II)

Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser

Действительно ли так легко создать 100% безопасные приложения, когда пользовательский ввод представляет собой плоский текст?

Скажем, этопроще.Вам по-прежнему нужно беспокоиться о внедрении SQL, XSS (его меньше, но все еще потенциально может составлять при малейшем, неправильно сбежавшем фрагменте данных) и CSRF.

...