У меня есть система управления документами на основе 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-атак?