За последние 24 часа нас посетили 174915 программистов и 3070 роботов. Сейчас ищут 1714 программистов ...

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

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

  1. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    igordata если завяжу то строка
    Код (Text):
    1. $xxx = "insert " . (int)123
    станет int-ом ?
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ты вобще читал прежде чем писать?
     
  3. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Бред... Так никто не делает, если ты не знал.
    И вообще это не рассчитано на большие числа, если ты не знал.

    Тут может быть капец во многих местах.
    Таких как:

    Код (PHP):
    1. $int=(int)'s1tring1';
    2. $int1=(int)'1s1tring1';
    3. var_dump($int, //int(0)
    4.          $int1); //int(1)
    5.  
    6. echo (int)9999999999; //1410065407
    7.  
    8. echo (int)'9999999999'; //2147483647 
    Тут то и настанет капец, с проверкой на целочисленный тип.
    Ибо он не может быть больше 2147483647.

    И будешь биться головой, на, что же блин такую проверить, то!
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Я так делаю перед $_POST =)
     
  5. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Всм так, чтоли?

    Код (PHP):
    1. $post='String'.(int)$_POST['int']; 
    А смысл?

    Ладно это когда один пост!

    Код (PHP):
    1. $post=(int)$_POST['int']; 
    И прям по любому надо int, чтобы был!

    Не всегда это нужно, php бывает и сам приводит и знает, что нужно и когда нужно!

    Ну все равно лучше в некоторых местах обезопаситься и сделать проверки, как нужно тебе, чтобы на верочку было!
    Чтобы не привелось к хз чему... =)
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    $query = "SELECT * FROM users WHERE id = " . (int) $_POST['id'];
    И я стопроцентно защищен.
     
  7. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    А ну это то, да...

    Я имел ввиду другое то, что выше...

    Никто так не пишет...

    Хотя в твоем случае (int) $_POST['id']

    Если будет число больше 2 миллиардов 147 миллионов, например 2.148 миллиарда, то все гиблое дело!
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ничего страшного не случится.
     
  9. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Больше числа не будет...
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Содержимое бд не пострадает.
     
  11. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Не ты не понял, я про то, что больше число не запишет, если нужно будет...
    Будет только записывать 2.147..... миллиарда, а 3 миллиарда не сможет записать, вот если взять номера сотовых телефонов там уже нужно bigint.

    Соответственно (int) уже не покатит, а значит уже и не будет приведения, только экранирование если только применять.
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Точно.
     
  13. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Так делают почти все я имею в виду
    Код (Text):
    1. $post=(int)$_POST['int'];
    даже вроде на этом форуме так сделано. Это описано в почти всех учебниках, и я против этого по причине
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    проверять корректность вводимых данных это одна задача, а защищать БД - другая.

    не надо путать.
     
  15. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Не пойму, почему только "2.147..... миллиарда"? Написано же,
    Давно пора переходить на 64 бита.
    Кроме того, можно передавать числа в 16(и более)-ричной системе.
     
  16. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    1 - немало серверов крутятся на 32-х битах, иногда это даже дело принципа
    2 - зачем умышленно завышать системные требования своего продукта если можно этого не делать ?

    Добавлено спустя 2 минуты 25 секунд:
    Да не надо никого защищать, надо просто понимать что делаешь и зачем. Всё. Т.е избегать костылей и ошибок в коде. Защита это когда безошибочный код под угрозой, а "защита" от SQL-инйекций это не защита а простой "багфикс"
     
  17. Your

    Your Старожил

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

    Тем более я не думаю, что у тебя допустим пользователей и их ид будет равен больше 2 миллиардов =)
    Или например мелкие какие - то расчеты, которые вообще не будут больше миллиона =)

    Так, то php сам приводит во что нужно, но я много раз замечал, что он бывает ху йню приводит, не то, что нужно.
    Если бы все так было бы просто эти бы типы данных вообще бы не придумали.

    Хотя с другой стороны в них нет необходимости!
    Как уже и говорили, php непредсказуем, по этому тут все так не обычно и телесно =)

    Но это нормально ;)
     
  18. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    смысл сильно меняется?

    че ты несёшь? =)

    потому что 2012 год на дворе.
    Только я не понимаю, какая разница между 32 бита и 64. (для идиотов, готовых начать мне объяснять про размер числа: разницы в данном контексте нет, т.к. и 32 бита и 64 позволяют записать числа конечного диапазона.)
     
  19. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ты их собираешься делить или умножать? *INT нужен для чисел, для просто набора цифр используйте VARCHAR, зачем усложнять жизнь.
     
  20. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ты сам понимаешь, что говоришь?
    А, что такого числа не бывает?
    9275464378532?

    Тебе конкретный подход говорят.
    Причем тут вообще умножение?

    Тут говорится за то, что приведение к типу (int) числа как сотовый телефон не удастся, на этом вся логика.

    Еще скажи, что число медленнее строки =)
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    он грит, что один хрен, что число, что char

    по факту так и есть. телефонными номерами не оперируют в нагруженном контексте.
     
  22. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Причем тут варчар вообще?

    Код (PHP):
    1. $a='9146425145'; //строка   
    Хочу число получить.
    А php мне скажет, что ты дурак, такого не получится сделать, я знаю только int(2147483647).

    потому, что:

    Код (PHP):
    1. $a=(int)'9146425145'; //int(2147483647)   
    А тут php скажет, что мы вообще ебанулись:

    Код (PHP):
    1. $a=(int)9146425145; //int(556490553)   
    А здесь так вообще башню сорвет:

    Код (PHP):
    1. $a=9146425145; //float(9146425145)   
    Ему по х уй на наше мнение! float, бл ять тут!
     
  23. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    ДА
    Любой язык программирования предсказуем, я в 89-м году ещё таблицу умножения не знал, а на 100% мог предсказывать Бейсик
    Они все будут в string и срать на всё, надо их в базу кидать, напиши блин
    Код (Text):
    1. SELECT * FROM `table`
    2. WHERE `word`=0x4841434b454420425920564c4144534f4e;
    Где 4841434b454420425920564c4144534f4e получи с помощью bin2hex($_GET['херня']) и не важно откуда блин он пришёл...

    Добавлено спустя 2 минуты 1 секунду:
    Я на этой странице пишу млин


    Код (Text):
    1. Формат це: /блин
    Посмотрите исходники HTML-файла, фраза ни чем не обработана и не отфильтрована, а сервак на котором этот форум почему-то не упал нихера

    Добавлено спустя 7 минут 28 секунд:
    Пользователей нет, расчётно нет... А если я как злобный хакер запощу 2 млрд сообщений/коментов/топиков/юзеров, сам выбирай что (через разные прокси, или другие пути) даже если у меня 10 лет времени уйдёт, то я точно знаю что уложу твой скрипт...

    Добавлено спустя 3 минуты 6 секунд:
    Your и да, я вижу что ты понимаешь о чём речь, не воспринимай мои слова за наезд... Помоги лучше объяснить людям разницу между "работает на практике" и "работает всегда со всеми видами данных на всех процессорах начиная с РНР3 а может и раньше"
     
  24. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Беда. Я ожидал от тебя большего понимания.
     
  25. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Я нет... Был какой-то момент когда я думал что твой стаж на форуме подразумевает умение читать, но в принципе подозревал что будет как всегда...