【发布时间】:2016-03-01 23:29:59
【问题描述】:
我正在运行一个简单的服务,用户必须登录才能操作特殊功能。
我的 MySQL 数据库存储 username、password 和 user_id。
当用户想要登录时,他们必须提供他们的用户名和密码,这些用户名和密码会发布到 profile.php。
profile.php 做了一个简单的检查:
// Sanity Check
if(empty($_POST['smart_email'])|| empty($_POST['smart_password']))
{
echo 'Sorry, wrong login/passwd';
exit;
}
else
{
//
$smart_email = $_POST['smart_email'];
$smart_password=$_POST['smart_password'];
// Check if registerd and password matches
if(DB_IsAuthorized($smart_email, $smart_password) == true)
{
// Obtain proper UserID from the database
$UserID = DB_GetId($smart_email);
// set the session user_id variable
$_SESSION['user_id'] = $UserID;
//
// Display the User profile page
//
}
}
从那时起,每个与用户相关的页面都会检查 user_id 在 $_SESSION 中设置的内容,以了解该用户是否已登录并获得授权。
if (isset($_SESSION['user_id']) && is_numeric($_SESSION['user_id']) && $_SESSION['user_id']>0)
{
// USER IS LOGGED IN
}
问题是:$_SESSION['user_id'] 检查是否足以保护非登录用户的页面?
【问题讨论】:
-
其实,是的,够了。但如果没有任何其他措施,您的访问者很容易受到大多数攻击他们的帐户的影响。我可以建议您使用框架并获取 ssl 证书来制作 https。不要贬低它!创建框架的人有很多经验!顺便说一句 - 我喜欢 Yii,它相当简单 :)
-
在保护您网站上的网页方面,我认为可以做到的还远远不够。不过,我认为一般来说一个简单的
$_SESSION检查就足够了。 -
也许我一开始就跑题了。您是否在询问使用
$_SESSION是否允许您阻止未登录用户的内容;或$_SESSION的安全程度以及进入暴力攻击、劫持等领域。 -
就其本身而言没关系 - 但正如 chris85 所说,您需要检查并确保人们没有使用它来暴力破解用户帐户。每当我登录用户时,我都会记录时间和 IP。之后每次我检查我的会话变量时,我还会检查该帐户是否没有更新的登录,并且 IP 没有更改。如果有,通常我会终止两个会话并强制用户再次登录。这增加了一个额外的障碍,因为攻击者无法通过劫持现有会话来采取行动——他们需要知道用户名并通过。