Ну да. А ты путаешь задачу проверки диапазона, предохранение от инъекций, и не можешь набраться смелости сказать заказчику, что мол понадобится строго 64 битная система и тп. Хотя я вобще этот бредор про 64 бита не понимаю.
Потому что это не нужно !!!! Я проверяю что там число, я проверяю что оно число, и что это число, а потом запрашиваю БД, без возможности инъекций, код мой работает на как на РНР3 так и будет работать на РНР 9999.9999.999 на ОС начиная с Win98 так и на каком нибудь "блинукс 512бит" и мой код работает, и не глючит, и без дыр в безопасности ... А ты предлагаешь вместо имеющейся инфраструктуры просто сказать "мой сайт будет работать только на этой версии ОС, только с этой версией РНР, и только с таким то количеством сообщений, а потом мы всё перепишем за дополнительную плату" Иногда кажется что тот грубый чел который тут всех зае№;%:? в какой то момент, и убежал, был единственным адекватным программером тут... © dark-demon
Епана... Зачем мне хранить это говно!? Непонятное человеку. Бл ять... Не ожидал, что ты такой наивный! Я че сказал, что я буду держать приведение типа где не буду уверен в том, что там не будет 100% более 2 млрд.? Ты, бы сам читать научился, а то всех читать учишь. Так, что не твое говно выше не приведение я тут штопать не собираюсь, а просто применю там escape и заебешься ты ложить мой скрипт.
Вот ты и запутался, запости этот запрос в мускул, и посмотри что будет занесено в БД (что именно будет там храниться) Только упрости его, запроси Код (Text): SELECT 0x4841434b454420425920564c4144534f4e; и посмотри ответ
При эскейпе тебе это не поможет. Код (PHP): function hex2bin($hex) { $hex2bin=null; for($i=0;$i<strlen($hex);$i+=2) { $hex2bin.=chr(hexdec(substr($hex,$i,2))); } return $hex2bin; } echo hex2bin('0x4841434b454420425920564c4144534f4e'); // HACKED BY VLADSON
Хорошо, допустим вместо (int)$var ты пишешь '#^[\d]+$#' и сохраняешь числа любого размера. Но большое число в 32 битной системе уже не будет целым числом. Теперь вернемся к исходному примеру заменив (int) на строковую проверку и работая впоследствии с большими числами на 32 битной системе, ты рискуешь в один прекрасный момент поулчить 1.2345678912346E+14 и скрипт накроется нафиг. p.s. это не касается моего комментария про номера телефонов. ID должен быть числом, а номер телефона можно безболезненно хранить в чарах.
Согласен! Но я имел ввиду телефон как число =) такое большое, всм. По этому и не получается так хранить, в том, то вся и проблема. А так, конечно можно и чарами рулить.
Очевидно. Если числа большие, то работать с ними придется, как со строками. В 64-битных машинах не придется. Если понимаешь, почему перешли на 32 бита с 16-ти, то поймешь и это. Делаем вечные скрипты?
Таким образом, приведение к int не только защищает от инъекции, но и обеспечивает совместимость данных со скриптом.
Java только. Она строго типизированная и за ранее знает какой тип данных или выражение. И то у нее есть некоторые косяки. А php предсказуемым не может быть. C(потомки, тоже туда же). Возможно еще какие - то есть строгие? Я хз. Но гибкость php и написания кода, ни с чем не сравнится (позаимствован с разных языков синтаксис). Можно писать как угодно. По этому у всех скрипты отличаются. javascript это вообще другая история.
ты по-моему ушел в какие-то фантазии... Еще раз для идиотов: Есть задача проверки правильности введённых данных. Она есть. Мы о ней НЕ говорим. Есть задача защиты БД. Эту задачу решает (int)$_POST. Добавлено спустя 7 минут 55 секунд: я к тому, что 32 бита это вполне себе не очень большое число, а 64 бита уже очень большое. Большое, но конечное. Я ж написал в скобках, о чем именно я говорю. В данном контексте нам всё равно с числами какой размерности мы имеем дело, ибо владсон сказал, что потратит 10 лет и костьми ляжет, но набьёт миллиарды топиков и "завалит сервер"... Если у человека приход, и его пугают большие числа и их попадание в запрос, то наверное 64 бита числа будут пугать его еще больше. (int)$_POST['int'] защищает БД от любых попыток ей навредить. А то что юзер не получит того, что ожидал... Ну дык он этого и не ожидал, а хотел поднасрать =) и нам похеру его ожидания.
Если в $_POST именно число (так как проверка правильности уже пройдена) Код (Text): 1000 а не Код (Text): 1000' or 1=1 Нафига что-либо защищать ??? какой смысл в строке Код (Text): "select " . intval("1000") ????
Да кому надо 10 лет терять?))))) Чтобы сайт убивать?) Админ не нуб (присекет это тело движение), убил 10 лет в итоге получил, конечное число добавки. А админ не нуб, нажал удалить все это говно, которое пришло непонятное и не активное =) Я представляю, 2+ млрд. регистраций пользователей которые активные и посещаемость постоянно, это еще много лет. А иначе убить базу не получится, потому, что там во первых защита, а во вторых тебе иного другого пути для добавления в базу никто не даст =) Что - то ты какие то странные вещи говоришь, вообще не понимаешь, видимо?) Так, ты так лучше и скажи, не надо позориться =)
Меня не пугают, просто форум перестанет работать корректно при таком количестве сообщений, вот и все дела... (конечно форумы с 2млрд сообщений редкость, но мало того они есть, это ещё и просто пример.)
А я говорю что она нужна, вместо (int)$_POST['int'] и "защищает" она точно также, только лучше. Хорошо, никто не будет, но рано или поздно сайт твой сам вырастет до таких размеров (форумы с 2млрд сообщений бывают) и просто перестанет работать, оно тебе надо ? (потом двиг переписывать)
У меня форму пулей летает =) Что у тебя там?) Может быть такое, что не пройдет. Есть случаи, когда есть проверка а после проверки есть выполняемый скрипт на разные действия, а если проверка не пройдет то капец придет... Может я хочу одной проверкой сделать разные приведения, ты будешь лишние условия дописывать или лучше 1 проверкой к типам приведешь и за одно защита будет.
Не понимаешь именно ты. Код (Text): $start = ctype_digit(@$_GET['start']) ? $_GET['start'] : 0; $limit = 100; $sql "SELECT .................. LIMIT $start, $limit" Взломай. Как видишь тут нету (int)$start
в теории это громкое утверждение хорошо звучит. С $_POST плохой пример. Вот есть у тебя метод, который уже пишет в бд что-то, что ему присылают вышестоящие методы. А была ли проверка и по какому правилу - не всегда есть возможность узнать. Не всегда есть есть возможность сделать эту проверку, т.к. не понятно надо ли и какую. Так что завязывай умничать. Решение всех вопросов это PDO.
Есть золотое правило, всегда делать проверку на входе, а не на выходе. Т.е всегда думать что вышестоящие методы не делали проверку. (даже если делали, что не имеет значения)
ну вот я на входе всегда и пишу первой строкой в методе. и мне пох что там было до и будет после... $id = (int) $id;
Тем самым - ограничиваешь числовую переменную определёнными числами - метод твой воспримет строку "123ывфывфывфыв" как число 123 (а между тем это не одно и тоже) И то и другое в 99.9999% случаев не критично, но оно нелогично, а стало быть это костыль.