我正在制作一个我希望尽可能安全的登录脚本。问题是,安全似乎是一场永无止境的战斗。因此,从本质上讲,我正在寻找对我的想法的建议和改进。
我拥有的是完全基于 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_cookies
、cookie_httponly
和 cookie_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/