Четверг , 18 Апрель 2024
ДомойБезопасностьобработка пользовательских переменных, предотвращение xss

обработка пользовательских переменных, предотвращение xss

php

в предыдущей статье было рассказано о php-инъекции. теперь настала очередь разобраться с xss, с помощью которой, при определённых обстоятельствах, можно даже украсть и использовать куки администратора. а имея административный доступ с сайтом, как правило, можно сделать практически всё, что угодно.

xss

после успешного написания гостевой книги или даже простенького чата может захотеться чего-то большего, помимо простой отправки сообщений. но так ли безопасно то, что уже имеется? пользователи отправляют сообщения друг-другу и все довольны, но обязательно найдётся кто-то, знакомый с html, решивший шутки ради выделить текст своего сообщения жирным. простейшее сообщение:

<b>Всем привет!</b>

возымеет эффект бомбы: все начнут общаться также, пока не появится юзер с недобрыми намерениями и таким сообщением:

<script>alert('Ты дурак!');</script>

теперь после каждой перезагрузки странички все пользователи будут получать обидное сообщение в выпрыгивающем диалоге.

и здесь всё дело в недостаточной фильтрации данных. только если в примере с php-инъекцией дело спасала предварительная обработка данных, здесь будет более уместно пост-экранирование. т. е. строка перед выводом в браузер должна обрабатываться специальной функцией, препятствующей возможности отсылать теги. имя этой функции — htmlspecialchars.

при обработке следующие символы: & < > " заменяются на их эквиваленты (мнемоники): &amp; &lt; &gt; &quot; и уже в браузере предстают перед пользователем в своём первозданном виде.

конечно, можно обработать строку и перед добавлением в базу, вырезав из неё все недопустимые теги. но на данной момент 100% способа нет. как встроенные функции по вырезанию тегов, так и написанные кем-то всё-равно можно обойти, подобрав такую конструкцию-нагромождение, что парсеры благополучно пропустят то, что нужно злоумышленнику. в самом плачевном состоянии находятся функции, работающие по парным (открывающему и закрывающему) тегам: если кто-то «забудет» закрыть тег, делающий текст жирным, такой парсер это пропустит.

но если пользователям хочется дать возможность использовать разные украшательства, какой же выход? лучший выход — вообще запретить пользователям использовать html-теги, и вместо них «прикрутить» популярные bb-теги. многие с этим наверняка знакомы, например, тек ссылки будет выглядеть так:

[url]https://a-panov.ru/[/url]

соответствующая функция сама разберёт всё на составляющие и создаст код для вставки, который на страничке будет таким:

https://a-panov.ru/

теперь можно подвести краткий итог:

1. либо перед записью в базу, либо перед выводом в браузер текста, который пришёл от пользователя, его требуется экранировать функцией htmlspecialchars (но только 1 раз);

2. если хочется дать пользователям некоторые специальное возможности, в виде раскраски текста, оставления ссылок и других, лучше всего это делать посредством bb-кодов. и обработка должна осуществлять после выполнения п. 1 (иначе данные, переведённые в коду, будут представлены html-мнемониками).

Рейтинг: 0

Автор публикации

2 070
не в сети 12 месяцев

x64 (aka andi)

Комментарии: 2893Публикации: 405Регистрация: 02-04-2009
Так себеНеплохоХорошоЗамечательноСупер! (Оценок пока нет)
Загрузка...

