#php #взлом
Допустим с помощью php создаю сессию: $_SESSION['user_id'] = 22; Браузер я так понимаю, создает cookie с id юзера в зашифрованном виде (скажем с помощью md5). То есть если генерировать с помощью md5 user_id другой (17 к примеру) и заменить cookie, то получается можно получить доступ к юзеру с id 17? Или я что-то не понимаю?
Ответы
Ответ 1
У каждой PHP сессии уникальный код который нельзя так просто подобрать, а все данные сессии хранятся только на сервере этот "уникальный код" который устанавливается в cookie т.е работает так Юзер заходит на сайт (при запросе на скачивание html в HTTP заголовках возвращается запрос на установку в cookie с названием PHPSESSION уникального кода который не зависит от $_SESSION['user_id'] = 22;) Потом браузер просто с этим ключом обращается к серверу Проще говоря можно представить что $_SESSION это файл сессии, user_id ячейка в этом файле, а 22 это значение ячейки user_id P.s данные сессии не как нельзя получить на стороне пользователя (если их только самому не отдать ему к примеру выводом через echo $_SESSION['user_id'];)Ответ 2
У сервера есть ящик. В ящике лежит user_id = 22. Сервер на ящик прибивает табличку с какой-нибудь аброкадаброй и хранит у себя все время сам ящик, никому не дает его. Затем сервер говорит браузеру: "Запиши, браузер, аброкадабру с таблички этого ящика. В следующий раз, когда придешь снова, сообщи мне ее и я загляну в ящик с этой табличкой, чтобы узнать тебя".Ответ 3
итак: Допустим, вы раздаете сайт по протоколу http. можете считать, что всех ваших пользователей уже взломали, админку тоже увели. этот случай не рассматриваем. Допустим, вы раздаете сайт по протоколу https Вы делаете куку, выдаете пользователю. пользователь заходит на сайт, и оставляет где-нибудь коммент, содержащий js-код. поскольку вы не разбираетесь в куках, то и в фильтрации js вы тоже не разбираетесь. В простейшем случае, JS-код выдаст в браузер что-нибудь типа . У вас XSS-уязвимость. Каждый посетитель страницы с таким кодом отправит свою куку на сервер атакующего. Условно говоря, кука (в данном случае, айдишка в куке) прокидывается к атакующему. Если кука прокинулась к атакущему, простейший скрипт позволит ему при получении куки автоматически сделать какие-нибудь нехорошие действия, например, зайти под вами в админку, перезаписать какой-нибудь файл, сохранить его, вы даже и не заметите, что произошло. Просто какой-то сервер в интернете за 1-2 секунды авторизовался под вами и сделал все что нужно. Изменил плагин вордпресса, например. А автор заразы в это время спит себе спокойно. Скрипт работает. А он спит. А у тебя сифилис на сайте. И какой-нибудь вредоносный код, заражающий пользователей. В итоге - сервер заражен, пользователи заражены, "и мы в аду и ты горишь, сынок." Чтобы кука была недоступна для js-кода в браузере, придумали специальный флаг HttpOnly - почитайте здесь Это одна из причин, почему некоторые сайты не позволяют заходить одновременно с двух ip-адресов. Для идентификации пользователя используется пара id+ip. И именно поэтому, например, какой-нибудь альфа-банк разлогинивает вас автоматически через, кажется, 10-15 минут неактивности. Пришел к тебе друг, а ты вышел собаку прогулять, а комп забыл залочить. Находясь в одной и той же подсети, например, можно стащить куку, и пара cookie/ip с другого компьютера в той же подсети вполне себе сработает без всякого ip spoofing. (тут я не в курсе, насколько защита от ip spoofing продвинулась за последние несколько лет) p.s. поскольку я не специалист по безопасности, а если бы и был, врядли смог бы выдать полное руководство в ответе, рекомендую вам погуглить и почитать про такие вещи самому. p.p.s https-сертификат бесплатно нынче модно получать у https://letsencrypt.org p.p.s. если вы решите создавать куки самостоятельно, при помощи md5 от id пользователя, то не решайте так. Какой-нибудь милый человек посмотрит сколько у вас примерно пользователей, после этого будет время от времени (в зависимости от количества пользователей) делать запросы с подходящим md5. Если вы еще приделаете список пользователей онлайн - будет еще легче. Про соль вы забудете, про перец забудете и в итоге сессия вашего юзера будет md5(1), md5(2), md5(n)... Можно просто сделать md5(1) = авторизован = творю что хочу. Не балуйтесь с крипто, не прочитав про него. Пользуйтесь встроенными механизмами генерации куки от php/почитайте про шифрование и хэширование. p.p.p.s еще бывает очень смешно, когда session_id передают через get-запрос, т.е. session_id появляется в адресной строке браузера. Если посетителя вашего сайта попросят прислать ссылку на материал вашего сайта, или он сам выложит ее куда-нибудь, то произойдет авто-логин