跨站点请求伪造攻击的表单安全性

时间:2018-10-19 18:30:38

标签: php jquery ajax csrf

我正在尝试防止跨站点请求伪造攻击(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 :(得分:-1)

这是您需要的。。此代码来自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.
 }
?>

此外,还要确保您对登录用户进行身份验证后立即重新生成会话ID。

///重新生成会话ID,以确保不可能进行会话固定攻击...

session_regenerate_id();