创建安全的 PHP 会话

信息安全 php
2021-08-23 21:23:22

我已经创建并完善了注册和登录系统,但是我相信当您创建会话时会出现棘手的部分。据我所知,这是由于劫持和固定。老实说,我不完全理解这个概念。

我整天浏览互联网并进行了大量研究。到目前为止,他的以下文章对我很有用:

如何创建防弹会话

PHP 安全指南:会话

到目前为止,我几乎没有,我真的可以使用一些帮助和指导。这是我到目前为止所得到的一些信息:

当用户密码匹配并且他们已经使用登录脚本确认了他们的身份时,将调用以下函数。会话在登录脚本的顶部启动。

function begin_session()
{
session_regenerate_id();
$_SESSION['valid'] = 1;
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']);
} 

我使用 $_SESSION['valid'] 变量作为简单的用户登录确认。我将会话分配给单个用户代理和 IP 地址。我看到用户代理是如何相当无用的,因为它很容易被伪造,但我觉得拥有它比没有它更好。

对我来说,更改/动态 ip 的用户很明显会被注销......但是告诉我这一切的每个人都未能为我提供更好的选择,或者更好地向我解释。

然后,我使用以下函数将当前用户代理与创建会话时记录的原始用户代理相匹配。

    function authenticate()
{
session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR'])) {       
    session_destroy();
echo 'die';
    header('Location: http://website login page/');
    exit();     
}
}

目前由于我缺乏了解,我不知道我在哪里容易受到攻击,也不知道我可以去哪里进行改进。这对我来说都是非常新的,至少目前我正在尝试在业余时间学习这一点。这对我来说都是新的,我想确保最好的工作。

3个回答

首先, 停止使用 MD5! 它是一个损坏的哈希函数,并且已经损坏了很多年。另外你必须使用 hmac,直接调用 md5 容易受到长度扩展攻击。

测试 IP 地址是有问题的,因为如果用户在负载均衡器后面,这个值可能会改变,负载均衡器通常由 Universe 和公司办公室使用。

攻击者将永远拥有用户代理,而这个值很容易被暴力破解。测试这个值绝不会形成或形成“安全措施”。这很像拥有一个变量is_attacker=no并确保该值是“否”,这是一个笑话! 当我看到一个程序员这样做时,我闻到了血腥味,如果他们真的认为这有助于提高安全性,那么他们很可能犯了其他错误。

如下设置您的php 会话配置

session.cookie_httponly = 1 (helps mitigate xss)
session.session.use_only_cookies = 1 (prevents session fixation)
session.entropy_file = "/dev/urandom" (better entropy source)
session.cookie_lifetime = 0  (smaller exploitation window for xss/csrf/clickjacking...)
session.cookie_secure = 1 (owasp a9 violations)

这可能只是个人观点...

我会将会话信息存储在数据库中,并通过存储在 cookie 中的令牌引用它。您不再需要“有效”变量,因为数据库会交叉引用令牌并确保它仍在允许的生命周期内。

如果需要,您可以选择直接使用 cookie 或使用 cookie 设置会话信息。会话并不是真正需要的。不过越简单越好。

您的令牌可以在用户登录时生成,如果需要在任何页面加载时重新生成 - 如果您想保持循环。

用户代理和远程地址不是令牌的良好基础,因为它们对许多人来说很常见。像大学或其他东西的代理人一样思考。每个人都会有相同的ip。您可以创建任何随机字符串,只要它是唯一的就足够了。

无论您选择做什么,其基本理念都是将会话或 cookie 中的信息量保持在最低限度并尽可能隐蔽。如果将过期时间设置为正常时间,则很难猜到有效令牌。此外,您可以跟踪失败的尝试并阻止在短时间内堆积的尝试。

如果一个帐户尝试从多个位置登录,您也可以引导人们。在这种情况下,用户代理和 IP 可能有助于识别同时访问尝试。

我目前处于类似的位置,研究会话安全的所有不同选项和影响,平衡可用性和安全性与服务器、传输和客户端上的潜在弱点是一个相当大的挑战。SSL 是保护传输层的最佳方式,cookie 的安全设置有助于保护客户端。

在使用 $Server 远程地址方面存在问题。对于某些用户来说,这个值确实会定期更改,并且每次都必须重新输入密码的用户确实很烦人。对于使用固定 IP 地址或 IP 地址范围的其他用户,这有助于使其更难破解,尤其是在同时使用 SSL 的情况下。就安全性而言,远程 IP 不是灵丹妙药,但在网络空间中却没有。结合多种安全方法都有帮助。尝试建立一个用户配置文件,其中 $server 变量保持不变,哪些更改可以帮助了解何时注销用户并以更及时和用户友好的方式询问密码。如果用户已注销,那么对其他 $server 变量(如用户代理或语言编码)的任何暴力尝试都必须等到真实用户重新登录。

您如何处理多个登录源也有其问题,如果用户想在工作、在家或外出时签到怎么办?通过获得有关用户在早期如何使用其帐户的一些信息,它可以帮助了解何时关闭会话并稍后再次询问密码。作为管理员,即使拥有完美的网络安全,用户如何管理他们的密码仍将是一个问题,并且需要一些设施在发生时进入并清理混乱。