php - 网站被黑的用户名、附加信息和密码已更改问题?

标签 php mysql htmlpurifier

<分区>

我想知道是什么让用户入侵了我的网站,他们更改了我的用户名、个人信息和密码。有人可以给我一些建议吗?我正在使用 PHP MySQL 和 HTMLPURIFIER。

这是登录脚本。

<?php
if (isset($_POST['submitted'])) { // start of submit conditional.
    require_once (MYSQL);

    // Validate the username or email address:
    if (!empty($_POST['login']) && strlen($_POST['login']) <= 255) {
        $e = mysqli_real_escape_string($dbc, $purifier->purify(strip_tags($_POST['login'])));
    } else if(!empty($_POST['login']) && strlen($_POST['login']) >= 256) {
        $e = FALSE;
        echo '<p>Your username or email address cannot exceed 255 characters!</p>';
    } else {    
        $e = FALSE;
        echo '<p>You forgot to enter your username or email address!</p>';
    }

    // Validate the password:
    if (!empty($_POST['pass']) && strlen($_POST['pass']) <= 255) {
        $p = mysqli_real_escape_string($dbc, $_POST['pass']);
    } else if(!empty($_POST['pass']) && strlen($_POST['pass']) >= 256) {
        $p = FALSE;
        echo '<p>Your password cannot exceed 255 characters!</p>';
    } else {
        $p = FALSE;
        echo '<p>You forgot to enter your password!</p>';
    }

    if(($e != FALSE) && ($p != FALSE)) { // check pass
        $pass_salt = "SELECT users.password, users.salt FROM users JOIN contact_info ON contact_info.user_id = users.user_id WHERE (contact_info.email = '" . $e . "' OR users.username = '" . $e . "') AND users.active IS NULL";
        $ph = mysqli_query($dbc, $pass_salt) or trigger_error("Query: $pass_salt\n<br />MySQL Error: " . mysqli_error($dbc));

        while($row = mysqli_fetch_array($ph)){ 
            $password = $row['password'];
            $salt = $row['salt'];
        }

        if(!empty($salt)) {
            $sha512 = hash('sha512', $p . $salt);
        }

        if(!empty($password) == !empty($sha512)){
            $user_pass = TRUE;
        } else {
            $user_pass = FALSE;
        }
    }


    if(isset($user_pass) && ($user_pass == TRUE) && !empty($salt)) { // If everything's OK.
        // Query the database:
        $q = "SELECT users.user_id, users.first_name, users.user_level FROM users JOIN contact_info ON contact_info.user_id = users.user_id WHERE (contact_info.email = '" . $e . "' OR users.username = '" . $e . "') AND users.password = '" . $sha512 . "' AND users.active IS NULL";        
        $r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));


        if (@mysqli_num_rows($r) == 1) { // A match was made.

            // Register the values & redirect:
            $_SESSION = mysqli_fetch_array ($r, MYSQLI_ASSOC); 
            // check if user is logged in then update the old login date
            $u = "UPDATE users JOIN contact_info ON contact_info.user_id = users.user_id SET users.last_login = NOW(), users.deletion = 0, users.deletion_date = NULL WHERE (contact_info.email = '" . $e . "' OR users.username = '" . $e . "') AND users.password = '" . $sha512 . "' AND users.active IS NULL"; 
            // save the info to the database
            $r = mysqli_query ($dbc, $u);
            mysqli_free_result($r);
            mysqli_close($dbc);

            $url = BASE_URL . 'home/index.php'; // Define the URL:
            header("Location: $url");
            exit(); // Quit the script.

        } else { // No match was made.
            echo '<p>Either your username, email address or password entered do not match those on file or you have not yet activated your account.</p>';
        }

    } else { // If everything wasn't OK.
        echo '<p>Please try again.</p>';
    }

    mysqli_close($dbc);

} // end of submit conditional.
?>

最佳答案

您应该了解 SQL 注入(inject)。这是我首先想到的(注意 MySql 的使用)。为防止这种情况,您必须使用 mysql_real_escape_string() 清理用户输入(不同的 mysql_escape_string() 被认为已弃用)。尽管有这个解决方案,我还是建议你使用 PDOMysqli (我通常不鼓励这个)为了通过使用 Prepared Statements 来修复 SQL 注入(inject)问题。 .

那么您可能应该知道 XSS(跨站点脚本)可能会在您的代码中“注入(inject)”某种恶意 Javascript 脚本。您可以使用 htmlspecialchars() 稍微解决这个问题使 HTML 标签(例如 <script>)不被视为 HTML 标签。

也看看这个Vulnerability list for PHP .

附言

为了使您的代码更具可读性和“正确性”,我建议您更改 strlen($_POST['login']) >= 256进入strlen($_POST['login']) > 255这是相同的,但让读者立即明白真正的限制不是 256但是255 .

关于php - 网站被黑的用户名、附加信息和密码已更改问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5584337/

相关文章:

php - 错误的静态方法

mysql - SQL 中的字符串操作

php - 加载数据本地 INFILE php mysql

php - 带有脚本标签的 tinyMCE 发布代码?

php - 如何集成 HTML Purifier 来过滤用户提交的数据?

php - HTML Purifier 做了哪些安全 PHP 编程做不到的事情?

javascript - 如何通过 AJAX 将 html 从 javascript 传递到 php。

javascript - 如何从js调用php方法?

PHP/MySQL 多维/关联数组 3 试算表

mysql - 按公共(public)字段对多个 Mysql 查询进行排序