当我阅读有关会话劫持的文章时,我了解到最好加密存储在 cookie 中的会话 id 值。
据我所知,当我通过调用启动会话时session_start()
,PHP 不会加密 cookie 中的会话 id 值。
如何加密会话 id 值,然后用它初始化会话?
当我阅读有关会话劫持的文章时,我了解到最好加密存储在 cookie 中的会话 id 值。
据我所知,当我通过调用启动会话时session_start()
,PHP 不会加密 cookie 中的会话 id 值。
如何加密会话 id 值,然后用它初始化会话?
加密无济于事。无论如何,会话 cookie 只是一个神奇的数字。加密它只是意味着有一个不同的幻数可以劫持。根据您想到的劫持场景,还有其他可能的缓解措施。例如,您可以将会话限制为单个 IP。但是,这会带来一些问题,例如人们在无线点之间切换。
更重要的是您的会话 ID 是随机的(也就是说,有人不能使用他们的会话 ID 来猜测另一个人的),因为真正的危险是有人得到了另一个用户的会话 ID。只要您使它们真正随机,就没有理由或实用性对其进行加密
假设您的会话 cookie 是一个 GUID,那么加密它是没有意义的。它只会用另一个替换一个伪随机字符串。
不幸的是,加密会话 ID 不会大大提高安全性,因为攻击者可以只使用加密形式(无论如何这是他们唯一可见的东西)。
这可能会阻止的唯一一件事是您向某人发送包含 ?PHPSESSID=foo 的链接的技巧,这将导致 PHP 创建该会话。您可以通过使用加密和验证来防止这种情况发生,但您应该完全关闭 URL 中的会话 ID 传输。
制作此脚本,从 Web 浏览器访问它,然后检查您的 cookie。
<?php
session_start();
?>
你可能会看到这样的东西
Site Cookie Value
mysite.com PHPSESSID 6fktilab3hldc5277r94qh2204
如果生成一个漂亮的、唯一的 id,PHP 会做得很好。对此进行加密没有意义。
永远不要仅仅依靠一个 cookie 或项目来验证您的(登录)用户,这始终是一个好主意。如上所述,最好也存储 IP 并检查它。一个很好的补充是存储 USER_AGENT。
请记住,如果您的应用程序是开源的,那么仅使用会话 id 就可以了,因为黑客可以轻松识别出您正在验证的对象。
会话 ID 相对难以猜测,所以这不是真正的问题。
你可以做一些与此相关的事情来抵消攻击:
还有很多其他的事情。我总是建议研究有关这些问题的Rails 指南——它提供了对已知问题和对策的非常容易理解的解释——所有这些都同样适用于 PHP 代码。
当您使用 cookie 存储敏感信息时,加密 cookie 数据是有意义的。只有服务器应该读取(解密)。
没有理由加密会话 id,因为黑客可以使用加密的会话 id 来冒充他的受害者。