PHP - 会话安全性和可靠性
PHP - Sessions security and reliability
我目前正在学习 PHP,我想出了一个关于 Sessions 的问题。在做这个 post 之前,我已经阅读了一些关于这个主题的信息和主题,例如 this one,但是其中大部分都有些老了,所以我想确保我'我以正确的方式处理它们。
所以,这是我的问题:假设以下各项为真,
- 登录后,我正在使用
session_regenerate_id()
重新生成 PHP 会话 ID;
- 登录后,我正在创建一个带有加密代码的会话变量(在开始和结束时结合了用户 IP、浏览器和一些随机内容)
$_SESSION['check'] = hash('ripemd128', $rand1 . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] . $rand2)
.
该值被发送到数据库,在每一页中,我都在检查数据库中的值是否与 $_SESSION['check']
变量匹配;
- 我强制用户通过
ini_set('session.use_only_cookies', 1)
启用 cookie,并且 ini_set('session.use_trans_sid', 0)
也已设置;
- 注销后,我使用以下代码:
$_SESSION = array();
setcookie(session_name(), '', time()-259200, '/');
session_unset();
session_destroy();
这样,假设放入会话变量的值得到了正确验证,我可以 100% 信任我的会话变量吗?如果不是,我可以 improve/change 怎样让他们更安全?
我问这个问题的原因是当用户登录时,我将一些信息保存到会话变量中以避免查询数据库过载,所以我需要确保它们不会被泄露。
谢谢。
带有散列(不是"encripting"!)用户代理和带有一些随机值的IP的整个舞蹈和歌曲是非常多余的。我也看不到在每次请求时都用它来打扰数据库的意义。
那有什么用,你想阻止什么?如果有的话,你想防止会话劫持。让我们详细看一下:
- 会话劫持意味着中间人或其他第 3 方能够窃取用户的会话 cookie。您可以简单地使用 HTTPS 来防止这种情况发生,这是您唯一可以做的事情。
- 如果用户计算机上的某些恶意软件窃取了 cookie 而不是 MitM,则 HTTPS 无济于事。在那种情况下,攻击者可能完全坐在别处。在这种情况下,检查 IP 会有所帮助。检查用户代理在很大程度上是多余的,因为它很容易被模仿。
- 要检查 IP,您只需将 IP 直接存储在会话中并执行一个简单的
if ($_SESSION['ip'] !== $_SERVER['REMOTE_ADDR'])
;哈希不会向该过程添加任何内容。
- 请注意,IP 可能会突然合法地更改,这会使登录无效。
- 请注意,能够窃取某人 cookie 的恶意软件也可能直接从用户自己的计算机上冒充用户,在这种情况下,任何类型的检查都无济于事。
底线:任何形式的额外检查和保护都是无用的。如果您使用的是 HTTPS,并且有人仍然 能够劫持会话,那么无论哪种方式,您基本上都是 SOL。不要打扰。如果您不使用 HTTPS,请立即开始使用它。
我目前正在学习 PHP,我想出了一个关于 Sessions 的问题。在做这个 post 之前,我已经阅读了一些关于这个主题的信息和主题,例如 this one,但是其中大部分都有些老了,所以我想确保我'我以正确的方式处理它们。
所以,这是我的问题:假设以下各项为真,
- 登录后,我正在使用
session_regenerate_id()
重新生成 PHP 会话 ID; - 登录后,我正在创建一个带有加密代码的会话变量(在开始和结束时结合了用户 IP、浏览器和一些随机内容)
$_SESSION['check'] = hash('ripemd128', $rand1 . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] . $rand2)
.
该值被发送到数据库,在每一页中,我都在检查数据库中的值是否与 $_SESSION['check']
变量匹配;
- 我强制用户通过
ini_set('session.use_only_cookies', 1)
启用 cookie,并且ini_set('session.use_trans_sid', 0)
也已设置; - 注销后,我使用以下代码:
$_SESSION = array();
setcookie(session_name(), '', time()-259200, '/');
session_unset();
session_destroy();
这样,假设放入会话变量的值得到了正确验证,我可以 100% 信任我的会话变量吗?如果不是,我可以 improve/change 怎样让他们更安全?
我问这个问题的原因是当用户登录时,我将一些信息保存到会话变量中以避免查询数据库过载,所以我需要确保它们不会被泄露。
谢谢。
带有散列(不是"encripting"!)用户代理和带有一些随机值的IP的整个舞蹈和歌曲是非常多余的。我也看不到在每次请求时都用它来打扰数据库的意义。
那有什么用,你想阻止什么?如果有的话,你想防止会话劫持。让我们详细看一下:
- 会话劫持意味着中间人或其他第 3 方能够窃取用户的会话 cookie。您可以简单地使用 HTTPS 来防止这种情况发生,这是您唯一可以做的事情。
- 如果用户计算机上的某些恶意软件窃取了 cookie 而不是 MitM,则 HTTPS 无济于事。在那种情况下,攻击者可能完全坐在别处。在这种情况下,检查 IP 会有所帮助。检查用户代理在很大程度上是多余的,因为它很容易被模仿。
- 要检查 IP,您只需将 IP 直接存储在会话中并执行一个简单的
if ($_SESSION['ip'] !== $_SERVER['REMOTE_ADDR'])
;哈希不会向该过程添加任何内容。 - 请注意,IP 可能会突然合法地更改,这会使登录无效。
- 请注意,能够窃取某人 cookie 的恶意软件也可能直接从用户自己的计算机上冒充用户,在这种情况下,任何类型的检查都无济于事。
底线:任何形式的额外检查和保护都是无用的。如果您使用的是 HTTPS,并且有人仍然 能够劫持会话,那么无论哪种方式,您基本上都是 SOL。不要打扰。如果您不使用 HTTPS,请立即开始使用它。