0

我有以下登录脚本,我认为它是安全的。但是,有人不断访问网站的管理部分并更改内容。

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

我错过了什么吗?我需要阻止这些黑客!

谢谢皮特

4

3 回答 3

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 注入攻击。

于 2013-05-01T16:19:23.153 回答
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 使用准备好的语句。

于 2013-05-01T16:29:31.793 回答
0

您需要清理 $user_login 和 $pass_login ,而不仅仅是检查它们是否为空。有人可以在其中传递 SQL 代码,并进行 sql 注入攻击。

见这里: http: //php.net/manual/en/security.database.sql-injection.php

于 2013-05-01T16:16:10.203 回答