За последние 24 часа нас посетили 18057 программистов и 1622 робота. Сейчас ищут 1254 программиста ...

Предохранитель от SQL-инъекций

Тема в разделе "Регулярные выражения", создана пользователем Freakmeister, 21 июл 2012.

  1. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    было бы странно, если бы я ограничивал числовую переменную неопределёнными числами.

    PS: респект за букву ё!

    ну да и пох
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Повторюсь, после проверки могут быть разные действия, по этому она может быть лишней.

    Тем самым создать строгость, типизировать.

    Зато ты точно будешь уверен, что там ничего лишнего не придет.

    И задачу ты облегчишь, и данные пере-привести сможешь в любой момент.
     
  3. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Тебе да... А представь что твой метод говорит что там 123, а мой говорит что там строка длинной в 14 символов, а третий метод смотрит и офигевает от нашей математики !!!!

    Добавлено спустя 55 секунд:
    Её ограничивает только математика, и ограничение это от минус бесконечность, до плюс бесконечность...

    Добавлено спустя 5 минут 45 секунд:
    А в GET/POST только целые числа идут ? т.е если идёт число, то оно обязательно целое ?

    У меня на роутере такая фигня, какой-то умник написал такую привязку к целому, в результате у меня за месяц трафика менее 2 гигов в статистике, а я в день бывает по 20 гигов качаю...

    Добавлено спустя 1 минуту 32 секунды:
    А после моей проверки я не буду уверен ?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ты чего-то опять спутал проверку на корректность и защиту.
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Я вижу единственный смысл в этом - избавиться от дублей страниц (типа для поисковиков). Ну то есть если вдруг кто-нибудь возьмёт и понаставит в интернетах кучу неправильных ссылок на сайт - типа

    http://www.site.ru/index.php?mode=articles&page=12asdasd
    http://www.site.ru/index.php?mode=articles&page=12zxczxc
    http://www.site.ru/index.php?mode=articles&page=12qweqwe

    При обычном (int) в принципе, сайт по любой из этих ссылок выдаст одинаковый контент, что, возможно, плохо скажется на отношении поисковиков к нему. Хотя я не знаю, это просто предположение, что так может быть. А может и наоборот - гугл скажет "Ух ты, сколько ссылок на http://www.site.ru - это, наверно, хороший сайт, раз его везде цитируют!" В общем, спорный вопрос. Возможно, в ответ на page=12asdasd стоит отдавать 404 страницу.

    Добавлено спустя 1 минуту 48 секунд:
    Другого смысла в том, чтобы использовать проверку вместо приведения к (int) - я не вижу. При этом приведение к инту - удобнее лично для меня.
     
  6. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ты подумай логически.
    Код (PHP):
    1. $a; // Notice. будет в else{}
    2. $a=''; // будет в else{}
    3. $a=""; // будет в else{}
    4. $a='   '; // будет в else{}
    5. $a="\n"; // будет в else{}
    6. $a=null; // будет в else{}
    7. $a=false; // будет в else{}
    8. $a=0; // будет в else{}
    9. if(trim($a)) {
    10.  
    11. } 
    Если ты о проверках без вредных.

    Нам останется только привести к типу и не марочиться.)
    И какую нужно процедуру провести и в каком месте как нужно это решить уже привидениями и другими функциями...

    Конечно, условия, проверки некоторые соблюдать нужно и можно, этого никто не запрещает, но лишний раз вызывать функции!?
    Кому, как вообщем!

    Иногда если там конкретное решение, конечно лучше сделать проверку, до...

    А вот когда там много разных связей, то лучше не париться.

    Лишние условия никому не нужны.


    Ну можно и так решать, что надо:

    Код (PHP):
    1. if(trim($a) || false===$a) {
    2.  
    3. } 
     
  7. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Все равно надо считать целые, потому что дроби приведут к неточностям. Как раз тот случай, когда надо считать байты, в 64-битном INT x)
     
  8. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    :D

    Код (PHP):
    1. echo (int) (string) ( (0.1+0.7) * 10 ); // выводит 8!  
    =)
     
  9. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Код (PHP):
    1. echo (int) ( (0.1+0.7) * 10 ); // выводит 7!   
    Разрабы PHP не хотят хитрить, честно отдают машине сконверить, как она может, не округляя. После умножения 0.8 (а может и 0.7999999999999998) на 10 получилось что-то вроде 7.99999999999998, далее приведение к int оставляет только целую часть числа. И никакой проверки на исходную разрядность числа, просто "0.1" парсится и конвертится в 0.09999999999 во внутреннем представлении.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Числа с дробной частью это отдельная песня. Там никогда нет никаких гарантий ни в чем. Так уж работают современные компы.
     
  11. Freakmeister

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

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Короче почитал я это и решил делать проверку на число регуляркой...

    А почему бы не убить двух зайцев одним выстрелом?
    Я например не делаю проверку на число в самом SQL-запросе, я делаю её перед запросом.

    Код (PHP):
    1. if (!preg_match("^[0-9]$",$string)) {
    2.      error_message('Попытка взлома', 'Оставайтесь на месте, за вами уже выехали');
    3.      die;
    4. } 
     
  12. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Потому что зачем тебе число, если ты не сможешь с ним работать? Если это ЧИСЛО, то ты должен быть уверен, что оно уместится в нужный тип, чтобы ты мог с ним работать как с числом. Если это циферная строка, то проверяй регуляркой, но не относись к ней, как к числу.
     
  13. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    А если у тебя в БД bigint а ты его обрежешь ?
    И если оно наоборот не умещается, то это неправильное число, зачем его обрезанным в базу пихать ?
    Полностью согласен, так и надо.
     
  14. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    [vs], Да это все, это законченно для этих человеков =), тут резону объяснять нет, надо походу сразу с ходу в лобешник. =)

    Да конечно, делай все регулярками и потребляй больше ресурсов.
    Ты на верном пути чувак, продолжай в том же духе.

    Сделай весь свой говно двиг в регулярках и выброси его в корзину.

    Ты такую х уйню говоришь, что просто пздц.

    Большие числа считаются float. Это рас.

    Под BIGINT отводится 8 байт. Больше 2^64 значений всё равно влепить не удастся. Это два.

    http://pear.php.net/package/Math_BigInteger/docs/latest/li_ ... teger.html

    И в третьих если нужно такие прям большие числа
    Читай тут php.net/manual/ru/refs.math.php. Это три.

    А, то, что вы тут заносите, проверки не нужны и т.д., руки за это отшибают.

    Вам это не говорят чутьли не каждую переменную приводить.
    Вы толи тему не читаете, толи не врубаетесь, что говорят, третьего не дано.
     
  15. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Но получать он их будет из post/get и для "безопасности" он их переделает в int
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Если столбец инт то переделает. Хорош уже бредить.
     
  17. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Да ничего он не будет в таких случаях приводить.
    Он отдаст как есть, так как это число большое для int.

    Как уже выше пост сказан, он приведет, да если отправим в int но число будет 2+ миллиарда не больше.

    Большие числа не желательно использовать, может возникнуть недразумение.

    А приведение типов желательно использовать для типизаций, чтобы явное приведение было, а не динамическое.

    Динамика может быть не верной.

    Было у меня много случаев, иначе бы я просто так не говорил бы.
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.118
    Симпатии:
    1.245
    Адрес:
    там-сям
    тема превратилась в говно, товарищи. для общественной пользы лучше эти 4 страницы просто удалить )
     
  19. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    точняк :)
     
  20. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    У тебя столбец bigint тебе надо на 32 битной системе закинуть в базу число 99999999999999999

    Ты пишешь $num = (int)$_GET итд (как все тут предлагают) и что ????

    Вы похоже не понимаете о чём я и пишете о своём чём-то...
     
  21. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    мы понимаем, просто надоело :)
     
  22. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Vladson,
    Если будет bigint - то приводить к int, конечно же, не будем. В случае, когда в базе bigint - будем использовать другие функции для обработки данных. Просто на практике - я не помню ни единого случая, чтобы я использовал bigint. Всегда обычного int более чем достаточно.
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Хорош идиотничать. Я пишу инт там где надо. А где не надо не пишу.
     
  24. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Учитывая что BIGINT - это пресловутые 64 бит, об этом "недостатке" конструкции (int) все скоро забудут.
     
  25. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Может, но в этом топике никто не говорит этого, все пишут что пишут инт "всегда где числа"

    О магических кавычках хотели забыть ещё в 2004-м году, но до сих пор они актуальны и надо проверять включены ли они...

    Добавлено спустя 1 минуту 31 секунду:
    Почему их не использовать сразу ? Хотя бы на тот случай если завтра не появится какой нибудь суперпуперинт на 100500бит ? что любопытно варианты есть и были ещё в РНР3
    Или так нравится каждый раз переписывать код под каждую новую версию ?