За последние 24 часа нас посетили 17402 программиста и 1725 роботов. Сейчас ищут 1633 программиста ...

Правильно ли я предохраняюсь? :)

Тема в разделе "PHP для новичков", создана пользователем SkyKiller, 31 окт 2008.

  1. SkyKiller

    SkyKiller Активный пользователь

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Категорически приветствую всех! 8)

    Составил следующий запрос:
    PHP:
    1.  
    2. <?php
    3. $reciperesult = mysql_query('SELECT * FROM `recipe_table` WHERE `recipeStatus`="SHOWN" AND `recipeID`="'.$recipe.'"', $lnk);
    4. ?>
    5.  
    recipeID - целочисленное положительное. Предварительно, перед этим переменная $recipe обрабатывается из GET-запроса следующей конструкцией:
    PHP:
    1.  
    2. <?php
    3. $recipe = 0;
    4. // Если GET-параметру recipe присвоено значение, если оно не пустое и является числом - присвоить переменной $recipe значение этого параметра
    5. if ( isset($_GET['recipe']) ) {
    6.         if ( !empty($_GET['recipe']) ) {
    7.                 if ( is_numeric($_GET['recipe']) ) {
    8.                         $recipe = $_GET['recipe'];
    9.                 }
    10.                 else {
    11.                 // Иначе присвоить переменной 0
    12.                 $recipe = 0;
    13.                 }
    14.         }
    15. }
    16. ?>
    17.  
    Интересует мнение опытных гуру на предмет безопасности этой конструкции с точки зрения XSS- и SQL-инъекций, а также правильная расстановка кавычек. Прошу сильно не ругаться на предмет чтения манов и т.д. - маны по кавычкам читал и курил. :)
    Просто на днях запускаю проект в массы и последние 2-3 дня стал просто параноиком в плане безопасности и защиты от хака - уже каша в голове... :)
     
  2. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    PHP:
    1. <?php
    2.  
    3. // Проверяет целое число в диапазоне | start и stop обязательные параметры
    4.     public static function int_range($num = NULL, $start = NULL, $stop = NULL)
    5.     {
    6.         if($start == NULL) trigger_error('Error. Class: XXX_VALID. Method: int_range(). Argument "start" was empty.', E_USER_ERROR);
    7.  
    8.         if($stop == NULL) trigger_error('Error. Class: XXX_VALID. Method: int_range(). Argument "stop" was empty.', E_USER_ERROR);
    9.  
    10.         if($num == NULL)
    11.         {
    12.             $ERROR->reg(self::$lang['valid']['int_range']['empty']);
    13.  
    14.             return false;
    15.         }
    16.  
    17.         if(is_numeric($num) and !strstr($num, '.'))
    18.         {
    19.             if($num < $start) return false;
    20.  
    21.             if($num > $stop) return false;
    22.  
    23.             return true;
    24.         }
    25.         else
    26.         {
    27.             return false;
    28.         }
    29.     }
    30.  
    31.  
     
  3. dAllonE

    dAllonE Guest

    Имхо так немного короче.:

    PHP:
    1.  
    2. <?php
    3.   $recipe  =  !empty($_GET['recipe']) ? (int)$_GET['recipe'] : 0;
    4. ?>
    5.  
    Но тот вариант вполне имеет право на жизнь... Впрочем, а если нам передадут очень очень большое число? Что тогда? :)
     
  4. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    dAllonE
    А где у тебя проверка? У тебя приведение к типу.
     
  5. dAllonE

    dAllonE Guest

    Hight, у него если число не является числом оно становиться нулем.
    У меня тоже, так в чем проблема?

    А про то что нужно перед записью еще и собственно "размер" числа проверить я написал.
     
  6. SkyKiller

    SkyKiller Активный пользователь

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Это ты меня озадачил... :roll:
    Хотя GET-параметр передаётся не из пользовательского ввода, а из предварительго скрипта (фиксированная ссылка), но ведь могут и подделать его, верно?
    Надо думать... Ограничение ввести, как Hight посоветовал
     
  7. SkyKiller

    SkyKiller Активный пользователь

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Вопрос заключается именно в безопасности этой конструкции. А защиту от дурака я сейчас буду дописывать.
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. <?php
    2. if (isset($_GET['recipe'])) {
    3.         $query='SELECT * FROM `recipe_table` WHERE `recipeStatus`="SHOWN" AND `recipeID`="'.$_GET['recipe'].'"'.$lnk;
    4.         $reciperesult=mysql_query(mysql_real_escape_string($query));
    Защита 100%, и если recipe - не число, результат запроса, соответственно, будет пустым.
     
  9. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    PHP:
    1. <?php
    2. $recipe  =  isset($_GET['recipe']) && is_numeric($_GET['recipe']) ? $_GET['recipe'] : 0;
    3. ?>
    или короче но неправильно (точнее почти правильно, но не до параноидального уровня)
    PHP:
    1. <?php
    2. $recipe  =  @is_numeric($_GET['recipe']) ? $_GET['recipe'] : 0;
    3. ?>
    Update:
    О ещё вариант (тоже рабочий и тоже с собакой)
    PHP:
    1. <?php
    2. $recipe  =  sprintf("%d", @$_GET['recipe']);
    3. ?>
     
  10. SkyKiller

    SkyKiller Активный пользователь

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Насчёт "@" меня терзают смутные сомнения (после прочтения соседнего топика) :D
    А вот уровень безопасности интересует именно параноидальный (насколько это возможно и не в ущерб производительности)
     
  11. dAllonE

    dAllonE Guest

    SkyKiller, ну вообще то когда уровень защиты дейтвительно паронаидальный, а тебя нужно хакнуть, то взламывают соседний сайт на этом же хостинге, а потом уже получают доступ к твоему :)
     
  12. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    А у тебя дробь может быть.
     
  13. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Одинаковый, параноидальность только как раз в собаке (юзать её теоретически нельзя, но с практической точки зрения в данном конкретном случае вреда будет не больше чем подорожание лимузинов на 5 копеек)
     
  14. SkyKiller

    SkyKiller Активный пользователь

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    А что по правильности кавычек в вопросе скажете?
     
  15. SkyKiller

    SkyKiller Активный пользователь

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Наверное, дополнительно ещё к целому типу надо привести принудительно...
     
  16. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Код (Text):
    1. ?recipe=0xFF
     
  17. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Кавычки у тебя наоборот. Надо так:
    И $recipe обрамлять кавычками не требуется.
     
  18. dAllonE

    dAllonE Guest

    Hight, о_О.


    Даже сейчас проверил, на всякий случай, подумал что у меня помутнение сознания:

    PHP:
    1.  
    2. <?php
    3. $a  =  3.14;
    4. $a  =  (int)$a;
    5. // выводит 3
    6. echo  $a;
    7.  
    8. $b  = 3.14;
    9. $b  =  (float)$b;
    10. // выводит 3.14
    11. echo $b;
    12. ?>
    13.  
     
  19. SkyKiller

    SkyKiller Активный пользователь

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Hight, спасибо! Сейчас исправлю.
    Всем огромное спасибо за советы и помощь! Если можете ещё что-то посоветовать - велком! :)
    Если возникнут вопросы - тему подниму.
     
  20. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Hight не совсем так, скорее
    PHP:
    1. <?php
    2. mysql_query("SELECT * FROM `recipe_table` WHERE `recipeStatus`='SHOWN' AND `recipeID`=$recipe;", $lnk);
    3. ?>
     
  21. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Не надо ничего приводить. Надо проверять, а в случае некорректности значения присваивать значение по умолчанию. Целые числа отличаются от дробных наличием . точки.
    Ну можно 'x' поискать в строке.
     
  22. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Правильно проверять через ctype_digit
     
  23. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    SkyKiller
    Если переменная - целое число, то намного проще насильно привести ее к целому и подставлять в запрос безо всяких кавычек:
    PHP:
    1. <?php
    2.  
    3. $recipe=(int)ifset($_GET['recipe']); // благодаря (int), $recipe теперь гарантированно целое
    4.  
    5. mysql_query("SELECT ... recipeID=$recipe");
    Функции ifset в языке нет, но она очень удобна, я ее определяю так:

    PHP:
    1. <?php
    2.  
    3. function ifset(&$value, $default=false)
    4. {
    5.   return isset($value)?$value:$default;
    6. }
     
  24. SkyKiller

    SkyKiller Активный пользователь

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    О... Судя по описанию - как раз то, что нужно. Спасибо!
     
  25. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Не не, у тебя всё норм, это я ещё не проснулся.
    Vladson
    Скорее так:
    гы гы =) Красиво подсветицо в редакторе.