我有一个网站,我使用会话登录。在我的管理的每个页面,我有一个检查器,如果用户已经登录或没有。我有这个代码
if(!$_SESSION['loggedin'] && !$_SESSION['userid'])
{
header('Location:login.php');
}
else
{
//proceed loading the page
}现在发生了什么,有人在搞乱我们的网站。他/她在网站上输入一些粗俗的文本,比如...所有不敬的话和它是如此令人沮丧,因为网站是对公众可访问的。我相信用户名和密码被黑了。因此,我要求所有管理员用户更改所有密码,并添加了一个日志记录器来监控谁将更新网站内容。我记录了登录用户的userid和它的帖子。更改密码后,同样的事情再次发生,内容被黑客或其他人更新。
我检查了我的日志,黑客的用户id是0。这怎么可能?我该怎么阻止他?这让我想知道他做了什么,因为根据我在页面顶部的条件,如果$_SESSION‘’userid‘没有值,它应该将它们重定向到登录页面。
现在我把网站下线了,因为黑客越来越厉害了。我找到了它的ip地址。
这是我的用户身份验证
$user=trim($_POST['username']);
$pass=trim(stripslashes($_POST['password']));
$sql="SELECT * FROM users WHERE user='$user' AND pass='$pass'";
$qry=mysql_query($sql) or die (mysql_error());
if( mysql_num_rows($qry) )
{
$row=mysql_fetch_assoc($qry);
$_SESSION['userid'] =$row['userid'];
$_SESSION['loggedin']=1;
header('Location: welcome.php');
}
else
{
header('Location:login.php?error=1');
}发布于 2012-06-27 08:31:58
正如@nhahtdh所观察到的,您有一个明显的SQL注入。想想看,如果有人在你的用户名字段中输入admin' OR 1=1; --会发生什么(是的,人们确实会尝试这样的事情)。您的SQL字符串将转换为如下形式:
SELECT * FROM users WHERE user='admin' OR 1=1; -- AND pass='junk'它将从您的用户表中选择所有用户。假设0的userid是SQL表中的第一个userid。
请看一下this excellent answer,它解释了如何避免SQL注入。
发布于 2012-06-27 00:51:46
确保总是在Header('Location: ...')调用之后调用exit。否则,脚本将在头调用后继续执行。在对浏览器的header调用之后,它将继续发送所有内容,但常规浏览器将看到location标头并执行重定向。不太友好的用户可能会绕过位置呼叫,可以随心所欲地浏览您的“受保护”页面!
所以,不要忘记总是立即结束执行:
header('Location:login.php');
exit;https://stackoverflow.com/questions/11212175
复制相似问题