如何进行安全会话?

时间:2017-08-30 10:18:32

标签: php session

对于我的自定义框架,我让用户登录并设置会话,如下所示:

FragmentAdapter

所有内容都存储在数据库中,密码以BCRYPT进行哈希处理。除此之外,我强制使用SSL,这样用户就无法通过普通的http访问网站。

这种方法安全吗? 如果不;什么是安全漏洞,我可以做些什么来使这更安全?

2 个答案:

答案 0 :(得分:1)

首先,要获取会话ID,您应该使用session_id()$_SESSION['id']将抛出一个未定义的偏移异常,除非您在该值下放置一些东西。

您不应使用会话ID来评估用户是否经过身份验证,因为它始终会评估为TRUE。当您开始会话时,会话ID将始终存在,您应该在成功验证后将您的用户存储在会话中,例如$_SESSION['auth_user'] = get_user_from_db()然后使用它来评估用户是否经过身份验证:

if (isset($_SESSION['auth_user'])) {
    // Your logic
}

阅读this post了解身份验证最佳做法。

简而言之,您的会话cookie只能通过http访问,您应该像您一样强制使用安全的cookie。每次用户获得权限时(例如,在成功进行身份验证后),您都应该重新生成会话ID。

您需要实施CSRF保护机制。

您应该实施登录限制(在用户在特定时间段(例如1分钟)内有X次失败登录尝试后超时)以防止暴力攻击。

答案 1 :(得分:0)

最佳方法始终是在登录屏幕上,并立即登录强制使用随机数生成新会话ID

session_start();
$newsessid = somerandomnumberfunction();
session_id($newsessid);

您还可以使用session_regenerate_id()函数生成新ID

session_start();
session_regenerate_id();

此外,确保每个有效会话都是针对ip检查的。一种好的方法是将会话ID和远程ip信息存储在表中,或者在用户登录后更好地将ip存储为会话变量,并确保为了安全性而继续保留页面。当用户使用相同的办公室或共享网络时,这种情况不会起作用,因为对外界的ip是相同的。

https 对于敏感网站来说总是一个好主意,但如果你真的想要一个万无一失的系统,那么对所有使用会话的页面保持持久是非常重要的,否则任何人都可以随时嗅探你的数据包。

  

P.S根据我的知识,你的方法是安全的。

一些提示:

  • 确保您始终在a上使用新的自生成会话ID 成功登录尝试。
  • 尝试设置session.use_only_cookies = 1并检查是否一切正常 细。
  • 始终使用https,以确保没有人可以嗅探您的会话 标识。
  • 存储会话ID,远程IP信息并进行比较 页
  • /etc/php5/apache2/php.ini 文件中设置session.use_trans_sid = 0