безобасность php

Discussion in 'PHP' started by e-gral, 1 Feb 2012.

  1. e-gral

    e-gral Banned

    Joined:
    4 Mar 2008
    Messages:
    18
    Likes Received:
    0
    Reputations:
    0
    делаю возможность комментирования через textarea, полученные данные записываю в БД, перед этим экранируя спец символы с mysql_real_escape_string.
    Извлекаю данные и вывожу на экран таким образом:
    echo nl2br(htmlspecialchars());

    Собственно вопрос: насколько такой метод безопасен? или правильный?
     
  2. Osstudio

    Osstudio Banned

    Joined:
    17 Apr 2011
    Messages:
    638
    Likes Received:
    160
    Reputations:
    81
    Уг полный, делай запросы бд всегда в кавычках, чтобы скуля была вида '+order+by... и экранируй '... этого будет достаточно, т.к пользователь не сможет провести sql-атаку, ну и соответственно дебаг выруби, и проверяй запрос на true... ;)
     
  3. SeNaP

    SeNaP Elder - Старейшина

    Joined:
    7 Aug 2008
    Messages:
    378
    Likes Received:
    69
    Reputations:
    20
    Кул хацкеры всегда проводят SQLi через ковычку?

    Вот, что получиться, если экранировать только '
    Code:
    INSERT INTO `news` (`name`, `txt`, `time`, `u_id`) VALUES ('senap\', ', (SELECT 1000777), "", "") #,'233223', '1')
    если в запросе участвует как минимум 2 параметра, на которые можно влиять
     
  4. e-gral

    e-gral Banned

    Joined:
    4 Mar 2008
    Messages:
    18
    Likes Received:
    0
    Reputations:
    0
    SeNaP
    не совсем понял...
    допустим у меня 2 переменные $name и $txt в которых я получаю данные данные от пользователя
    записываю в бд
    $name = mysql_real_escape_string($name);
    $txt = mysql_real_escape_string($txt);
    INSERT INTO `news` (`name`, `txt`) VALUES ('$name', '$txt')

    извлекаю из бд и вывожу на экран
    echo htmlspecialchars($name);
    echo htmlspecialchars($txt);

    какие значения передать $name и $txt чтоб провести атаку в этом примере?
     
  5. SeNaP

    SeNaP Elder - Старейшина

    Joined:
    7 Aug 2008
    Messages:
    378
    Likes Received:
    69
    Reputations:
    20
    В данном случаи ты ни как не проведешь атаку, единственное, что можно добавить это если $name или $text передать как массив, в результате появиться предупреждение о том, что функция mysql_real_escape_string принимает только строковый тип данных и выведет путь до файла.

    PHP:
    $name mysql_real_escape_string((string)$name);
    $txt mysql_real_escape_string((string)$txt);
    INSERT INTO `news` (`name`, `txt`) VALUES ('$name''$txt')
    Это от раскрытия путей, если в скрипте включен показ ошибок.
     
  6. Чакэ

    Чакэ Elder - Старейшина

    Joined:
    15 Aug 2010
    Messages:
    260
    Likes Received:
    66
    Reputations:
    62
    это лишнее. ошибки должны быть выключены если приложение вышло за рамки «стадия разработки»
     
  7. SeNaP

    SeNaP Elder - Старейшина

    Joined:
    7 Aug 2008
    Messages:
    378
    Likes Received:
    69
    Reputations:
    20
    Ну это у кого, кто то забывает, а кто то вообще не отключает
     
  8. trololoman96

    trololoman96 Elder - Старейшина

    Joined:
    1 Dec 2011
    Messages:
    120
    Likes Received:
    34
    Reputations:
    55
    Безопасно, если не используются мультибайтовые кодировки в бд или не забыли поместить в кавычки параметр. Но ИМХО, это устарело уже давно (+ если не ошибаюсь то стандартную библиотеку mysql собираются выпилить в следующих версиях php), используйте pdo либо mysqli они позволяют использовать подготовленные запросы, так что если 1 раз разобраться в синтаксисе о sql inj можно забыть навсегда. В добавок скажу что это еще и удобней, не нужно постоянно беспокоится о кавычках, либо загромождать код постоянными проверками mysql_real_escape_string().

    Насчет xss, то вполне безопасно, только если кодировка файла не utf-7 и данные не выводятся где-нибудь в ссылке.