我已经阅读了很多关于CSRF的文章,几乎所有文章都有相同的解决方案,这是隐藏的令牌,所以我写了一个代码来防止CSRF,然后我尝试黑客攻击我自己的页面,但它没有用,我想要知道我的代码是否是CSRF防弹,以及是否还有它。
我有四个页面,其中有表格,因此在每个页面中我会写下以下内容:
if (isset($_POST['submit'])){
// Check for CSRF token
if ($_SESSION['token'] === $_POST['token']){
// write to db
}else{
// CSRF attack has been detected
die("CSRF :<br>1: $_SESSION[token] <br> 2: $_POST[token]");
}
}else{
// assign CSRF prevention token
$form_token = md5((rand(1,89412) * 256 / 4).$date.time());
$_SESSION['token'] = $form_token;
}
?>
<form action='' method='post'>
<input type='hidden' name='token' value='<?echo $form_token;?>'>
这种方法是否足以阻止攻击者在我的网站上使用CSRF?
非常感谢。
答案 0 :(得分:0)
我将向您展示我的CSRF预防代码:
config.php
应使用require
或include
函数在每个页面中自动加载配置文件。
最佳做法是编写配置类(我只是写下函数以简化我的代码)。
session_start();
if(empty($_SESSION['CSRF'])){
$_SESSION['CSRF'] = secureRandomToken();
}
post.php
这只是一个例子。在每个&#34;帖子&#34;您应该检查页面是否设置了CSRF令牌。请使用POST
方法提交表单!我还建议您查看Slim Framework或Laravel Lumen,它们提供了一个出色的路由系统,只允许您在&#34; post.php&上接受POST请求#34;页面非常容易(它们也会自动在每个表单中添加一个CSRF令牌)。
if (!empty($_POST['CSRF'])) {
if (!hash_equals($_SESSION['CSRF'], $_POST['CSRF'])) {
die('CSRF detected.');
}
}else{
die('CSRF detected.');
}
view.php
现在你只需要在其中放入一个带有CSRF会话值的隐藏输入。
<input type="hidden" name="CSRF" value="<?= $_SESSION['CSRF'] ?>">
我希望这个快速解释可以帮助你:)