PHP CSRF全站解决方案-是否足够好

时间:2018-10-07 10:05:13

标签: csrf php-7

我有一个基于PHP的文档管理系统,我曾经写过一段时间来存储家人的文件。尽管完整的代码尚未公开,但保护它免受CSRF攻击仍然是一个好主意。

这是否是实施站点范围CSRF保护的合适解决方案:

所有表单都有防止直接访问的保护,因此必须通过index.php对其进行访问,这是通过在每个表单PHP文件顶部使用以下代码完成的:

if(basename(__FILE__) == basename($_SERVER['PHP_SELF'])){
    header("Location: ../../");
}

在index.php文件中,每种形式都必须经过该文件才能访问,如果没有的话,我有以下代码来创建令牌会话,然后检查是否包含令牌的任何发布数据(在完成之前对表格的任何可能调用):

// Generate session token for CSRF
if (empty($_SESSION['token'])) {
  $_SESSION['token'] = bin2hex(random_bytes(32));
}
if (isset($_POST['token'])) {
  if (!hash_equals($_SESSION['token'], $_POST['token'])) {
    echo 'There is a problem with your session token.';
    exit;
  }
}

表单验证包含以下代码,以检查是否已设置令牌会话以确保已运行对index.php的会话检查:

if (isset($_POST['token']) && $_POST['token'] == $_SESSION['token']) {
    // Process form data
}

最后,每种形式都将包含一个隐藏元素,如下所示:

<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>" />

据我所知,这应该是合适的,但我不是CSRF PHP攻击的专家。

我的问题是:

1)除了包含在同一服务器上的另一个PHP文件中之外,第一段代码是否是阻止对该文件访问的合适方法?

2)这种实现令牌的方法是否适合阻止CSRF攻击?

0 个答案:

没有答案