PHP CSRF решение для всего сайта - это достаточно хорошо - PullRequest
0 голосов
/ 07 октября 2018

У меня есть система управления документами на основе PHP, которую я написал некоторое время назад, чтобы хранить документы своих семей.Хотя полный код не является общедоступным, все равно было бы неплохо защитить его от CSRF-атак.

Было бы это подходящим решением для реализации защиты от CSRF:

Все формы защищеныпротив прямого доступа, поэтому все они должны быть доступны через index.php, это делается с помощью следующего кода в верхней части каждого PHP-файла формы:

if(basename(__FILE__) == basename($_SERVER['PHP_SELF'])){
    header("Location: ../../");
}

В файле index.php, которыйкаждая форма должна пройти, чтобы получить к ней доступ. У меня есть следующий код, чтобы создать сеанс токена, если он не существует, и затем проверить наличие любых данных поста, содержащих токен (это делается перед любыми возможными вызовами формы):

// Generate session token for CSRF
if (empty($_SESSION['token'])) {
  $_SESSION['token'] = bin2hex(random_bytes(32));
}
if (isset($_POST['token'])) {
  if (!hash_equals($_SESSION['token'], $_POST['token'])) {
    echo 'There is a problem with your session token.';
    exit;
  }
}

Проверка формы содержит следующий код для проверки того, что сеанс токена был установлен для обеспечения проверки сеанса на index.php:

if (isset($_POST['token']) && $_POST['token'] == $_SESSION['token']) {
    // Process form data
}

Наконец, каждая форма будет содержатьскрытый элемент, например, так:

<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>" />

Насколько я вижу, это должно быть подходящим, но я не эксперт по CSRF PHP вtacks.

Мои вопросы:

1) Является ли первый блок кода подходящим методом блокировки доступа к файлу, кроме того, что он включен в другой файл PHP на том же сервере?

2) Подходит ли этот метод реализации токена для остановки CSRF-атак?

...