UPDATE. По результатам обсуждений в систему защиты внесены изменения — откорректировал описание в топике. Особенно большое спасибо benone, Wizard, onthefly за активное обсуждение проблемы.
Раньше в движке для обеспечения защиты от несанкционированных действий использовалась проверка переменной $_SERVER['HTTP_REFERER']. Но иногда это создавало дополнительные проблемы, поэтому было решено ввести новый механизм защиты (готов к использованию начиная с ревизии #551).
Защита данных, полученных через GET-запрос.
Проблема: Некоторые действия выполняются, после перехода пользователя по ссылке, например, удаление топиков. При этом, естественно, проверяется авторизация пользователя. Но, злоумышленник, может подгрузить вам эту страницу на другом сайте в невидимом фрейме и вы удалите топик сами того, не подозревая.
Основная идея решения такова:
1) Завершая свою работу, модуль Security генерирует уникальный 32-х символьный ключ, зависящий от идентификатора сессии (считается, что идентификатор сессии стянуть практически невозможно).
2) В шаблонах, ссылки подобного рода генерируются с добавлением параметра ?security_ls_key=…
3) При переходе по такой «критической» ссылке, Security сравнивает security-key из ссылки с рассчитанным значением для данного идентификатора сессии.
Такой механизм означает, что потенциальный злоумышленник теперь просто-напросто не знает по какому адресу нужно вас перенаправить для удаления топика, блога, вашего разлогирования и т.д — ссылка будет действовать только в рамках одной сессии.
Защита данных переданных POST запросом.
При отправке POST-запросов из форм на сервер также отправляется security-key, который валидируется методом, описанным выше.
Все ajax запросы были переведены в режим явной отправки переменных в POST, а в обработчиках соответственно добавлена проверка isPost().
P.S. На всякий случай старый метод ValidateReferal() сохранен, т.е. при желании можно переключиться в старый режим проверки.
41 комментарий
Чего-то я не могу понять, а что мешает злоумышленнику передать пост-запрос в том же самом айфрейме?
Такой ключ не позволит создать трастовую форму на левом сайте. Он гарантирует, что пост-запрос получен от авторизованного клиента и по его прямому волеизъявлению.
Защита действий, инициированных POST-запросом обеспечивается проверкой авторизации пользователя. Исходя из этого простого соображения, все ajax запросы были переведены в режим явной отправки переменных в POST, а в обработчиках соответственно добавлена проверка isPost().
проблема в том, что доступ к кукам только с необходимого домена, поэтому и можно было послать GET запрос через фрейм, где был доступ к кукам. POST запрос нельзя через фрейм послать, его можно тупо послать с сайта злоумышленника, но тогда не будет доступа к кукам :)
«его можно тупо послать с сайта злоумышленника, но тогда не будет доступа к кукам :)»…
Это в новой версии проверка?
Насколько я понимаю, речь о том, что невозможно получить доступ к кукам другого домена (due to browser security policy). Поэтому отправленный POST-запрос с другого сайта будет не опасен, т.к. авторизации всё равно не будет.
в плане? Если ты авторизирован и я тебе даю ссылку типа yavsesam.ru/example.php в которой автоматом жмется кнопка «Сабмит» и на создается топик с ссылкой на мой любимый сайт. А тебе показывается картинка с ребенком =)
Но в этом случае пользователь увидит, что был переброшен на другой сайт. И что тем самым удалил свой топик, блог какой-нибудь важный, поменял себе пароль. И больше на плохой сайт не пойдёт. Всё не так безнадёжно ))
Аякс-запросы на другой домен работать не будут. Как раз due to browser security policy.
Будет работать (да-да, забыл я про это) лишь прямая отправка формы. Но она и повлечёт за собой переадресацию на тот сайт, поэтому пользователь должен (просто обязан) это заметить.
Ой, не слышал о таком. Может и есть такое, проверять лень. Кстати, в таком случае можно попробовать открыть попап, который отсылает форму и закрывается или опять же фреймы.
Но это всё уже не так важно. Главное, что можно отправить форму и она примется.
Да, это касается аякс-запросов, которые могут сделать всё незаметно для пользователя.
Это было добавлением к
невозможно получить доступ к кукам другого домена (due to browser security policy). Поэтому отправленный POST-запрос с другого сайта будет не опасен, т.к. авторизации всё равно не будет.
Зато теперь начало валится с надписью — «Hacking attemp!» при нажатие на Создать блог. Рейтинг был повышен, кэш почищен, сессия из таблички тоже, тестилось на 2х юзераx — проблемы у обоих те же. Релиз из репозитория ветки trunk.
41 комментарий
или я неправильно понял автора?
Это в новой версии проверка?
сейчас в старой версии(на holywars.10slov.ru) закомментировал
Захожу на holywars.10slov.ru, авторизируюсь.
Захожу на
Комментарий появляется в базе holywars, но не выводится (не разбирался почему, может кеш).
В commentAdd.php после строчки
Кстати, на холиварсах че-то статика не отображается, надо разобраться…
Насколько я понимаю, речь о том, что невозможно получить доступ к кукам другого домена (due to browser security policy). Поэтому отправленный POST-запрос с другого сайта будет не опасен, т.к. авторизации всё равно не будет.
Будет работать (да-да, забыл я про это) лишь прямая отправка формы. Но она и повлечёт за собой переадресацию на тот сайт, поэтому пользователь должен (просто обязан) это заметить.
Но это всё уже не так важно. Главное, что можно отправить форму и она примется.
Это было добавлением к
будем фиксить путем добавления ключа