Как я могу передать токен, сгенерированный в одной форме PHP, в форму, которая его обрабатывает?

Я пытаюсь защитить свои формы от атак CSRF, генерируя уникальный токен для каждого из них. В моей форме есть скрытое поле, которое генерирует уникальный токен, например:

public static function generateToken() {
return $_SESSION['token'] = md5(uniqid(mt_rand(), TRUE));
}

Я знаю, что md5 устарела и не должна использоваться, потому что она не так случайна, как что-то вроде:

base64_encode(openssl_random_psuedo_bytes(32));

Но в настоящее время у меня не установлен ssl, и я позабочусь об этом. Но мой главный вопрос заключается в том, что после генерации этого токена он сохраняется в сеансе, в котором пользователь сейчас находится, следующим образом:

$_SESSION['token'] = $_POST['token'];

Он захватывает значение поля, в котором есть сгенерированный токен. Теперь, когда я храню этот токен в сеансе, мне нужно разобраться, чтобы отправить его в файл обработки. У меня есть много полей в этой форме, поэтому будет немного странно проверять каждую вещь в одном if() заявление. Я думаю, что я пытаюсь сказать, как я могу проверить этот токен в форме, которая обрабатывает данные, и если токен не совпадает с токеном, сгенерированным в форме, могу ли я отклонить эти данные? Просто используйте die() убить скрипт обработки?

Мне также интересно, нужно ли мне вообще это делать — я читал о CSRF, но я полагаю, что худшее, что кто-то может сделать, это изменить часть информации, которая отправляется на обработку, поэтому я хочу передать токены для проверки и отклонения данных, это происходит.

<form name="form1" action="processing.php" method="POST" enctype="multipart/form-data">

Это то, что я имею в виду под другим файлом. PHP не все в одном месте, я получаю все в сценарии обработки с помощью метода $ _POST.

0

Решение

  1. Генерация и сохранение токена на стороне сервера (sql или др ..)
  2. Создать cookie с токеном (на стороне клиента)
  3. Когда форма отправлена, получите токен из cookie
  4. если cookie совпадает с сохраненным токеном, это нормально

Создать токен:

$formName = "signin"; // name of the form
$ip       = get_ip(); // create a function to get the ip of the user
$salt     = "8077_(-(àyhvboyr(à"; // uniq secret salt
$token    = md5(sha1($salt.$ip).sha1($salt.$formName));
...

if(empty($_COOKIE['token'])){ // if(empty($_SESSION['token'])){

setcookie("token",$token, time()+3600*1); // use with cookie // time()+3600*1 = now + 1 hour
$_SESSION['token'] = $token; // OR use with session

}else{

// when the form is submit regenerate the token and compare with the request token
if($_COOKIE['token'] == $token){ // OR if($_SESSION['token'] == $token){
// request from server - ok
// ...
}else{
// bad request
setcookie("token",0); // destruct cookie
$_SESSION['token'] = "";  // OR destruct session
// redirect at the first form
}
}<form>
// if you want use the token directly in your form, add this :
<input type="hidden" name="token" value="<?php echo $token ?>" />
</form>
0

Другие решения

$formName = "signin"; // name of the form
$ip       = get_ip(); // create a function to get the ip of the user
$salt     = "8077_(-(àyhvboyr(à"; // uniq secret salt
$token    = md5(sha1($salt.$ip).sha1($salt.$formName));

$_SESSION["token"]=$token;
...
<form action="submit.php" >
// if you want use the token directly in your form, add this :
<input type="hidden" name="token" value="<?php echo $token ?>" />
</form>

и в submit.php нам нужно написать что-то вроде

if($_SESSION['token'] == $_POST['token']){
// request from server
}else{
// external request
}
0