фильтрация данных на пхп

Discussion in 'PHP' started by Piflit, 1 Jan 2008.

Thread Status:
Not open for further replies.
  1. Macro

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

    Joined:
    11 Nov 2006
    Messages:
    552
    Likes Received:
    298
    Reputations:
    207
    Ну дык речь идет про текст ведь, т.е. про данные в кавычках ;) Без кавычек, разумеется. Если данные должны быть int, тогда intval() в помощь.
     
    1 person likes this.
  2. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    дык твой запрос не будет выполнен, т.к. ошибка синтаксиса :p
    а если выборку по id делать то можно intval() применить :)
     
  3. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    может лучше вместо stripslashes(); $var = str_replace("\\", "", $var); ?
    тоха, мне нужны не числовые параметры. а для числовых, конечно, intval() + проверка на знак =)
     
  4. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    чтониб вроде..
    PHP:
    function xek($string)
    {
        if (
    get_magic_quotes_gpc()) {
            
    $string stripslashes($string);
        }
        if (!
    is_numeric($string)) {
            
    $string "'" mysql_real_escape_string($string) . "'";
        }
        return 
    htmlspecialchars($string);
    }
    а потом это уже в запрос кидать..

    ну еще в довесок можно проверять на a-zA-Z0-9, хотя в идеале хватит только его. если точно знаешь что другого не будет в строке
     
    #24 darky, 1 Jan 2008
    Last edited: 1 Jan 2008
  5. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    blackybr зачем добавлять одинарные кавычки, если параметр is_numeric?
     
  6. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    если не число, то mysql_real_escape_strin и добавляем кавычки чтобы в запрос передать в кавычках уже строку) хотя прав, не обязательно, но почему бы и нет
     
    1 person likes this.
  7. NOmeR1

    NOmeR1 Everybody lies

    Joined:
    2 Jun 2006
    Messages:
    1,068
    Likes Received:
    783
    Reputations:
    213
    htmlspecialchars спасёт от XSS
    PHP:
    htmlspecialchars('<script>alert("xss")</script>');
    , mysql_escape_string спасёт от скули
    PHP:
    mysql_query("SELECT test FROM test WHERE test2 = '".mysql_escape_string("1'+order+by+100")."'");
    , чтобы проинклудить файл нужно проверять его существование на сервере
    PHP:
    if(file_exists('./'.$_GET['file'])) {
      include(
    $_GET['file']);
     }
    (просто примеры), а лучше фильтровать символы.
    PHP:
    preg_replace('|[^a-z0-9]|i'NULL$_GET['test']);
     
    1 person likes this.
  8. Евгений Минаев

    Евгений Минаев Elder - Старейшина

    Joined:
    12 Nov 2007
    Messages:
    55
    Likes Received:
    169
    Reputations:
    159
    Не надо заморачиваться , все предельно просто . Все передаваемые значения должны быть в ковычках , это сразу спасает от 99 процентов проблем да и mysql проглотит этот запрос быстрее , прежде чем применить
    PHP:
    addslashes() 
    надо проверить включены ли magic_quotes_gpc
    PHP:
    get_magic_quote_gpc
    четко выставить кодировку , желательно отфильтровать данные на спецсимволы
    PHP:
    $text trim $text );$text trim $text "\x00..\x1F" );
    htmlspecialchars надо использовать с ENT_QUOTES иначе одинарная ковычка не будет фильтроваться
    PHP:
    htmlspecialchars$text ENT_QUOTES);
    В случае запроса-поиска надо экранировать %,_ . Главное правило - не доверять всем входящим от юзера данным , точнее всему тому на что может повлиять юзер , но не показывать этому юзеру свое недоверие
     
    #28 Евгений Минаев, 2 Jan 2008
    Last edited: 2 Jan 2008
    1 person likes this.
  9. DWORD

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

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    Ну и ну, ребята. Столько сообщений, и нет ни одного грамотного ответа. Надо бы подождать nerezus'а, он знает ответ. Если ждать его лень (новый год как никак), бегом искать его статью о защите от "SQL инъекций". Там есть ответ на вопрос, который мучает здесь вас всех, а именно:
    "Как защитить любое веб приложение от любой атаки, отличной от атаки грубой силой?"
    Ни много ни мало. Формулировку вам придется натянуть на его "статью" самостоятельно.
    Кстати, любой (даже низкой степени заинтересованности) студент любого ВУЗа любого IT факультета знает ответ на этот вопрос! Задумайтесь об этом, задумайтесь о том, чему вы научились, столько времени потратив на прочтение этого форума!?

    Отдельная просьба Зеленому Мишке и всем прочим модераторам, хотя бы в честь Нового Года не трогать это сообщение, тем более, что в действительности, это первый ответ в этой теме, все остальное можно удалить!
     
    3 people like this.
  10. Spyder

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

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    О, ты вернулся :d
     
  11. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    intval(), mysql_escape_string()
    =\
     
    2 people like this.
  12. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    как я понял, прочитав http://forum.antichat.ru/thread30641.html
    при вводе (+заключаем в кавычки).
    1. если число, intval();
    2. если строка, mysql_escape_string();
    +заключаем в кавычки.
    3. при выводе htmlspecialchars();
    все?

    PHP:
    INSERT INTO table (loginpassVALUES ('".$_POST["login"]."','".$_POST["pass"]."');
    PHP:
    SELECT pass FROM table WHERE login '".$_POST["login"]."';
    если кавычки (') стоят в самом запросе, то можно вообще ничего не экранировать?
     
    #32 Piflit, 2 Jan 2008
    Last edited: 2 Jan 2008
  13. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Третий пункт выкидываай из своего понимания. Проверка на существование (isset()) и выборка целого числа в первом случае (если кто то пихает херню с -, то можно добавить bcmod()), во втором случае окружение кавычками и экранирование.
     
  14. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    почему? а <скрипт> итп при выводе?
    на существование чего? не понял.
    что еще нужно экранировать после mysql_escape_string();?
     
  15. ettee

    ettee Administrator
    Staff Member

    Joined:
    12 Oct 2006
    Messages:
    466
    Likes Received:
    1,036
    Reputations:
    1,065
    PHP:
    < > " ' % ; ) ( & +
    Так же смотри не происходить ли автоматическое преобразование символов.
    Не забываем про фокус замены символа пробела на
    PHP:
    /**/
    Надежней пропускать только то что разрешено, чем блокировать "черные списки".
    По возможности использовать HttpOnly-cookies. Параноикам поможет шифрование cookie.
    При нападение с помощью TRACE метода претензии к хостеру.
    PHP:
    TraceEnable off
     
    _________________________
  16. Macro

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

    Joined:
    11 Nov 2006
    Messages:
    552
    Likes Received:
    298
    Reputations:
    207
    Да что вы тут развели дискуссию? Все повторяют сообщения, которые тут уже написаны. Для проверки любых данных на sql инъекцию, xss или инклуд,
    способов не так уж и много!

    Для проверки sql строк достаточно mysql_real_escape_string()

    Все числовые параметры sql стоит писать через intval()

    Для защиты от xss вполне хватит функции htmlspecialchars() либо htmlentities()

    Проверка на кириллицу вот - $str=preg_replace('/[^а-я]/i','',$str);

    Если нужна проверка на инклуд.
    Во первых, инклудить лучше файлы с префиксом, например
    include('./inc/inc_'.$_GET['page']);
    Во вторых, лучше приписывать расширение к файлу и желательно, чтобы это расширение не было '.php' .
    include('./inc/inc_'.$_GET['page'].'.inc');
    В третьих, существование файла надо проверять и фильтровать точки :).
    $_GET['page']=str_replace('.','',$_GET['page']);
    file_exists('./inc/inc_'.$_GET['page'].'.inc')?include('./inc/inc_'.$_GET['page'].'.inc'):echo('неверный файл');
    На все вопросы автора ответили уже :)
     
    #36 Macro, 2 Jan 2008
    Last edited: 2 Jan 2008
  17. GreenBear

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,547
    Likes Received:
    1,398
    Reputations:
    612
    наверное правильнее регуляркой проверять на допустимые символы, чем вырезать все недопустимые, так ведь?
     
Thread Status:
Not open for further replies.