$ _SESSION ['user_id']足以检查PHP中的登录?

时间:2011-06-29 13:33:51

标签: php authentication login

当用户登录网站时,我只会在SESSION中保存user_id以便稍后检查用户是否登录。

if(!empty($_SESSION['user_id'])){
  ....

这足以保障安全吗?

6 个答案:

答案 0 :(得分:12)

这完全取决于该变量如何进入会话以及您管理会话的程度。

在处理网站安全性和用户凭据时,始终要考虑的一个案例是用户可能会在公共环境中登录您的网站然后离开。他会在多长时间内登录?已登录时敏感信息的可访问性如何?

如果您的会话超时时间相对较短,并确保您正在管理使其成为$ _SESSION ['user_id']的内容,那么这是一种合理的方法。实际检查$ _SESSION ['user_id']中的内容可能会更好,但这不会比你现在拥有的内容有很大改进。

我建议考虑的主要问题是,如果用户想要更改其帐户的详细信息/访问过度敏感的数据,则需要再次请求登录凭据(您不希望陌生人更改用户的登录名你会?)。虽然这对普通用户来说可能有点麻烦,但它肯定会为您的应用程序增加一个很好的安全措施。

答案 1 :(得分:7)

只有在有人有权访问会话文件时才能更改该值。

通常

但我宁愿使用isset()

function loggedIn()
{
  if (isset($_SESSION['user_id']) && is_numeric($_SESSION['user_id']))
    return true;
  return false;
}

因为如果用户ID为0,empty()也将返回true!

答案 2 :(得分:1)

如果您位于共享托管环境中,则同一服务器上的其他人可能会创建有效的会话并获得访问权限。

或者,有人可能会在您的某个用户访问该网站时嗅探网络流量,并且可能会抓住Cookie并获得对其帐户的访问权限,因为您只使用简单的基于会话的身份验证。

解决此问题的常用方法是创建数据库表(可能称为“会话”),并记录会话ID,IP地址以及用户首次登录时要收集的任何其他特定于用户的数据。然后,您可以反复检查此会话表,以帮助确保它确实是登录的原始用户而不是其他人。

答案 3 :(得分:0)

这取决于......

如果你从未做过类似$ _SESSION ['user_id'] = $ _GET ['user_id']的事情,你通常会说:它是保存。

但有会话劫持,跨站点脚本,跨站点请求伪造等等。

答案 4 :(得分:0)

使用

if(!isset($_SESSION($user_id){

因为如果$ user_id == 0则isempty()将无效并且确保在页面结束后必须取消设置另一页面上不需要的会话以获得更好的安全性。取消设置特定会话变量的方法是

unset($_session_variable_name);

并且会在需要时(即用户注销时)销毁会话。

由于

答案 5 :(得分:-1)

实际上,除上述评论外,您还应进一步检查IP地址或USER_AGENT等属性,以避免会话劫持。

相关问题