intval или quotes

Discussion in 'PHP' started by Seravin, 4 Mar 2010.

  1. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Тут вот в чём у меня проблема: читал статью про анти sql-inj, написал там, но никто ничего не написал. Я пытаюсь понять минусы использования такого метода выборки из базы данных.

    PHP:
    $myid=intval($_GET['id']);
    $q="SELECT * FROM mytable WHERE id=".myid;
    ...
    и передачи параметра id строкой(даже если поле id числовое):

    PHP:
    $myid=mysql_real_escape_string($_GET['id']);
    $q="SELECT * FROM mytable WHERE id=' ".myid." ' ";//без пробелов
    ...
    Идёт всё равно конвертация в числовой тип, обрезая строку начиная с символа с которого не удалось преобразование.
    Какой смысл разделять строковые и числовые параметры, если можно строкой.
    (скрипт довольно простой, без проверки на magic_quotes, но не в этом смысл)
     
    #1 Seravin, 4 Mar 2010
    Last edited: 4 Mar 2010
  2. LStr1ke

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

    Joined:
    29 Jul 2009
    Messages:
    801
    Likes Received:
    145
    Reputations:
    73
    А если значение отрицательное?
     
  3. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    а разница? всё равно число, только отрицательное(только что тестил)
     
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Для чисел достаточно приведения к численному.
     
  5. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    ну я понимаю, но если у меня в скрипте, например, используется как текстовые, так и числовые колонки, так какой смысл мне использовать intval(), если я могу просто отправлять всё строкой, что, по моему, безопастней(хотя может я не очень хорошо знаю нюансы intval'а)
     
  6. ChieFSS

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

    Joined:
    23 Nov 2006
    Messages:
    35
    Likes Received:
    2
    Reputations:
    0
    to Seravin,
    intval() получает целочисленное значение переменной.
    То есть в запросе нужно 100% иметь число, а не строку что-нибудь ещё.
    А какое там поле (если вы про html) это не важно. Пользователь всегда может подсунуть левые данные.

    addslashes() экранирует спецсимволы в строке.
    Это из другой серии функция. К числам никакого отношения не имеет и не спасет от подсовывания в запрос строки, там где должна быть цифра.
     
  7. warlok

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

    Joined:
    17 Feb 2008
    Messages:
    328
    Likes Received:
    142
    Reputations:
    81
    Seravin тогда уж mysql_real_escape_string() потому что addslashes() обходиться при мультибайтовых кодировках в бд, кроме UTF-8
     
  8. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Ты мне мануал по функциям написал??? я это знаю, но если ты читал бы внимательно, то не писал бы этого
     
  9. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Ну да, е это и хотел сказать) просто ошибся чуть)