我正在尝试防止跨站点请求伪造攻击(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';
}
}
答案 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();