Форма безопасности для атак подделки межсайтовых запросов - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь предотвратить атаки подделки межсайтовых запросов (CRFS).
Ниже приведен код генератора моих токенов на login.php.
Достаточно ли это безопасно, чтобы проверять токен csrf формы в сеансетокен?

if(empty($_SESSION['key'])){
    $_SESSION['key'] = bin2hex(random_bytes(32));
}
$csrf = hash_hmac('sha256','secured:login',$_SESSION['key']);

Вот мой код формы на login.php -

<form action="<?php echo htmlspecialchars('log/logscript.php');?>" method="post" class="login_form">
    <input type="hidden" name="csrf" id="csrf" value="<?php echo $csrf;?>">
    <input type="submit" class="btn btn-login btn-block" name="submit" id="submit" value="Login">
</form>

А вот мой AJAX-код -

$(".login_form").submit(function(e) {
        e.preventDefault();
        var 
            sk = "<?php $csrf;?>",
            fk = $("#csrf").val(),
            t = $("#submit").val();
        $.ajax({
            url: "log/logscript.php",
            type: "post",
            data: {
                sk: sk,
                fk: fk,
                submit: t
            },
            success: function(e) {
                $(".form-msg").html(e)
            }
        });
    });

А вот мойкод в log / logscript.php -

session_start();
if(isset($_POST['submit'])){
    $x = $_POST['sk'];
    if(hash_equals($x,$_POST['fk'])){
        echo 'success';
    }else {
        echo 'failed';
    }
}

1 Ответ

0 голосов
/ 20 октября 2018

Это то, что вам нужно .. Этот код взят из Stackoverflow.com.Это то, что я использовал для большинства проектов.

<?php
 session_start();
 $token= md5(uniqid());
 $_SESSION['update_token']= $token;
 session_write_close();
?>
<html>
<body>
<form method="post" action="update.php">
 <input type="hidden" name="token" value="<?php echo $token; ?>" />
Do you really want to delete?
<input type="submit" value=" Yes " />
<input type="button" value=" No " onclick="history.go(-1);" />
</form>
</body>
</html>

 save.php

<?php
 session_start();
 $token = $_SESSION['update_token'];
 unset($_SESSION['update_token']);
 session_write_close();
 if ($token && $_POST['token']==$token) {
   // update the record
 } else {
   // there is CSRF attack.
 }
?>

Кроме того, также убедитесь, что вы заново создаете идентификатор сеанса, как только ваш логин аутентифицирован.

// Повторный идентификатор сеанса, чтобы гарантировать, что атака с фиксацией сеанса невозможна ...

session_regenerate_id();
...