php - 在 PHP 中使用 session 和 cookie 创建安全登录

标签 php security session authentication cookies

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

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

当未设置 session 时,我会检查 cookie 以获取有效登录,如果成功,我会更新 session 。

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

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

我走在正确的轨道上吗?还可以采取哪些措施来保护我的登录?

感谢您的帮助!

最佳答案

停止你正在做的事情。不要检查 user-agent 或 ip 地址。用户代理是攻击者控制的变量,检查这个值不会增加这个系统的安全性。 IP 地址会出于合法原因而更改,例如如果用户在负载平衡器或 TOR 后面。

session ID 必须始终是 cryptographic nonce .在 php 中只需调用 session_start() 然后开始使用 $_SESSION super 全局。 PHP 会为您处理所有这一切。如果你想改进 php 的 session 处理程序,请使用 configurations .启用 use_only_cookiescookie_httponlycookie_secure。如果您使用的是 *nix 系统,那么将 entropy_file 设置为 /dev/urandom 也是一个好主意,但如果您使用的是 Windows,那么您就有麻烦了。

例如验证用户:

//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 并在 session 的整个生命周期内使用 HTTPS。另请阅读 OWASP A5:CSRF 又名“session riding”和 OWASP A2:XSS,因为它们都可以用来破坏 session 。

关于php - 在 PHP 中使用 session 和 cookie 创建安全登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5435068/

相关文章:

php - Laravel 中非常缓慢的 Eloquent 插入/更新查询

angularjs - 在基于浏览器的应用程序中,我在哪里存储 OAuth 刷新 token

security - Spring Boot 多重认证适配器

php - 检查用户代理并在 session 类中重新生成 session ID

PHP:::速度测试:::$_SESSION:::unset() 与空白字符串

javascript - 如何解决同位素中的追加设计问题?

php - Mysql显示汉字

php - 如何在数据库中保存 HTML

php - 如何使用 Like % 运算符避免 SQL 查询中的 SQL 注入(inject)。只有 php mysql

php - 是否可以伪造 PHP session ID?