За последние 24 часа нас посетили 17890 программистов и 1614 роботов. Сейчас ищут 1279 программистов ...

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

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

  1. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ну да. А ты путаешь задачу проверки диапазона, предохранение от инъекций, и не можешь набраться смелости сказать заказчику, что мол понадобится строго 64 битная система и тп. Хотя я вобще этот бредор про 64 бита не понимаю.
     
  2. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Потому что это не нужно !!!!

    Я проверяю что там число, я проверяю что оно число, и что это число, а потом запрашиваю БД, без возможности инъекций, код мой работает на как на РНР3 так и будет работать на РНР 9999.9999.999 на ОС начиная с Win98 так и на каком нибудь "блинукс 512бит" и мой код работает, и не глючит, и без дыр в безопасности ... А ты предлагаешь вместо имеющейся инфраструктуры просто сказать "мой сайт будет работать только на этой версии ОС, только с этой версией РНР, и только с таким то количеством сообщений, а потом мы всё перепишем за дополнительную плату"

    Иногда кажется что тот грубый чел который тут всех зае№;%:? в какой то момент, и убежал, был единственным адекватным программером тут...
    © dark-demon
     
  3. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Епана... Зачем мне хранить это говно!? Непонятное человеку.

    Бл ять... Не ожидал, что ты такой наивный!
    Я че сказал, что я буду держать приведение типа где не буду уверен в том, что там не будет 100% более 2 млрд.?
    Ты, бы сам читать научился, а то всех читать учишь.

    Так, что не твое говно выше не приведение я тут штопать не собираюсь, а просто применю там escape и заебешься ты ложить мой скрипт.
     
  4. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Вот ты и запутался, запости этот запрос в мускул, и посмотри что будет занесено в БД (что именно будет там храниться)

    Только упрости его, запроси
    Код (Text):
    1. SELECT 0x4841434b454420425920564c4144534f4e;
    и посмотри ответ
     
  5. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    При эскейпе тебе это не поможет.


    Код (PHP):
    1. function hex2bin($hex) {
    2.     $hex2bin=null;
    3.     for($i=0;$i<strlen($hex);$i+=2) {
    4.         $hex2bin.=chr(hexdec(substr($hex,$i,2))); 
    5.     } 
    6.     return $hex2bin;
    7. }
    8.  
    9. echo hex2bin('0x4841434b454420425920564c4144534f4e'); // HACKED BY VLADSON    
     
  6. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Хорошо, допустим вместо (int)$var ты пишешь '#^[\d]+$#' и сохраняешь числа любого размера. Но большое число в 32 битной системе уже не будет целым числом. Теперь вернемся к исходному примеру
    заменив (int) на строковую проверку и работая впоследствии с большими числами на 32 битной системе, ты рискуешь в один прекрасный момент поулчить 1.2345678912346E+14 и скрипт накроется нафиг.

    p.s. это не касается моего комментария про номера телефонов. ID должен быть числом, а номер телефона можно безболезненно хранить в чарах.
     
  7. Your

    Your Старожил

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

    Но я имел ввиду телефон как число =) такое большое, всм.
    По этому и не получается так хранить, в том, то вся и проблема.

    А так, конечно можно и чарами рулить.
     
  8. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Очевидно. Если числа большие, то работать с ними придется, как со строками. В 64-битных машинах не придется.
    Если понимаешь, почему перешли на 32 бита с 16-ти, то поймешь и это.
    Делаем вечные скрипты? :)
     
  9. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Таким образом, приведение к int не только защищает от инъекции, но и обеспечивает совместимость данных со скриптом.
     
  10. Your

    Your Старожил

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

    А php предсказуемым не может быть.
    C(потомки, тоже туда же).

    Возможно еще какие - то есть строгие?
    Я хз.

    Но гибкость php и написания кода, ни с чем не сравнится (позаимствован с разных языков синтаксис).

    Можно писать как угодно.

    По этому у всех скрипты отличаются.

    javascript :D это вообще другая история.
     
  11. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты по-моему ушел в какие-то фантазии...

    Еще раз для идиотов:
    Есть задача проверки правильности введённых данных. Она есть. Мы о ней НЕ говорим.
    Есть задача защиты БД. Эту задачу решает (int)$_POST.

    Добавлено спустя 7 минут 55 секунд:
    я к тому, что 32 бита это вполне себе не очень большое число, а 64 бита уже очень большое. Большое, но конечное. Я ж написал в скобках, о чем именно я говорю. В данном контексте нам всё равно с числами какой размерности мы имеем дело, ибо владсон сказал, что потратит 10 лет и костьми ляжет, но набьёт миллиарды топиков и "завалит сервер"... Если у человека приход, и его пугают большие числа и их попадание в запрос, то наверное 64 бита числа будут пугать его еще больше.

    (int)$_POST['int'] защищает БД от любых попыток ей навредить. А то что юзер не получит того, что ожидал... Ну дык он этого и не ожидал, а хотел поднасрать =) и нам похеру его ожидания.
     
  12. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Если в $_POST именно число (так как проверка правильности уже пройдена)
    Код (Text):
    1. 1000
    а не
    Код (Text):
    1. 1000' or 1=1
    Нафига что-либо защищать ???
    какой смысл в строке
    Код (Text):
    1. "select " . intval("1000")
    ????
     
  13. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Да кому надо 10 лет терять?))))) Чтобы сайт убивать?)
    Админ не нуб (присекет это тело движение), убил 10 лет в итоге получил, конечное число добавки.

    А админ не нуб, нажал удалить все это говно, которое пришло непонятное и не активное =)

    Я представляю, 2+ млрд. регистраций пользователей которые активные и посещаемость постоянно, это еще много лет.
    А иначе убить базу не получится, потому, что там во первых защита, а во вторых тебе иного другого пути для добавления в базу никто не даст =)

    Что - то ты какие то странные вещи говоришь, вообще не понимаешь, видимо?)
    Так, ты так лучше и скажи, не надо позориться =)
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Я не говорил, что проверка правильности пройдена. Я не говорил, что он вобще была.
     
  15. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Меня не пугают, просто форум перестанет работать корректно при таком количестве сообщений, вот и все дела... (конечно форумы с 2млрд сообщений редкость, но мало того они есть, это ещё и просто пример.)
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ну наверное стоит тогда рассматривать хостинги с 64 бит на инт.
     
  17. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    А я говорю что она нужна, вместо (int)$_POST['int'] и "защищает" она точно также, только лучше.
    Хорошо, никто не будет, но рано или поздно сайт твой сам вырастет до таких размеров (форумы с 2млрд сообщений бывают) и просто перестанет работать, оно тебе надо ? (потом двиг переписывать)
     
  18. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    У меня форму пулей летает =)

    Что у тебя там?)

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

    Может я хочу одной проверкой сделать разные приведения, ты будешь лишние условия дописывать или лучше 1 проверкой к типам приведешь и за одно защита будет.
     
  19. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Не понимаешь именно ты.
    Код (Text):
    1. $start = ctype_digit(@$_GET['start']) ? $_GET['start'] : 0;
    2. $limit = 100;
    3. $sql "SELECT .................. LIMIT $start, $limit"
    Взломай. Как видишь тут нету (int)$start
     
  20. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в теории это громкое утверждение хорошо звучит. С $_POST плохой пример. Вот есть у тебя метод, который уже пишет в бд что-то, что ему присылают вышестоящие методы. А была ли проверка и по какому правилу - не всегда есть возможность узнать. Не всегда есть есть возможность сделать эту проверку, т.к. не понятно надо ли и какую.

    Так что завязывай умничать. Решение всех вопросов это PDO.
     
  21. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Есть золотое правило, всегда делать проверку на входе, а не на выходе. Т.е всегда думать что вышестоящие методы не делали проверку. (даже если делали, что не имеет значения)
     
  22. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну вот я на входе всегда и пишу первой строкой в методе. и мне пох что там было до и будет после...
    $id = (int) $id;
     
  23. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Тему можно зациклить:
    http://www.php.ru/forum/viewtopic.php?f=18&t=41075#p331915 и читать далее
     
  24. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Тем самым
    - ограничиваешь числовую переменную определёнными числами
    - метод твой воспримет строку "123ывфывфывфыв" как число 123 (а между тем это не одно и тоже)

    И то и другое в 99.9999% случаев не критично, но оно нелогично, а стало быть это костыль.
     
  25. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Вообще-то размер целого типа это естественное, аппаратное ограничение.