1

我有一个网站,我使用会话进行登录。在我的管理员的每个页面中,我都有一个检查用户是否登录的检查器。我有这个代码

if(!$_SESSION['loggedin'] && !$_SESSION['userid'])
{
  header('Location:login.php');
}
else
{
 //proceed loading the page
}

现在发生了什么,有人在搞乱我们的网站。他/她在网站上输入了一些粗俗的文字,比如......所有不尊重的词语,因为该网站可供公众访问,所以令人沮丧。我相信用户名和密码被黑客入侵了。因此,我要求所有管理员用户更改所有密码,并添加了一个记录器来监控谁将更新网站内容。我记录了登录用户的用户 ID 及其帖子。更改密码后,同样的事情再次发生,内容被黑客或任何人更新。

我检查了我的日志,黑客的用户 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');
}
4

2 回答 2

4

确保在通话后始终调用exitHeader('Location: ...')。否则脚本将在标头调用后继续执行。它会在调用浏览器后继续发送所有内容header,但常规浏览器会看到位置标头并进行重定向。不太好的用户可能会绕过位置调用,并可以随意浏览您的“受保护”页面!

所以,不要忘记总是 立即结束执行:

header('Location:login.php');
exit;
于 2012-06-26T16:51:46.390 回答
3

正如@nhahtdh 所观察到的,您有一个明显的 SQL 注入。考虑一下如果有人在admin' OR 1=1; --您的用户名字段中输入会发生什么(是的,人们确实尝试过这类事情)。您的 SQL 字符串将被转换为如下内容:

SELECT * FROM users WHERE user='admin' OR 1=1; -- AND pass='junk'

这将从您的用户表中选择所有用户。0的userid值大概是useridSQL 表中的第一个。

请看一下这个解释如何避免 SQL 注入的优秀答案。

于 2012-06-27T00:31:57.727 回答