网站安全漏洞


Website security hole

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

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');
}

确保始终在Header('Location: ...')呼叫后调用 exit。否则,脚本将在标头调用后继续执行。它将继续在header调用后向浏览器发送所有内容,但常规浏览器将看到位置标头并执行重定向。不太好的用户可以绕过位置呼叫,并可以随心所欲地浏览您的"受保护"页面!

因此,不要忘记始终立即结束执行:

header('Location:login.php');
exit;

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

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

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

请看一下这个很好的答案,它解释了如何避免SQL注入。