Я пытаюсь предотвратить атаки подделки межсайтовых запросов (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';
}
}