_GET и mysql_query: служебный роман
Jun. 1st, 2013 03:23 pm_GET и mysql_query вместе
75 тысяч результатов.
Это из реддита с прекрасным названием lolphp, в котором есть много смешного - например, вот эта лошадь:

75 тысяч результатов.
Это из реддита с прекрасным названием lolphp, в котором есть много смешного - например, вот эта лошадь:

no subject
Date: 2013-06-01 01:37 pm (UTC)no subject
Date: 2013-06-01 02:01 pm (UTC)Я бы сказал, что проблема даже не в уязвимости - само по себе нахождение этих двух токенов в одном файле не означает обязательное её наличие - а, скорее, в общей культуре "пхп кодинга". По-хорошему, _GET и mysql_query не должны встречаться в рамках одного скрипта вообще.
no subject
Date: 2013-06-01 02:34 pm (UTC)no subject
Date: 2013-06-01 02:44 pm (UTC)no subject
Date: 2013-06-01 02:50 pm (UTC)Другое дело что она, в отличие от (int), никак не гарантирует защиту.
no subject
Date: 2013-06-01 02:57 pm (UTC)Вот тут например об этом
http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string
Или ?
no subject
Date: 2013-06-01 03:11 pm (UTC)С того же подреддита:
no subject
Date: 2013-06-01 03:14 pm (UTC)no subject
Date: 2013-06-01 03:29 pm (UTC)Не так страшно, что ("a" == 0) не эквивалентно ("a" == "0"). Страшно, что глядя на строчку ($var == 0) и помня, что в $var число, можно очень запросто прозевать, как это число где-то выше привелось к строке и словить трудноуловимый баг.
И это родовая травма именно php, а не какая-то глобальная проблема - рядом есть очень похожий него perl, в котором ("a" eq "0") эквивалентно ("a" eq 0), а ("a" == "0") скажет в stderr "Argument "a" isn't numeric in numeric eq (==)" (при включённых варнингах, но их включают все и всегда).
В перле тоже есть эти проблемы (спец-строка "0 but true" намекает), и в других языках есть, но не в таком количестве на ровном месте.
no subject
Date: 2013-06-01 03:40 pm (UTC)no subject
Date: 2013-06-01 03:43 pm (UTC)Вот я и наступил на грабли. :-) Я не специально, честно!
no subject
Date: 2013-06-01 03:44 pm (UTC)разнарушать транзитивность равенства.Не понимаю, зачем разрешать сравнение строк с чем либо, кроме строк (и возможно NULL).
no subject
Date: 2013-06-01 03:47 pm (UTC)no subject
Date: 2013-06-01 03:53 pm (UTC)Разрешать надо, иначе ничего работать не будет.
mysql в подавляющем большинстве случаев возвращает строки
НТТР приносит только строки.
файловые функции возвращают строки.
приводить насильно - тоже не сахер, превращая 00000001 в 1
я так понимаю, на эту тему уже много и долго спорили, и нынешний вариант - далеко не худший.
no subject
Date: 2013-06-01 04:38 pm (UTC)И мне непонятно почему "a"==0 и "a" == "0" должны давать один и тот же результат. Если программист не понимает правила преобразования, он просто не должен использовать «==», вот и всё, пусть пользуется точным равенством («===»).
no subject
Date: 2013-06-01 05:15 pm (UTC)Стараюсь не писать их вложенными, потому что получается нечитаемая конструкция. А приходится, то ставлю скобки, потому что иначе получается нечитаемая конструкция.
no subject
Date: 2013-06-01 06:37 pm (UTC)no subject
Date: 2013-06-01 06:38 pm (UTC)no subject
Date: 2013-06-01 06:40 pm (UTC)Лучше уж всё явно.
no subject
Date: 2013-06-01 06:47 pm (UTC)Попробовал сравнить "8" и "000000000008" - получил тру.
похоже, пых перед проверкой проверяет содержимое.
no subject
Date: 2013-06-01 07:02 pm (UTC)Не удивлюсь, если в PHP "012" это 10 а "08" это 8. Это был бы TRUE PHP WAY, IMHO.
no subject
Date: 2013-06-01 07:41 pm (UTC)все традиционные признаки роляют только при парсинге же строк, прописанных руками.
А мы здесь говорим о том, что уже в строке содержится.
в этом смысле "08" - это 8, а "012" - это 12 при приведении. Это, в общем, понятно. Мускуль так же приводит, к примеру.
Но вот это - if comparison involves numerical strings, then each string is converted to a number - меня сегодня удивило. Объяснения, хоть какого завалящего - пока не нашёл.
no subject
Date: 2013-06-01 07:57 pm (UTC)no subject
Date: 2013-06-01 08:17 pm (UTC)no subject
Date: 2013-06-01 08:49 pm (UTC)Те. строки 100000000000000000000000001 и 100000000000000000000000000 тоже будут равны ?!!!!! ( количество нулей подобрано под под точность мантиссы double)
no subject
Date: 2013-06-01 09:10 pm (UTC)https://bugs.php.net/bug.php?id=54547
no subject
Date: 2013-06-01 09:12 pm (UTC)no subject
Date: 2013-06-01 09:48 pm (UTC)no subject
Date: 2013-06-01 10:16 pm (UTC)("1000" == "1e3") - обратно тру.
no subject
Date: 2013-06-01 10:44 pm (UTC)Тут работает бритва хэнлона
no subject
Date: 2013-06-01 10:53 pm (UTC)Авторы PHP прошлись, во-первых, по уже известным граблям, вместо того, чтобы исправить
Во-вторых, усилили грабли, испортив == и добавив ===
это вызывает такое же уныние, как пьяная ссора с убийством — бессмысленно, печально, противно
no subject
Date: 2013-06-01 11:03 pm (UTC)no subject
Date: 2013-06-02 02:00 am (UTC)no subject
Date: 2013-06-05 12:32 pm (UTC)