启动一个安全的 php 会话

信息安全 php
2021-09-01 22:30:56

我一直在研究创建安全的 php 会话以在登录脚本中使用一周左右。到目前为止,我还没有找到一个具体的资源来作为我工作的基础,阅读 StackOverflow 我所看到的只是混合的观点和意见。

我决定深入研究并编写一个函数来开始会话。

通过大量阅读和观看 Samy Kamkar 在 Youtube 上的 DEFCON 演示文稿,我对我编写的该系统的第一部分相当有信心和满意。

$session_name = 'sec_session_id'; // Set a custom session name
$secure = false; // Set to true if using https else leave as false
$httponly = true; // This stops javascript being able to access the session id 
ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies. 
ini_set('session.entropy_file', '/dev/urandom'); // better session id's
ini_set('session.entropy_length', '512'); // and going overkill with entropy length for maximum security

$cookieParams = session_get_cookie_params(); // Gets current cookies params.
session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); 
session_name($session_name); // Sets the session name to the one set above.
session_start(); // Start the php session

为了开发,这将与 SSL 一起使用,它不是......

所以我的问题是我可以在哪里改进这个脚本,我错过了什么,接下来我应该研究什么......

3个回答

有很多配置,而不是很多代码。

如果您不设置安全标志,那么使用非常好的随机数生成器没有多大意义(但我假设您将为实时系统更改它)。

但是这里有一些问题。

首先,您没有说这是在什么上下文中运行 - 在共享服务器上,来自默认处理程序的会话数据通常可以被所有虚拟主机访问。即使在专用服务器上,我也建议设置 sesison 处理程序以限制对会话的访问(例如,使用数据库处理程序,使用存储过程根据 id 设置/获取会话,并且不能直接访问底层数据) .

接下来,这里没有什么可以处理会话固定。确实,您应该在创建会话时(即,当它为空时 - 但记住在切换会话 ID 后在其中放一些东西)以及用户通过身份验证时,强制更改会话标识符。

进一步的警告是,默认处理程序将重用超过其 TTL 的会话(如果它们尚未被垃圾收集)。

多项式的建议是对 sslstripping 的良好保护。

我建议尝试将会话与特定设备相关联 - 但与 Manuel Faux 不同,我建议仅使用 IPV4 地址的前 16 位。同样,将用户代理与会话匹配可提供额外的保护(但请注意,Google Chrome 可以即时更新自身 - 甚至在会话中)。

为什么要覆盖代码中的 ini 文件设置?这些应该在您的 php.ini 文件中设置。

$cookieParams = session_get_cookie_params(); // Gets current cookies params.
session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly)

将 cookie 参数更改为它们已经拥有的值没有多大意义。

您的代码中缺少的另一件事是任何类型的日志记录。

这看起来很不错。我看不到任何明显的漏洞,除了 SSL(仅限 https)已关闭 - 尽管您提到它将在生产中打开。

您可能还想查看HTTP 严格传输安全 (HSTS)内容安全策略 (CSP) ( details / intro ) 以提高安全性。

您还可以将会话“锁定”到特定的客户端 IP 地址,这使得会话窃取更加困难,但它使用户几乎不可能“漫游” ISP 或位置(用户必须重新登录)。