Статьи

SafeHTML — ввод формы очистки

В данный момент читаю пару книг по безопасности.

Одним из них является Apache Security от Ивана Ристика ( mod_security ), с которым я снова встретился на прошлых выходных. Сохраню длинный обзор в другой раз (я еще не закончил читать), достаточно сказать, что это необходимо прочитать, если вы что-то делаете с Apache. В частности, разработчики PHP, которые склонны видеть только свою небольшую часть стека («Apache — проблема хостов, верно?»).

Другой — PHP-Sicherheit , немецкое издание, одним из авторов которого был Кристофер Кунц , который присутствовал на конференции и говорил о Hardened PHP .

SafeHTML

Также пока не могу сказать много о PHP-Sicherheit , кроме того, что мне нравится то, что я видел до сих пор. Что заставило меня набрать текст, так это упоминание Романа Иванова о SafeHTML — «анти-XSS HTML-парсере, написанном на PHP», которого я раньше не видел. Странным образом это своего рода продукт Sitepointforums, учитывая, что он использует XML_HTMLSax , который в основном был разработан в этой теме .

Теперь SafeHTML действует как фильтр, пытаясь убрать что-нибудь опасное. Общее мнение в Интернете заключается в том, что это практически невозможно сделать — существует так много способов использовать слово «javascript» в качестве протокола к ссылке, например, и IE (к сожалению) очень простителен. Я только взглянул на код, но пока он выглядит убедительно. Например, вот как он имеет дело с анализом протокола связи (только соответствующие биты класса)…


    var $blackProtocols = array(
        'about',   'chrome',     'data',       'disk',     'hcp',     
        'help',    'javascript', 'livescript', 'lynxcgi',  'lynxexec', 
        'ms-help', 'ms-its',     'mhtml',      'mocha',    'opera',   
        'res',     'resource',   'shell',      'vbscript', 'view-source', 
        'vnd.ms.radio',          'wysiwyg', 
        );

        // ...

      foreach ($this->blackProtocols as $proto) {
          $preg = "/[sx01-x1F]*";
          for ($i=0; $i<strlen ($proto); $i++) {
              $preg .= $proto{$i} . "[sx01-x1F]*";
          }
          $preg .= ":/i";
          $this->_protoRegexps[] = $preg;
      }

Должен соответствовать не только «javascript», но также «java script» и многим другим возможным комбинациям, содержащим управляющие символы ASCII.

Похоже, что он умно относится к UTF-7 — еще не рассматривал это внимательно. Еще один хороший знак (как ни странно) — это « сообщения об ошибках », которые также были исправлены.

Тем не менее, до сих пор не совсем убежден — одна вещь, которая меня озадачивает, это то, что он принимает все решения о том, что HTML-код лишен для вас. Будет ли он справляться с табличным тегом большой ширины, который, например, эффективно нарушает дизайн (ОК — это не XSS, а …)? Еще продолжаю расследование… Также было бы хорошо увидеть это где-нибудь вроде Берлиоса или Sourceforge .

В противном случае — примечание стороны (возможно, к Роману) — с тех пор Джефф улучшил производительность (по сравнению с HTMLSax) с помощью нового дизайна, который можно найти здесь .