Ответ на пост «Как на Пикабу случайный пользователь стал админом»
Вот такая история, как случайный пользователь стал админом крупной площадки из-за недостаточной внимательности и каламбура типизации php :)
Вот такая история, как случайный пользователь стал админом крупной площадки из-за недостаточной внимательности и каламбура типизации php :)
Вспомнилась курьезная, давно забывая инсайдерская история о Пикабу, годов так 2014-2015, решил поделиться.
Давным-давно Пикабу работал на php 5.3 и где-то в коде нужно было вывести блок с админскими инструментами, который должен был показываться только разработчикам сайта (на тот момент было всего 3 разработчика + админ). И вот проверку на разработчика мы сделали вот так
if (in_array($userName, array('admin', 'dev', 'dev.js', '0x00')) {
// какая-то админская опция тут...
}
Этот код проверял, есть ли ник текущего пользователя в массиве из 4 ников разработчиков. И если он там был, то пользователю выдавалась какая-то админская опция.
Дело в том, что на тот момент никто из нас не догадался, что php5.3 (и так было аж до 7й версии php) функция in_array работала с особым нюансом и случился курьезный момент: пользователю с ником 000000 (ну или похожий на него, точно не помню сколько нулей было) выдались админские права, так как in_array('000000', array('0x00')) в старых версиях php возвращал TRUE :) Т.е. php считал, что ник '000000' и '0x00' - это одно и то же.
Насколько помню про это сам пользователь сообщил.
Во внутренности работы этой функции в php не лез, но явно там было где-то приведение к числу, так как оно работает и на других парах, например in_array('123', array('0x7B')) также вернет TRUE, причем работает это как с десятичными числами в строке, так и с шестнадцатеричными и восьмеричными.
Исправлялось просто: нужно было третий аргумент в in_array всегда указывать TRUE, тогда php будет делать сравнение значений без приведения типа.
Вот такая история, как случайный пользователь стал админом крупной площадки из-за недостаточной внимательности и каламбура типизации php :)