0

ユーザーが私のサイトをハッキングすることを許可したのは何だろうと思っていました。彼らは私のユーザー名、個人情報、パスワードを変更しました。誰かがそれが何であったかについていくつかの提案をしてもらえますか. 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.
?>
4

6 に答える 6

2

SQLインジェクションに注意する必要があります。それが最初に頭に浮かんだことです(MySqlの使用に気づきました)。これを防ぐには、(非推奨と見なされるmysql_real_escape_string()別の)を使用してユーザー入力をサニタイズする必要があります。mysql_escape_string()この解決策にもかかわらず、プリペアドステートメントを使用してSQLインジェクションの問題を修正するには、 PDOまたはMysqli (通常はこれをお勧めしません)のいずれかを使用することをお勧めします。

次に、ある種の悪意のあるJavascriptスクリプトをコードに「挿入」した可能性のあるXSS(クロスサイトスクリプティング)におそらく注意する必要があります。これを少し修正するとhtmlspecialchars()、HTMLタグ(など<script>)がHTMLタグと見なされなくなります。

PHPのこの脆弱性リストもご覧ください。

PS

コードをより読みやすく「正しく」するために、同じものに変更strlen($_POST['login']) >= 256することをお勧めしますstrlen($_POST['login']) > 255が、実際の制限はそうではないことを読者にすぐに理解させ256ます255

于 2011-04-07T16:30:02.540 に答える
0

まず、SQLインジェクションを実行できないことを確認します。これはおそらく彼らがしたことです。これは通常、実行される入力フィールドが原因で発生します。それを行う人は、SQLコマンドを入力するだけです。

これについての詳細はここで見ることができます。

ああ、StackOverflow.comへようこそ!このサイトを楽しんでいただければ幸いです。

于 2011-04-07T16:26:40.223 に答える
0

DalexL の回答に加えて、データベースに接続するための強力なパスワードを使用していることを確認してください。

于 2011-04-07T16:29:06.190 に答える
0

これは元の投稿者には起きなかったと確信していますが、欺瞞的な会社は Web サイトを持つ会社に「請求書」を送ることが知られています。「請求書」の細かい活字は、ドメインを会社から詐欺会社に移しました。

以下はその一例です: Domain Registry of America 詐欺

于 2011-04-07T16:32:02.650 に答える
0

ユーザーに画像のアップロードを許可すると、GIF エクスプロイトの被害に遭った可能性があります。サーバー設定が安全でない場合、PHP コードが埋め込まれた GIF を表示すると、コードが実行されます。システム上に .gif.php (または .php.gif) ファイルが見つかるかどうかを確認してください。

于 2011-04-07T16:45:34.907 に答える
0

HTMLPURIFIER がすべてのデータベース向け入力に対して正しく実装されている場合は、ログインの送信方法を評価する必要があります。クライアント側で送信する前に事前ハッシュしていますか。

その理由は、フォームにフィルター処理されていない入力があり、SQL が挿入されたコードを通過させているためだと思います。

于 2011-04-07T18:04:17.763 に答える