繁体   English   中英

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

[英]Creating a secure login using sessions and cookies in PHP

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

我所拥有的是仅基于会话的登录。 无论何时会话信息发生更改,都会调用session_regenerate_id()以避免明显的劫持尝试。

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

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

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

我是在正确的轨道上吗? 还有什么可以保证我的登录?

谢谢您的帮助!

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

会话ID必须始终是加密随机数 在php中只需调用session_start()然后开始使用$_SESSION超级全局。 PHP会为您完成所有这些工作。 如果要改进php的会话处理程序,请使用配置 启用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,因为它们都可以用来破坏会话。

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

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

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

我使用基于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;
}

......这些方法都是wrooooong !!!!

我基于cookie攻击我的网站。

  1. 我使用了WebCruiser漏洞扫描程序的cookie选项,所以我在登录后获取了我的cookie。
  2. 然后我改变了cookie的简单值
  3. 然后我点击了保存cookie。
  4. 此时我点击了左侧面板上的webbrowser然后我点击了然后我点击了刷新页面,所以我得到了我的管理页面,没有使用带有用户和密码的登录页面。

因此,如果有人向您推送病毒以阅读IE或Firefox的cookie历史记录,您将很乐意找到您的管理员用户,并且其他人可以使用通行证。

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

SESSION比cookie更安全,我的建议是为当前登录尝试创建一个唯一的ID,例如:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM