【问题标题】:Protecting admin panel with secret HTTP header - is it foolish?使用秘密 HTTP 标头保护管理面板 - 这很愚蠢吗?
【发布时间】:2016-04-27 11:38:37
【问题描述】:

我只是想为我的管理面板提供额外的保护。我可以发送一些 HTTP 标头,我们称它为 Mushroom-Token 并带有一些长值。当它不在请求中或它具有无效值时,我的管理面板会抛出 404。

当然,这只是额外的保护层。当此令牌有效时,用户仍需要以管理员身份登录。

这种方法有意义吗?这不是通过默默无闻的安全的例子吗?或者也许它是广泛使用的技术?最后,对于管理面板的额外保护还有哪些其他想法?

【问题讨论】:

  • 你想阻止什么?
  • 我想防止任何潜在的暴力试验。我想对那些不应该被允许的人隐藏我的表单结构。
  • 添加标头无法防止暴力攻击。
  • @PeeHaa 但这个标题甚至不会被公开。我的意思是:既不是它的名称,也不是它的价值。找出完全未知的安全步骤是否比找出已知模式的值更难? (如表单的登录名和密码)。请不要认为这是一种冒犯,我真的很喜欢这个讨论,但对我来说,你似乎有点盲目地遵循这些教条。我在等待更多的争论,请不要走开:)
  • 是的,但是您可以将您的客户端配置为发送此标头。它根本不公开,就像保存在浏览器中的密码一样。

标签: php security http authentication admin


【解决方案1】:

防止蛮力攻击的正确方法是让它足够慢,以至于蛮力是不可行的。

这可以通过多种方式完成(假设在线攻击):

  1. 通过限制帐户尝试的速率来限制尝试
  2. 为帐户的多次错误登录尝试添加验证码
  3. 为整个系统上的多次错误登录尝试添加验证码
  4. 在系统范围内多次错误登录尝试阻止 ips(这不会阻止太多,因为攻击者可以轻松获得大量帐户)

由于以下几个原因,您在 imo 标头中使用令牌的想法行不通:

  • 令牌几乎是公开的,因为客户端必须拥有它
  • 一旦您的任何客户共享令牌,一切都会丢失
  • 一旦您的任何客户出现欺诈行为,任何东西都会丢失
  • 一旦令牌被恶意使用,就没有简单的方法来重置令牌并将其传递给非恶意客户端

您说的是管理面板,所以我假设它是某个后端的 Web 界面。这将涉及浏览器。您没有简单的方法告诉浏览器他们需要将上述标头添加到他们将要发出的请求中。

以上假设您将为所有客户端使用一个令牌。这意味着您只需要一个恶意用户,一切都会再次丢失。

如果上述假设是错误的,并且您要为每个客户端提供一个唯一令牌,那么您将遇到客户端需要首先获取令牌的问题(这应该基于身份验证,这会给您留下一个 catch 22情况)。这也意味着只有单个用户能够使用特定客户端,因为此时令牌既绑定到客户端,也绑定到令牌。

【讨论】:

    【解决方案2】:

    我已经为我糟糕的英语感到抱歉,我希望你能明白我想告诉你的。

    通过这种“安全性”,我认为您可以防止某些会话劫持攻击。但是还有很多其他方法可以做到这一点,比如重新生成会话 ID、将用户 IP 设置为会话(然后您必须检查最后一个 IP 是否与当前 IP 相同)等等......

    如果您希望它更安全,您还可以将其设置为只能从 SSL 和某些 IP 访问。

    您可以通过检查 IP 访问您的管理面板的次数来添加反暴力保护等内容,而该 IP 没有秘密标头/标头值错误。然后屏蔽一段时间内重试次数过多的 IP ...

    是的,添加管理面板访问和操作的完整日志记录可以很好地检查攻击是否成功。

    最后,大多数攻击都是在服务器端完成的,我的意思是,如果你有旧的 apache、nginx、php 版本等......如果你让每个人都开放端口......我无法列出所有可能的攻击。所以保护你的脚本是一件好事,但不要忘记其余的。

    我希望这会给你带来反思的方式。

    编辑

    我看到你想防止暴力攻击,第一层是服务器端,带有代理或防火墙,比如 HAProxy 能够在短时间内阻止太多连接(这会减慢暴力攻击,并防止您的数据库被过多访问)

    您还应该使用强密码: - 最少 10 个字符 - 1 maj、1 min、1 个数字、1 个特殊字符(如 @、!、# ...)

    我会禁止 TOR check this

    PHP 示例

    function IsTorExitPoint($ip = null)
    {
        if(is_null($ip))
        {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
    
        $stuff = ReverseIPOctets($ip) . "." . $_SERVER['SERVER_PORT'] . "." . 
                 ReverseIPOctets($_SERVER['SERVER_ADDR']) . ".ip-port.exitlist.torproject.org";
    
        if (gethostbyname($stuff)=="127.0.0.2")
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    function ReverseIPOctets($inputip)
    {
        $ipoc = explode(".",$inputip);
        return $ipoc[3].".".$ipoc[2].".".$ipoc[1].".".$ipoc[0];
    }
    
    if(IsTorExitPoint($_SERVER['REMOTE_ADDR']))
    {
        // do disallow stuff
    }
    

    【讨论】:

    • 在标题名称前加上X- 实际上已被弃用,您共享的链接清楚地说明了这一点:)
    • 啊哈哈,这似乎是真的,我已经过时了 :') 慢慢阅读(答案已更新)
    • 好吧,我不知道它不再被推荐了,所以感谢你,我很长一段时间没有重新阅读这个答案:D
    • 所以我们是双赢的! :D
    • @RoboRobok 没有。不要将安全方法建立在您认为会尝试破坏它的人之上。有各种报告指出,在密码中添加符号只会使应该登录的人感到困惑,而不是制作更长、更冗长的密码,人们可以记住并且从统计上来说,猜测设备破解的可能性更小。
    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    相关资源
    最近更新 更多