2017-01-13 6 views
1

サイバーセキュリティについてもう少し詳しく知るために、以下のスクリプトを作成しました。これは意図的に安全ではありません。ログインスクリプトをバイパスするにはどうしたらいいですか?

session_start(); 

if($_SESSION['userSession']) { 
    header("location: home.php"); 
} 


if($_POST) { 
    $username = $_POST['username']; 
    $password = $_POST['password']; 

    $con = mysqli_connect("localhost", "myUsername", "myPassword", "myDatabase"); 
    if(!$con) { 
     die("Error: " . mysqli_connect_error()); 
    } 

    $query = "SELECT * FROM users WHERE username = '$username' && password='$password'"; 
    $result = mysqli_query($con, $query); 
    $numResults = mysqli_num_rows($result); 

    if($numResults == 1) { 
     $row = mysqli_fetch_array($result, MYSQLI_ASSOC); 
     $_SESSION['userSession'] = $row['id']; 
     header("location: home.php"); 
    } else { 
     echo "Error Logging In"; 
    } 
    mysqli_close($con); 
} 

ご覧のとおり、私はユーザー入力をエスケープしておらず、パスワードはハッシュされていません。 したがって、私はこれが簡単にハック可能なログインであると推測しています。しかし、私は以下の入力をユーザー名とパスワードの両方のフィールドで使用しようとしましたが、常に "Error Logging In"という出力を得ています。

password' OR '1' = '1'"; 

ログインスクリプトをバイパス/ハックする方法を教えてください。

+0

SQLインジェクションのリンクを確認してください:http://www.w3schools.com/sql/sql_injection.asp –

+0

最後の '' 'を取り除いて、パスワードがそうであるようにしてください:' foo 'または' 1 '=' 1 ' – miken32

答えて

-1

1. SQLインジェクションの問題を回避するために、PDOまたはプリペアドステートメントを使用してクエリを実行してください。私たちは、ユーザー名とパスワードフィールドをフェッチするために、直接SQL文を使用している場合、それはしてバイパスすることができ

http://php.net/manual/en/mysqli.prepare.php

+0

あなたはその質問をお読みになりましたか?私はこの問題を回避しようとしているわけではありません。私はそれを理解しようとしていますし、この特定の状況でどのように悪用されるかもしれません。 –

+0

**パスワードを暗号化しない**、攻撃者がDBを取得したときに暗号化キーも取得します。約100msの間、ランダムな塩でHMACを繰り返し、塩をハッシュで保存します。 'password_hash' /' password_verify'、 'PBKDF2'(別名' Rfc2898DeriveBytes')、 'Bcrypt'などの関数を使用してください。要点は、攻撃者が無差別にパスワードを見つけるのに多くの時間を費やすことです。 – zaph

1

:データベース

に保存されたパスワードの 2.Add暗号化は、プリペアドステートメントについては、以下のリンクを参照してください。 ' OR '1' = '1パターンの場合、' OR '1' = '1をユーザ名とパスワードフィールドに入力すると値がSQL文に転送され、その文では' or '1' = '1真の場合はすべてとなり、ログインがバイパスする理由です。

関連する問題