Как защититься от XSS?

Тема в разделе "PHP", создана пользователем membrana, 13 май 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. membrana

    membrana Создатель

    Регистр.:
    13 ноя 2008
    Сообщения:
    10
    Симпатии:
    5
    Есть сайт с register_globals = On, есть переменная $query. Есть атака вида: Перейти по ссылке
    Ну и есть нуб в php, который полжизни отдал дизайну и вёрстке :D, а сейчас бы хотел поплотнее заняться php, ибо программер, причём за деньги, мне на моих сайтах накосорезил столько, что сейчас я начинаю нести убытки.
    ---
    Пытаюсь сам писать проверку:
    Код:
      if (!empty($query))
        $query=strip_tags(html_entity_decode($query));
        @$query=str_replace("%", "& # 0 3 7 ;", @$query); //ббкоде нулледа тут режет мой символ, "& # 0 3 7 ;" у меня в коде, естественно, без пробелов.
        $query=str_replace("<", "&lt;", $query);
        $query=str_replace(">", "&gt;",$query);
        $query=str_replace("\"", "&quot;", $query);
    
    Первая строка проверки у меня режет хтмл
    Вторая режет символ процента... Вот тут-то верно ли я делаю? Мне кажется, чо нет, ибо яндекс-вебматер подсказал мне сегодня, что я - лох чилийский, и меня дерут во все щели. Хотел бы, чтоб гуру пхп объяснили мне именно на моём примере, что я неправильно делаю. Так как для меня более важно понять, чем попросить готовый код проверки у вас, гуру :ay:
     
  2. Acidrayne

    Acidrayne

    Регистр.:
    30 сен 2007
    Сообщения:
    296
    Симпатии:
    20
    попробуйте так

    Код:
    $query=str_replace('?', '%s', str_replace('%', '%%', $query));
    А вообще в сети уже есть готовые библиотеки для безопасной работы с MYSQL

    http://www.phpclasses.org/browse/package/3698.html
    Перейти по ссылке
     
    membrana нравится это.
  3. mayor

    mayor Писатель

    Регистр.:
    29 ноя 2008
    Сообщения:
    3
    Симпатии:
    1
    какойто ужас, понять тебе поможет - ru.php.net
    вообщем здесь куча ненужных проверок, чтобы защититься от xss просто достаточно использовать функцию - htmlspecialchars


    PHP:
    <?php
      
    if (isset($_GET['query'])){
        
    $query htmlspecialchars($_GET['query'],ENT_QUOTES)
      }
    ?>
     
    membrana нравится это.
  4. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    312
    Acidrayne, при чем тут MySQL? 0_o
    membrana, можно вырезать теги ф-цией strip_tags() либо пропустить через htmlspecialchars (как посоветовал mayor)
     
    membrana нравится это.
  5. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    strip_tags() не защищает до конца от XSS, кроме того юзер может искать что-то, совпадающее с тегом. Поэтому htmlspecialchars
     
  6. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    У вас проверяется только переменная $query........
    какая она? т.е если числовая то
    intval($query) или numeric($query)
    если символьная htmlspecialchars($query) или регэпсами
    обрабатывайте все глобальные переменные с учетом get_magic_quotes_gpc()
    PHP:
    if (get_magic_quotes_gpc()== 1)
    {
      function 
    s_slash($v)
      {
        if (
    is_array($v))
        return 
    array_map('s_slash'$v);
        return 
    stripslashes($v);
      }
            if (!empty(
    $_GET))     $_GET     s_slash($_GET);
            if (!empty(
    $_POST))    $_POST    s_slash($_POST);
            if (!empty(
    $_COOKIE))  $_COOKIE  s_slash($_COOKIE);
            if (!empty(
    $_REQUEST)) $_REQUEST s_slash($_REQUEST);
    }
    если $query вносится в БД то mysql_escape_string()
     
  7. BSunV

    BSunV

    Регистр.:
    8 окт 2008
    Сообщения:
    186
    Симпатии:
    45
    Вместо htmlspecialchars() я бы советовал применять htmlentities(), так как он конвертирует ВСЕ символы строки (естественно кроме букв) в мнемоники хтмл.
     
Статус темы:
Закрыта.