| Статья :: Защита от двойного сабмита |
Давайте реализуем тот же самый алгоритм, но с помощью сессий.
Постановка задачи:
есть переменная $flag в сессиях пользователя
если она равна нулю, то ее надо установить в единицу и произвести какое-нибудь действие по этому поводу (если $flag был равен нулю). В качестве действия будем создавать файл со случайным именем такого типа: [случайное число].php-test.
Событием для выполнения проверки и создание файла будет опять кнопочка SUBMIT, который злой пользователь опять нажмет 2 раза. После выполнения программы вы обнаружите, что будет создан только один файл. Таким образом, в программах, которые используют сессии, больших проблем из-за параллельного выпонения скриптов, нет.
Приведенная ниже программа идентифицирует всех людей по одной и той же сессии, со случайным номером 0123456789abcdef0123456789abcdef.
/*
перед началом программы создайте каталог tmp (см. конец скрипта)
создание файла со случайным именем в этом каталоге символизирует некое действие
*/
session_id("0123456789abcdef0123456789abcdef");
session_start();
session_register("flag");
if (!isset($flag)) $flag=0;
switch ($c) {
case "":
echo "FLAG=$flag сбросить в нуль
";
break;
case "clear":
$flag=0;
header("Location: $PHP_SELF");
break;
case "submit":
if ($flag==0) {
sleep(5);
$flag=1;
srand ((double) microtime() * 1000000);
$filename= "tmp/".rand(0,9999).".php-test";
fclose(fopen($filename,"w+"));
header("Location: $PHP_SELF");
}
else
echo "Не выполнено, FLAG не равен нулю.";
break;
}
?>
|
|
|
|