Защита от повторной отсылки данных формы
WEB всемогущий июля 30, 2009Сегодня писал небольшую php-шку, и наткнулся на один неприятный момент.
Скажем я делаю добавление каких-то данных в базу. Соответственно есть форма, есть submit. Жмем на submit, данные отправляются, и нам пишут, что все ок. Добавились ваши данные. А теперь жмем Ctrl+R или F5 и наши данные благополучно отправляются второй раз. Долго думал как этого избежать… придумал ![]()
Для защиты от повторной отправки данных будем использовать сессии.
Собственно вот код:
<?
session_start();
if (is_numeric($_SESSION['key']))
{
$s_key = $_SESSION['key'];
if ($_GET['key']!=$s_key)
if ($_POST['key']!=$s_key)
die('Данные устарели!!!');
}
$key = rand(1000, 9999);
$_SESSION['key'] = $key;
echo preg_replace("/[\r\n]+/","<br>",print_r($_SESSION,true));
echo '<br><br><a href="?key='.$key.'">next</a>';
echo '<br><br><form method="POST" action="'.$_SERVER['PHP_SELF'].'"><input type=submit><input value='.$key.'></form>';
?>
Смысл состоит в том, что каждый раз мы генерируем новый ключ. Сохраняем его в сессии и передаем как параметр (в данном случае неважно каким методом POST или GET). Если значение параметра не совпадает со значением из сессии, значит это повторные данные.
Вуаля!

августа 21, 2009 - 18:32
Очень признателен, действительно полезная инфа.
января 2, 2010 - 20:41
хорошо! это помогает! спасибо!!!!
января 2, 2010 - 20:42
только можно еще проще: session_register(”savekey”);
и после обновления: session_unregister(”savekey”);
января 12, 2010 - 3:18
Спасибо. Реально помогло.