PS: На самом деле не очень понимаю, в чём, собственно, проблема. Что-то серьёзное с таким сделать сложно, ну а если для вас так критично не допустить подобного на своём ресурсе — решение элементарно, юзайте форму и POST…
Я вижу только использование специально генерируемого ключа для каждого пользователя и его проверку при запросах разного рода.
Но это по моему немного не удобно.
По-моему речь шла просто о добавлении рандомного кода в скрытом поле каждый раз да и всё.
Реализуется очень просто и сторонний запрос уже не пошлёшь. У меня в фреймворке просто отдельной опцией включается, ровно как и капча.
Спасибо, теперь мне стало понятно, зачем действительно нужно использовать метод POST для запросов, изменяющих данные на сайтах, где юзеры могут тем или иным способом вставлять HTML (UGC, например).
Наверное лучший вариант, но не очень красиво я считаю.
И если использовать именно Ваш вариант, например пользователю после какого то действия с сайтом, понадобится дать ссылку другу, то друг увидит пустую страницу.
Всё просто. Нужно в критически важные ссылки добавлять логин пользователя (а на сервере сверять его, к примеру, с ID сессии). Ссылка для выхода будет выглядеть примерно так: www.site.com/user/%username%/logout/.
А если злоумышленник составит базу логинов или будет заранее знать нужных ему пользователей.
Это конечно мало вероятно, но все же я считаю, это не очень подходит.
В get-запросах стоит передавать то, что заставляет страницы выглядеть определённым образом, чтобы можно было добавлять в закладки. Всё остальное — дурной тон.
GET-запрос легко исправить, тупо изменив его в строке браузера. POST-запрос подделать сложнее, но тоже реально. Но есть механизм сессий. Но есть сниферы. И тут приходит шифрование и HTTPS. И тут злоумышленник тратится или на суперкомпьютер, чтобы поломать ключ, или на паяльник и билет до жертвы, чтобы оказать него желаемое воздействие.
Если вы не пишите систему работы с банковскими платежами, то наверняка вам хватит POST-запросов, механизма сессий и обработки данных для отдельного пользователя только в том случае, если они пришли с того же ip, с каким он прошёл авторизацию.
Добавлю в качестве примера, как у меня в текущем проекте происходит проверка перед выполнением действий на сайте в зоне для уже авторизированных пользователей:
1. Есть ли идентификатор пользователя в сессии пользователя (впихивается в $_SESSION при авторизации)?
2. Пришло ли с нашего сайта (по имени сервера)?
3. Пришло ли с того айпишника, с которым этот пользователь зашёл на сайт?
4. Не содержат ли передаваемые данные запрещённые символы?
5. [опционально, зависит от вида действия] Роль пользователя позволяет ему выполнять это действие?
До этого сообщения об этом не задумывался, потому что с такими проблемами со стороны пользователя ни разу не сталкивался. В свободное время, наверное, погуглю на эту тему, возможно сделаю проверку по имени сервера желательной, но необязательной. Но, повторюсь, пока таких пользователей не встречал. Возможно, везло.
Взломать можно абсолютно всё, это вопрос только времени и денег.
Не совсем понял, в чём суть вашего хака: я же говорю, проверяется корректность введённых данных, в частности по PCRE — пункт номер 4 в моём списке. К тому же, если вы уже авторизировались, то пробили защиту по сессиям и она, как первый уровень обороны уже более для вас не актуальна.
В get-запросах стоит передавать то, что заставляет страницы выглядеть определённым образом, чтобы можно было добавлять в закладки. Всё остальное — дурной тон.
GET-запрос легко исправить, тупо изменив его в строке браузера. POST-запрос подделать сложнее, но тоже реально. Но есть механизм сессий. Но есть сниферы. И тут приходит шифрование и HTTPS. И тут злоумышленник тратится или на суперкомпьютер, чтобы поломать ключ, или на паяльник и билет до жертвы, чтобы оказать него желаемое воздействие.
Если вы не пишите систему работы с банковскими платежами, то наверняка вам хватит POST-запросов, механизма сессий и обработки данных для отдельного пользователя только в том случае, если они пришли с того же ip, с каким он прошёл авторизацию.
решение простое как пробка — подписывать не только пользователя (кукой), но и выданную ему форму/ссылку (параметром).
кука периодически меняется, а к страницам подключается скрипт, который отслеживает её изменение и обновляет подписи форм/ссылок.
GET запросы