2013-05-01 73 views
1

我有下面的登录脚本,我认为这是安全的。但是,有人不断访问网站的管理部分并更改内容。登录不断被黑客入侵

if(isset($_POST['submit'])) { 
$error = false; 
$user_login = stripslashes(strip_tags(htmlentities($_POST['user_login']))); 
$pass_login = stripslashes(strip_tags(htmlentities($_POST['pass_login']))); 
if(!empty($user_login) && !empty($pass_login)) { 
    $check_details=mysql_query("SELECT * FROM `admin` WHERE email='".$user_login."' AND password='".md5($pass_login)."'"); 
    $status=mysql_num_rows($check_details); 
    if($status >= "1") { 
     $error = false; 
     $_SESSION['wmmadmin_loggedin'] = "1"; 
     $_SESSION['wmmadmin_email'] = "".$user_login.""; 
     header("Location: ./index.php"); 
    } 
    if(!$status || $status == "0") { 
     $error = true; 
     echo "<div id=\"error\"><strong>Error!</strong><br />Login details were incorrect.</div>\n"; 
    } 
} 
if(empty($user_login) || empty($pass_login)) { 
    $error = true; 
    echo "<div id=\"error\"><strong>Error!</strong><br />Enter your username and password.</div>\n"; 
} 

}

在每个脚本的顶部有一个函数调用:

function checkloggedin() { 
if($_SESSION['wmmadmin_loggedin'] == "0" || $_SESSION['wmmadmin_loggedin'] !== "1" ||  $_SESSION['wmmadmin_email'] == "") { 
header("Location: login.php"); 
exit; 
} 
} 

我缺少的东西?我需要阻止这些黑客!

感谢 皮特

+18

您可以[SQL注入](http://stackoverflow.com/q/60174)。谜团已揭开。 – 2013-05-01 16:12:42

+1

您需要使用非弃用函数**(NOT'mysql _ *)重写** ** – brbcoding 2013-05-01 16:13:30

+3

Phew,'stripslashes(strip_tags(htmlentities($ str)))'是一个有趣的函数 - 您从哪里得到的? '':-)。使用'mysql_real_escape_string($ str)'代替([see here](http://php.net/manual/en/function.mysql-real-escape-string.php))。 – halfer 2013-05-01 16:14:19

回答

11

有人可能会发送以下为user_login

user_login="nobody' OR 1 OR email='nobody" 

这将导致查询

… WHERE email='nobody' OR 1 OR email='nobody' AND password='…' 

这被解释为

… WHERE email='nobody' OR 1 OR (email='nobody' AND password='…') 

因为中间部分是真的(1对MySQL意味着真实),所有事情都是真实的,并且授予访问权限。这是一种传统的SQL注入攻击。

+1

为了扩大这个答案,使用PDO和准备语句是防止这种情况的好方法。我在这里发布了一个例子:http://stackoverflow.com/questions/7246389/php-that-is-return-an-json-array-is-showing-up-as-null-in-javascript/7259534#7259534 – CountMurphy 2013-05-01 16:25:24

4

让我们来看看如何正确违反逃逸的规则方面:

$user_login = stripslashes(strip_tags(htmlentities($_POST['user_login']))); 

假设用户名中包含HTML标记。 <>将首先转换为实体:&lt;&gt;

然后strip_tags()尝试过滤标签 - 但没有!无用的函数调用。

然后你想删除斜杠。有没有?这个函数调用只有在你的PHP中仍然启用了魔术引号的情况下才有用,你应该检查它们是否是,而不是盲目删除它们。

htmlentities()只会将双引号转换为实体,而不是单引号。而你的SQL使用单引号来终止字符串。所以使用的整个函数仍然可以让SQL注入。

不要自己发明安全功能。在SQL中使用mysql_real_escape_string()和双引号,并保存。或者使用mysqli或PDO使用预先准备好的语句。