【问题标题】:csrf ... php form securitycsrf ... php 表单安全性
【发布时间】:2017-10-27 22:38:04
【问题描述】:

我正在创建一个具有多个不同访问级别的网站,从基本用户到管理员级别(总共 5 个)

经理和管理员级别可以选择在等于或低于他们的级别添加新用户,这是通过 createNewUser 页面上的下拉框完成的,我已经将其限制为仅显示少于或等于他们自己的访问级别......但是......我试图阻止的是这个......

用户加载站点,获取表单的副本源(包括 CSRF 令牌)在桌面上创建一个简单的 HTML 表单修改访问级别设置,他们实际上可以非常轻松地创建一个管理员级别的帐户。 ..

有没有办法使用 CSRF 来阻止这种情况......或者我应该只依靠源来阻止它来自“服务器外”源

我还希望在为此设置 CSRF 时提供一些关于最佳实践的提示...

网站上还有其他具有类似功能的表单,所以我认为这需要一个表单解决方案

干杯...哦,尽可能保持简单:)

【问题讨论】:

    标签: php forms security csrf


    【解决方案1】:

    有没有办法使用 CSRF 来阻止这种情况......或者我应该只依靠源来阻止它来自“服务器外”源

    不,这两种方法都行不通。用户可以使用 Web 检查器或通过从真实页面复制 CSRF 令牌来轻松注入新值。

    检查您的输入!! 如果用户尝试添加新用户,请先查看他们的权限,然后再让他们继续操作。不要依赖输入表单来应用这些限制。

    出于其他原因(例如,防止恶意网站劫持管理员会话),应用 CSRF 检查仍然是一个好主意,但它无法保护您免受授权用户的侵害。

    【讨论】:

    • 干杯我会选择那个选项:)
    【解决方案2】:

    这是我正在使用的,我希望这是一个好的解决方案

    在主页上我开始会话并生成会话令牌

    session_start();
    
        if (empty($_SESSION['token'])) {
            $_SESSION['token'] = bin2hex(random_bytes(32));
        }
    

    我正在使用bin2hex,但您也可以尝试其他哈希方法。

    在登录 php 页面添加这个

    if (isset($_POST['Login']) && !empty($_POST['token'])) {
        if (hash_equals($_SESSION['token'], $_POST['token'])) {
    
        //execute script
        }
    }
    

    检查会话令牌是否已启动以及是否与 html 输入值匹配。

    将此隐藏的令牌输入添加到您的 html 表单中以获取 $_POST['token']

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

    【讨论】:

      猜你喜欢
      • 2015-04-12
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      相关资源
      最近更新 更多