使用PHP中的会话和cookie创建安全登录

时间:2011-03-25 16:10:54

标签: php security session authentication cookies

我正在制作一个我希望尽可能安全的登录脚本。问题是,安全似乎是一场永无止境的战斗。基本上,我正在寻找对我的想法的建议和改进。

我所拥有的是仅基于会话的登录。只要会话信息发生变化,就会调用session_regenerate_id()来避免明显的劫持尝试。

如果未设置会话,我会检查cookie是否有效登录,并且在成功时,我会更新会话。

我尝试通过添加哈希值以及一段唯一的用户信息(如用户名或ID)来保护cookie。这个哈希由各种信息组成,包括用户名/ id,无法解密的密码哈希,IP地址的一部分等。通过从cookie中提取用户名/ id,我可以从有效的用户信息中创建一个新的哈希并比较使用cookie中的哈希值。我的希望是防止假cookie和cookie劫持(除非他们也欺骗IP地址)。

编辑假设登录本身将通过HTTPS / SSL完成,因此转移(合理)安全。

我是否在正确的轨道上?还有什么办法可以保证我的登录安全?

感谢您的帮助!

5 个答案:

答案 0 :(得分:6)

停止你在做什么。不要检查user-agent或IP地址。用户代理是受攻击者控制的变量,检查此值不会增加此系统的安全性。 IP地址将因合法原因而更改,例如,如果用户位于负载均衡器或TOR之后。

会话ID必须始终为cryptographic nonce。在php中只需调用session_start()然后开始使用$_SESSION超级全局。 PHP会为您完成所有这些工作。如果要改进php的会话处理程序,请使用configurations。启用use_only_cookiescookie_httponlycookie_secure。如果您使用的是* nix系统,那么将entropy_file设置为/dev/urandom也是一个不错的主意,但如果您的操作系统出现问题,则可能会遇到问题。

例如,对用户进行身份验证:

//In a header file
session_start();
...
if(check_login($_POST['user_name'],$_POST['password'])){
   //Primary key of this user
   $_SESSION['user_id']=get_user_id($_POST['user_name']);
   $_SESSION['logged_id']=True;
}

并验证用户是否已登录:

//in a header file
session_start()
...
if(!$_SESSION['logged_id']){
   header("location: login.php");
   die();//The script will keep executing unless you die()
}

要改进此系统,请阅读OWASP A9并在会话的整个生命周期中使用HTTPS。另请阅读OWASP A5:CSRF又名“会话骑行”和OWASP A2:XSS,因为它们都可以用来破坏会话。

答案 1 :(得分:3)

没有安全cookie这样的东西,除非它只通过SSL传输。当使用持久的非会话cookie(比如记住我)时,可以通过完成你正在做的事情来减轻它,但不会像你想要的那样。

您确实可以存储服务器变量,例如用户代理,IP地址等(甚至是JavaScript变量),但它们仅适用于验证持久性cookie数据是否与客户端的新连接匹配。 ip地址不是一个好主意,除非你知道客户端(就像你一样)不会在每个页面加载(a AOL)上改变。

现代网络浏览器和第三方服务(如LastPass)可以存储登录凭据,只需按键(有时甚至不需要)即可将数据发送到登录表单。持久性cookie仅适用于那些拒绝使用其他可用内容的人。最后,不再需要持久的非会话cookie。

答案 2 :(得分:1)

我使用基于cookie的方法(使用setcookie函数),但....

session_start();
...
if(check_login($_POST['user_name'],$_POST['password'])){
   //Primary key of this user
   $_SESSION['user_id']=get_user_id($_POST['user_name']);
   $_SESSION['logged_id']=True;
}

......这些方法很糟糕!!!!

我基于cookie攻击我的网站。

  1. 我使用了WebCruiser漏洞扫描程序的cookie选项,因此我在登录后获取了我的cookie。
  2. 然后我更改了cookie上的简单值
  3. 然后我点击了保存cookie。
  4. 此时我点击了webbrowser,在左侧面板上看到然后我点击了然后我点击了刷新页面,所以我得到了我的管理页面而没有使用带有用户和密码的登录页面。
  5. 因此,如果有人向您推送病毒以阅读IE或Firefox的cookie历史记录,您会很高兴找到您的管理员用户并且其他人可以使用该传递。

    那么如何解决这个问题呢?简单:将cookie与会话服务器或会话的cookie与会话服务器,或与文件会话的会话,或与文件会话的cookie组合.... 会很安全但很慢:(((

答案 3 :(得分:0)

我将所有登录数据保存在用户会话中,这样就是所有存储的服务器端。

我在客户端cookie中存储的唯一内容是“自动登录”,“会话ID”

等内容

答案 4 :(得分:0)

会话比cookie更安全 我的建议是为当前尝试的登录创建一个唯一的ID 喜欢:

$id = uniqid();
$_SESSION['username'.$id] = "something ...";