Подскажите какую защиту необходимо сделать, чтобы пользователь не мог отправить форму с другого сайта? У плагина uploadify например стоит такая защита: HTML Код (PHP): <?php $timestamp = time(); ?> <form method="post"> <input type="hidden" name="timestamp" value="<?php echo $timestamp; ?>" /> <input type="hidden" name="token" value="<?php echo md5('unique_salt' . $timestamp); ?>" /> </form> PHP обработчик Код (PHP): $verifyToken = md5('unique_salt' . $_POST['timestamp']); if ($_POST['token'] === $verifyToken) { // Что-то делаем... } Суть этой ерунды я так и не понял. Пользователь может скопировать из уже загруженной HTML страницы значения полей name="timestamp" и name="token" в "свою" форму и все отлично пройдет. Что вместо этого применяется для подобной защиты?
Referrer считается ненадежным признаком. Он может отстутствовать в настоящих запросах и легко может быть подделан ботом. Что можно реально улучшить, так это 1. включить в функцию расчета токена доп. данные: адрес обработчика формы, айди пользователя, его айпи и т.п. 2. проверять метку времени на просроченность либо использовать какую-нибудь реализацию nonce, чтобы токен мог использоваться только один раз.
не знаю как работает та хрень, надо делать так: 1. запускаешь сессию - session_start 2. при заходе на страницу с формой должна создаваться переменная из случайных цифр и символов и записываться в сессию 3. потом это случайное значение должно выводиться в форме в виде скрытого поля: Код (PHP): <input type="hidden" name="form_controller" value="<?php echo $_SESSION['form_controller']; ?>" /> 4. при получении формы ты должен проверять было ли получено значение $_POST['form_controller'] и равно ли оно $_SESSION['form_controller'], если не получали или оно не равно, значит оно пришло не из твоей формы. тут правда будет косяк если кто то откроет 2 раза форму отправки, значение $_SESSION['form_controller'] перезапишется и одна из форм будет уже считаться как левая, но как это решить думай сам, там ни чего сложного нет.
Он отправляется браузером и может быть изменен. Также может и не отправляться браузером, вообщем все зависит от браузера. Это не поможет, если "злоумышленник" будет авторизован на сайте и будет отправлять форму с этого же браузера. Не очень понял смысл... Это защита если вдруг "злоумышленник" решит отправить форму скажем через год что-ли? Так одного раза "злоумышленнику" будет более чем достаточно. Это не поможет, если "злоумышленник" будет авторизован на сайте и будет отправлять форму с этого же браузера.
чё это? он сможет отправить форму только в том случае, если зайдет на нее, в таком случает откуда в сессии у него возьмется $_SESSION['form_controller'] и откуда он узнает что именно тут надо отправлять: Код (PHP): <input type="hidden" name="form_controller" value="<?php echo $_SESSION['form_controller']; ?>" />
Я захожу на страницу формы вашего сайта. Копирую значение value из инпута name="form_controller". Открываю новую вкладку в браузере (в этом же браузере), например свой сайт какой нибудь. Пишу форму какую хочу и вставляю <input type="hidden" name="form_controller" value="скопированное значение с вашего сайта" /> Нажимаю отправить и ваш обработчик прекрасно все пропустит. Да, было бы здорово, если бы все было именно так...
А зачем копировать из браузера другого, когда есть свой? Я же в прошлом сообщении описал все подробно (как я думаю).
Если у "злоумышленника" твой IP и он вошел под твоим аккаунтом. Короче если это ты. Тогда да, однозначно не поможет. ))) Прежде чем возражать, попробуй осмыслить что тебе пишут. Если что непонятно — попроси уточнить.
слух, а что ему мешает просто отправить с самой страницы, без копирования, открывания новых окон и т.д. и что значит что они пишет форму какую хочет, важно то, что ты же на том конце принимаешь что то конкретное (и соответственно проверяешь и фильтруешь), а что он отправит в добавок не важно. или в чем юмор? просто я так понимаю это какое то извращение, не нужно причем.
Рекомендую почитать теоретический материал по защите от меж-сайтовой подделки запросов, так это называется. Как обычно, русская страничка вики недотягивает по качеству до англоязычной.Так что глянь обе.
Да, именно "если это ты". Ну захотелось мне "побаловаться", всякое бывает. Я же точно описал: Есть у тебя форма редакции товара например, в ней есть инпут скрытый с ID товара. Вот возьму я и поменяю его на другой (скажем 5 на 15) и обновится другой товар. Ну и так по циклу. В итоге у тебя все товары будут одинаковые. Добавлено спустя 1 минуту 21 секунду: Ок, спасибо, почитаю.
ну так это надо проверять внутри, в смысле на сервере, а на стороне клиента это безумие. если мне не изменяет память мне и не надо открывать другое окно, я просто могу нажать ctrl + shift + i откоются инструменты разработчика и я там принудительно могу поменять все что хочу, без всяких новых страниц.
ну токены это защита от того, чтобы кто-то другой смог действовать тобой. =) Если ты решил что-то удалить, то начерта тебе что-то копировать из формы в другую форму, если это уже вставлено в первую форму.
Вот смотри, реальный пример. Я сейчас зашел на доску объявлений в новости своей организации. Записал ID новости о молоке (к примеру). Открыл редакцию новости о кефире и подставил туда ID молока, нажал сохранить. Теперь у меня 2 новости про молоко)) Т.е. при желании я могу сделать все новости этой доски про свое молоко, просто перебирая ID с первого до последнего. Как мне обезопасить сайт от этого?
ну так это уязвимость сайта, так быть не должно. производить проверку на стороне сервера, может ли данный пользователь редактировать объявление с данным ID.
Да, это подойдет, спасибо. Никто не станет "портить" свои объявления например. А сессии тут мало чем помогут. Если форма должна заполняться авторизованным пользователем, то прислав эту форму "со стороны" его и так "не пустят" к этой странице.