我正在制作一个登录/注销类,用于登录用户,根据用户的选择设置 cookie。用户输入他们的电子邮件/密码,它会检查数据库,电子邮件/密码组合是否存在,创建会话,设置 cookie(使用用户 ID),然后重定向用户...然后我有一个记录用户的功能通过获取保存在该 cookie 中的用户 ID,检查该用户 ID 是否存在,然后再次将用户数据保存在会话中......我想知道是否有人看到这方面有任何潜在的错误/不安全的地方。
简短的例子,我相信你们能明白它的要点......
function login($email, $password, $remember){
// Check the database for email/password combo
if(/*user exists*/){ // if the user exists
$_SESSION = /*User data*/ // save the users data in a session
if($remember){
setcookie('user_id', /*User id*/); // save the user id in a cookie
}
header("location: index.php");// redirect
}
}
function Check_Cookie(){
if(isset($_COOKIE['user_id'])){
return $this->Log_In_ID($_COOKIE['user_id']);
}else{
return false
}
}
function Log_In_ID($id){
//Check the database if the user id exists
if(/*user exists*/){ // if the user exists
$_SESSION = /*User data*/ // save the users data in a session
header("location: index.php");// redirect
}else{
return false;
}
}
这不是我想问的问题的详细示例,但我确信您可以理解它的要点...有人认为这有什么潜在的问题吗?如果你们有任何建议,我很想听听…另外,你们是否使用 oop 来登录用户,或任何其他方式。
如果你的用户 ID 是一个连续的数字,那么这是非常不安全的,因为任何人都可以根据自己的 cookie 更改为另一个看起来合理的数字(例如,如果我的是 1274,我可以尝试该范围内的其他数字)并立即进行欺骗那个用户。
您最好分配一个与该用户关联的临时 ID,例如GUID http://en.wikipedia.org/wiki/Globally_Unique_Identifier。由于 GUID 在天文上是独一无二的并且实际上是防碰撞的,因此几乎不可能从系统外部猜测或预测它们。
当用户登录时,您创建一个新的 GUID 并将其与用户一起存储:
UserID TokenID Expires
1274 {3F2504E0-4F89-11D3-9A0C-0305E82C3301} 9/25/2009 12:00:00
当用户返回时,通过令牌查找其用户 ID,确保令牌未过期并登录。然后更改其令牌。这可以确保您免受以下影响:
- 攻击者无法猜测另一个用户的令牌并欺骗他们
- 无法通过忽略 cookie 的过期日期来规避令牌过期
- 由于令牌不断变化,即使攻击者确实设法获得对用户 cookie 的访问权限,接管的机会窗口也非常小。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)