Анти-CSRF-сессия токенов скрипта PHP логика проблема - PullRequest
0 голосов
/ 04 сентября 2018

Я чувствую, что это логическая проблема. При загрузке страницы я вызываю token.php, который должен установить токен сеанса и заполнить скрытое поле тем же токеном. Когда моя веб-форма отправлена, она сравнивает токены перед отправкой информации мне. Цель состоит в том, чтобы предотвратить атаки CSRF. Поскольку я очень новичок в PHP (и js, jQuery, HTML, кодирование и многие другие), я не могу найти ошибку.

Я получаю ответ "неверный токен". Он должен установить одинаковый токен для обеих переменных, и я обрабатываю пустой токен с другим сообщением об ошибке.

В голове у меня index.html

<script>
    $(document).ready(function() {
        $.get('token.php').done(function(data) {
            $('input[name="token"]').val(data);
        }).fail();
        {
        //failure code goes here
        }
    });
</script>

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**.com/thankyou');
            exit();
        }   
        else {
            echo "token invalid";
        }
    }
    else {
        echo "token blank";
    }
}
else {
    echo "invalid request";
}
?>

1 Ответ

0 голосов
/ 04 сентября 2018

Вы не возвращаете никакой информации из token.php

<?php

session_start();
if (empty($_SESSION['token']))
    $_SESSION['token'] = bin2hex(random_bytes(32));
echo ($_SESSION['token']);

Кстати, не закрывайте тег <?php, если вы только используете php-код на этой странице, таким образом, вы избегаете посылки символов пробелов / новых строк в качестве ответа.

В вашем jquery метод fail() не будет работать, как вы ожидали, из-за точки с запятой, а не из-за анонимного вызова функции.

<script>
    $(document).ready(function() {
        $.get('token.php').done(function(data) {
            $('input[name="token"]').val(data);
        }).fail(function()
        {
            //failure code goes here
        });
    });
</script>

Для обработки токена, хранящегося в сеансе, не забудьте добавить в начале формыubub.php:

<?php 
session_start();
if($_SERVER["REQUEST_METHOD"] == "POST") {
    //Your code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...