Я пытаюсь реализовать защиту CSRF для веб-формы. Это одностраничный веб-сайт, который собирает данные, отправляет их в файл PHP, который затем отправляет мне информацию по электронной почте. Веб-страница функционирует должным образом (за исключением безопасности).
У меня следующие проблемы:
- Я не могу понять, как реализовать код PHP для установки токена; преобразование index.html в index.php загружает пустое тело. Я думаю, что решение этой проблемы, скорее всего, решит мои проблемы.
- Когда я пытаюсь вызвать token.php из jQuery, я получаю ошибку 403.
- Когда я пытаюсь запустить скрипт в 1-пиксельном фрейме, я получаю ошибку 500 (я предполагаю, что он выполняется на HTML).
token.php
<?php
session_start();
if (empty($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];
?>
formsubmit.php
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (!empty($_POST['token'])) {
if (hash_equals($_SESSION['token'], $_POST['token'])) {
$emailbody = 'Name: ' . $_POST['m_title'] . ' ' . $_POST['m_firstname'] . ' ' . $_POST['m_surname'] . "\n"
. 'Email: ' . $_POST['m_email'] . "\n"
. 'Phone: ' . $_POST['m_phone'] . "\n"
. 'D.O.B: ' . $_POST['m_dob_day'] . ' ' . $_POST['m_dob_month'] . ' ' . $_POST['m_dob_year'] . "\n"
. 'Postcode: ' . $_POST['m_postcode'] . "\n"
. 'Lenders: ' . $_POST['m_bank1'] . ',' . $_POST['m_bank2'] . ',' . $_POST['m_bank3'] . ',' . $_POST['m_bank4'] . ',' . $_POST['m_bank5'] . ',' . $_POST['m_bank6'] . ',' . $_POST['m_bank7'] . ',' . $_POST['m_bank8'];
mail('**removed**', 'Web Lead', $emailbody);
header('Location: **removed**/thankyou');
exit();
}
else {
echo "token invalid";
}
}
else {
echo "token blank";
}
}
else {
echo "invalid request";
}
?>
Моя попытка jQuery в index.html
<script>
$(document).ready(function() {
$.get('token.php');
});
</script>
При условии, что приведенный выше PHP не пронизан ошибками, я предполагал, что успешное преобразование его в index.php решит мои проблемы, но у меня возникают трудности с этим.