11 комментариев

  1. Вы пишите, что в форме если хочется оставить теги красивости — жирный и тд то лучше использовать BB коды и что функция сама их «увидет». ПРо какую функцию идет речь?

    Рейтинг: 0
  2. в php такой встроенной функции нет. но в интернете есть очень много реализаций подобного. в простейшем случае замена может выглядеть так:
    $post = preg_replace(‘!\[b\](.+)\[/b\]!i’, ‘$1‘, $post);
    по тексту ищется что-то вроде: [b]жирный текст[/b] и замена выше превратит его в жирный текст
    на самом деле, в интернете много готовых решений, и даже по корявому запросу «php функция bb-коды» кое-что можно найти

    Рейтинг: 0
  3. Если создать в контексте таймер и присвоить его к переменной, после запуска уничтожив ID — получится не плохой червяк. Его уже будет не остановить и не найти пока страница не обновится или не произойдет переход laugh

    Рейтинг: 0
    • Дмитрий, я так понимаю, Вы крупный специалист по javascript? По крайней мере, при просмотре странички так показалось smile

      Рейтинг: 0
      • Просто любитель, если честно. Где же их сыскать таких крупных? Если только в браузерных компаниях и то там слово ECMA сильнее восприниматеся.
        Почитал Рэзига, добавил пару своих фишек и перестал разбираться в jQuery и всяком другом.

        Рейтинг: 0
        • Раньше у меня была идея-фикс делать всё самому. Никаких фреймворков и прочее. Но после того, как заставил себя познакомиться с jQuery, мнение своё изменил.
          Это не значит, что данный фреймворк используется везде — если нужно получить значение какого-нибудь поля, выполнить над ним математические действия и вывести на экран, делать буду на JS. А для сложных плюшек или красивостей — jQuery.

          Рейтинг: 0
          • Нужно взять sizzle и добавить к нему один единственный AJAX + парочка вспомогательных функций. Вот и весь фреймворк. Тут в дизайне дело больше, чем в UI на мой взгляд.
            Поэтому лабают не стеcняясь. Я ценю когда лишнего нет — из-за интернета в основном.

            Рейтинг: 0
            • Тут согласен, интернет диктует условия. Если скорость соединения низкая, либо существует плата на трафик, начинаешь подстраивать всё под себя. А когда у всех знакомых интернет — быстрый безлимит, руководствуешься принципом разумной достаточности. Хотя мой первый сайт, помнится, содержал картинки в формате *.bmp, с чего до сих пор от себя офигеваю.
              Sizzle шикарен и минималистичен, не подкопаться.

              Рейтинг: 0
              • Хех … ту не в этом дело. Я уже давно не обращаю внимание на интернет с точки зрения его проводных характеристик. Вышел даже из пользователей WIFI, что намекает про мобильность.
                А у мобильного интернета стоимость сегодня совсем уже не приятная. Она сравнялась со стоимостью интернета на проводах 6-7 лет назад, а слова безлимитный в России почти нет.
                Это 100mb в сутки безлимом не назвать, остальное по 8, 15 Gb и на день и ночь, а когда торрент выгрузит случайно все что стояло в фоне(исходящий) скорость станет 7-30кб в реальности.

                Вот это важно. У меня другого интеренета, да мне другой и не нужен. Я себе специально делал систему под хакинтош, чтобы работать комфортно. Кароче учитывая всех мне подобных — я точно уверен, что чем компактнее сделаешь — тем меньше у них ненависти к провайдеру.

                Мне хорошо — им хорошо, а тем у кого вафля и провода — даже не понять как это работает. Я вот так на жизнь и сайты смотрю уже года 4, но паблик пока не подрос до этого, да и не ранжируют этим.

                Sizzle — все что надо от jQuery smile

                Рейтинг: 0
                • Я вот вспоминаю, как лет 8 назад на телефонах (не смартах) Nokia «смотрели большой интернет», и ничего так.
                  А сейчас, набаловались, из коробки всем интерфейсу и юзабилитей подавай laugh
                  Шутки шутками, но печально, что до сих пор ни одна компания не предлагает мобильного безлимита. Только по телику рекламят «целых 100 мегабайт в сутки», а это, по сути, 3 клипа на Ютубе в хорошем качестве. Не позорились бы хоть такими числами, у меня 10 лет назад подключение по такому тарифу было.
                  Ну а в Москве людям проще, там WiFi есть (и Yota, про которую не знаю, да и не особо хочется что-то узнавать).

                  Рейтинг: 0
  4. Ыыы ;) В принципе на VNC хватит или RDP laugh если у серва нормальный и проводной инет. Вот только без звука, сцуко.

    Рейтинг: 0

Оставить комментарий

Политика конфиденциальности

Наш сайт использует файлы cookies, чтобы улучшить работу и повысить эффективность сайта. Продолжая работу с сайтом, вы соглашаетесь с использованием нами cookies и политикой конфиденциальности.

Принять