здравствуйте, возможно ли имея контроль над $str получить при сравнении Code: $str== 'ololo' - true ? язык - php Это нужно для обхода следующей корявой авторизации: Code: if($_SERVER['PHP_AUTH_USER'] == 'user' and $_SERVER['PHP_AUTH_PW'] == 'somePass' ) есть идеи? оп-оп, есть идеи: когда нестрогое сравнение, то любая строка не содержащая чисел при сравнении Code: 0 == 'somestringwithoutnumbers' даёт нам положительный результат!
збс, там, кстати о Code: 0 == 'somestring' - true ни слова. лишь о пустой строке. но крутая таблица нестрого сравнения. спасибо. как думаешь, такая реализация basic авторизации уязвима? или мы не можем задать $_SERVER['PHP_AUTH_USER'] как число а только лишь строкой?
Думаю, в том, что хранить парольчики в открытом виде не комильфо. Но самое главное, в нашем случае, при нестрогой проверке, без учета типа, пых будет приводить всё к числу(если конечно, первый аргумент сравнения число*), а следовательно сила пароля равна силе ряда цифр в парольной фразе. Следовательно можно брать количество сочетаний цифр из 10(0,1,...,9) по 1, по 2, по 3 и т.д. с повторениями и перебирать. Т.е. если пароль "pass123" , то мы угадаем его введя 123. Конечно, нужно знать логин. Но это уже другой вопрос. *пока мне этого добиться не удалось
нет нет. На это и предыдущее - пхп при сравнении будет приводить оба аргумента к наименьшему типу. Порядок аргументов значения не имеет. PHP: var_dump('somestring' == 0); var_dump(0 == 'somestring'); bool(true) bool(true) Дважды нет. 1) При сравнении строки "pass123" с числом 123 строка будет приведена к числовому типу. Порядок приведения - из строки берутся цифры слева направо, пока не встретится буква. Полученные числа интерпретируются как десятичные. Исключение - буква "e" Согласно этого алгоритма - строка pass123 будет равна нулю, и следует отправлять число 0, тогда проверка пройдет. Пример: PHP: var_dump('pass123' == 123); var_dump('pass123' == 0); var_dump('123pass' == 123); var_dump('123pass' == 0); bool(false) bool(true) bool(true) bool(false) 2) Второй раз нет по той причине, что вы не можете отправить в качестве аргументов числа. ПХП интерпретирует все параметры как строки. И все написанное выше в общем случае не верно. PHP: var_dump('somestring' == '0'); var_dump('0' == 'somestring'); var_dump('pass123' == '123'); var_dump('pass123' == '0'); var_dump('123pass' == '123'); var_dump('123pass' == '0'); bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) Как я уже сказал - особый случай это буква "е" и строки состоящие только из цифр и из буквы "e". Предлагаю помедитировать почему все следующие проверки возвращают true: PHP: var_dump('0e12312323' == '0'); var_dump('12e1' == '120'); var_dump('12e-2' == '1200e-4'); var_dump('12e-2' == '0.12');