Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 网站黑客用户名,附加信息和密码更改问题?_Php_Mysql_Htmlpurifier - Fatal编程技术网

Php 网站黑客用户名,附加信息和密码更改问题?

Php 网站黑客用户名,附加信息和密码更改问题?,php,mysql,htmlpurifier,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 (

我想知道是什么允许用户入侵我的网站,他们更改了我的用户名、个人信息和密码。有没有人能给我一些关于它可能是什么的建议。我正在使用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注入。这可能就是他们所做的。这通常是由执行的输入字段引起的。执行此操作的人只需键入SQL命令

你可以看到这方面的细节


哦,欢迎来到StackOverflow.com!我希望你喜欢这个网站

除了DalexL答案之外,请检查您是否有连接到数据库的强密码。

您应该知道SQL注入。这是我首先想到的(注意到MySql的使用)。为了防止出现这种情况,您必须使用
mysql\u real\u escape\u string()
(不同的
mysql\u escape\u string()
,它被认为是不推荐使用的)。尽管有这种解决方案,我还是建议您使用or(我通常不鼓励使用这种方法),以便通过使用来修复SQL注入问题

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

再看看这个

p.S.


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

,我很确定这不会发生在原始海报上,但欺骗性的公司会向有网站的公司发送“账单”。“账单”上的细则将域名从公司转移到了欺诈公司


这里有一个例子:

如果您允许用户上传图像,您可能是GIF漏洞的受害者。如果您的服务器设置不安全,则查看包含嵌入式PHP代码的GIF将执行代码。检查您的系统中是否可以找到任何.gif.php(或.php.gif)文件,如果黑客忘记自己清理,这些文件可能仍然存在。

如果针对所有面向db的输入正确实现了HTMLPURIFIER,那么您应该评估如何传输登录。您是否在客户端提交之前进行预哈希


我会假设原因是表单上有未过滤的输入,它允许一些SQL注入代码通过。

有没有办法让我知道黑客是在我的网站上执行的?同意这是最有可能的攻击,尽管没有更多信息,我对此不能肯定。可能是XSS或XSSRF攻击。至于看它是在哪里执行的,你必须查看你的代码并找到任何注入点。你最好的办法是浏览你的web服务器的日志。HTMLpurifier不应该处理这个问题吗?当浏览日志时,我应该查找什么?你能提供一个代码示例吗?你希望登录的代码是什么脚本?@asaf,看看我的答案。它争论使用SQL注入和XSS这两个主要漏洞,在我诚实的观点中,这两个漏洞都是存在的。另外,您似乎正在使用PHP5,所以PDO建议对您来说确实是一个不错的选择。“请为我做一个安全审计。”-嗯,不,谢谢。HTMLpurifier的可能副本应该会解决XSS问题吗?我不知道,但我想是的。我敢打赌,他们使用了SQL注入思想,只有使用PDO而不是Mysqli(或我个人不喜欢的准备语句的Mysqli函数)才能真正解决问题。@asaf,这个答案解决了你的问题吗?我认为
mysql\u real\u escape\u string()
应该可以防止几乎任何类型的mysql注入。在
mysql\u real\u escape\u string()
上是否有可用于注入SQL的情况,但在PDO上没有?作为记录,我也建议使用PDO,因为它使编写安全查询变得更加容易和整洁。这里引用:“换句话说,它们可以诱使您的程序运行多个任意SQL语句,而不仅仅是您想要的语句。转义引号应该可以防止这种情况。但使用准备好的语句更彻底。”()弱密码很可能是让黑客进入的未上锁的门。暴力攻击可以在几分钟内破解短密码和/或基于字典的密码。