Проблемы при реализации токена сеанса PHP - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь реализовать защиту CSRF для веб-формы. Это одностраничный веб-сайт, который собирает данные, отправляет их в файл PHP, который затем отправляет мне информацию по электронной почте. Веб-страница функционирует должным образом (за исключением безопасности).

У меня следующие проблемы:

  1. Я не могу понять, как реализовать код PHP для установки токена; преобразование index.html в index.php загружает пустое тело. Я думаю, что решение этой проблемы, скорее всего, решит мои проблемы.
  2. Когда я пытаюсь вызвать token.php из jQuery, я получаю ошибку 403.
  3. Когда я пытаюсь запустить скрипт в 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 решит мои проблемы, но у меня возникают трудности с этим.

1 Ответ

0 голосов
/ 29 августа 2018

Есть несколько проблем с вашим кодом:

token.php необходимо вывести токен. Что так же просто, как echo $token;

Основная проблема в том, что вы использовали следующий jquery:

$(document).ready(function() {
$.get('token.php');
});

Это означает, что при загрузке страницы (index.html) ваш браузер отправляет запрос ajax на token.php. Однако ... больше ничего не происходит. Вы на самом деле ничего не делаете с ответом (выводом) от token.php.

Что вам нужно сделать, это разместить ответ от token.php на вашей веб-странице. Исходя из кода, который вы опубликовали, я предполагаю, что есть поле формы с именем "token"? Если дело обстоит именно так, вы бы сделали запрос ajax следующим образом, который записывает ответ token.php в это поле:

$(document).ready(function() {
    $.get('token.php').done(function(data) {
        $('input[name="token"]').val(data);
    }).fail() {
       // Handle ajax request failure here
    });
)};

Чтобы ответить на ваши вопросы:

  1. $_SESSION['token'] = bin2hex(random_bytes(32)); означает, что переменная $_SESSION['token'] содержит ваш токен. Вот где вы его устанавливаете.

  2. Если вы получаете ошибку 403, запрашивающую token.php в запросе ajax, это означает, что сервер не будет обрабатывать этот запрос. Так что это может быть проблема с разрешениями или другие проблемы. Попробуйте поместить die('test'); в первую строку скрипта, а затем выполните /token.php в браузере. Можете ли вы получить к нему доступ, или это дает вам ошибку? Если он доступен, он скажет «тест». Проверьте журнал ошибок сервера, если вы не уверены, почему не можете получить к нему доступ. Исходя из кода, маловероятно, что URL-адрес сценария неверен или это приведет к ошибке 404 .

  3. Непонятно, почему вы беспокоитесь: "Когда я пытаюсь запустить скрипт в 1-пиксельном фрейме" . Я предполагаю, что это попытка написать ответ token.php обратно на страницу. Это можно решить с помощью моего ответа выше.

...