【发布时间】:2017-07-09 22:32:50
【问题描述】:
PHP 登录系统后,我正在努力进行登录和用户验证。我知道基础知识,但我不确定我是否做得对。我会试着一步一步解释。
- 我有一个用户名和密码表单。
- 用户输入他们的登录名和密码后,我使用
LDAP身份验证来授权他们。如果身份验证通过,那么我需要开始新的会话。 -
新会话(这就是我苦苦挣扎的地方)。
if ($validation->ldap_authentication()) { $session = new session(); $session -> login($validation->getUsername(), $validation->logedAs(), $validation->getSID()); if($session->validate_login()) { exit(header('Location:index2.php')); } else { echo 'error'; } }
还有我的session class:
class session
{
public function __construct()
{
if(!isset($_SESSION))
{
session_name(SESSIONNAME);
ob_start();
session_start();
} else {
session_regenerate_id(true) ;
}
}
public function login($sessionUserName, $logedAs, $sid)
{
$_SESSION['logedUserName'] = isset($sessionUserName) ? $sessionUserName : null;
$_SESSION['logedAs'] = isset($logedAs) ? $logedAs : null;
$_SESSION['sid'] = isset($sid) ? $sid : null;
}
public function validate_login()
{
if (!isset($_SESSION['logedUserName']) || (trim($_SESSION['logedUserName']) == '') ||
!isset($_SESSION['logedAs']) || (trim($_SESSION['logedAs']) == '') ||
!isset($_SESSION['sid']) || (trim($_SESSION['sid']) == '')
)
{
return false;
} else {
return true;
}
}
}
- 所以在其他页面中我需要开始一个类
session(再次)并验证validate_login()? - 对我来说,它看起来真的很糟糕的身份验证。
我需要添加和改进什么?
我已经在网上搜索过,但找不到答案,也不知道我究竟需要改进什么。
【问题讨论】:
-
第一:我不明白你为什么只在没有设置会话时才做
ob_start()?第二个session_regenerate_id()每个请求只应调用一次,您的代码在sessionstackoverflow.com/questions/22965067/… 的每个新实例上执行此操作 -
我建议你先了解一下会话的概念。您需要做的就是检查会话是否存在,如果不重定向到登录屏幕,如果是,则重定向到索引或您想要的任何地方。您可以添加一个检查,如果
$_SESSION['logedUserName']为空,则登录屏幕,否则继续。 -
@JustOnUnderMillions 所以如果我明白我需要打电话
session_regenerate_id(true)如果 validate_login 是真的? -
并非如此,您可以使用
session_regenerate_id(true)来进一步保护您的会话,但这并不是真正需要的。阅读上面链接中的 QA。 -
@user3686909 或者更好:如果你使用
session_regenerate_id(true) ;,下一页请求会获得一个带有新 id 的新会话 cookie。所以会话不能被黑客入侵。因此,无论用户是否登录,每次请求都可以执行一次session_regenerate_id(true) ;。希望能说明这一点。
标签: php html authentication ldap