2016-08-31 16 views
1

私は非常に単純なPHPログインスクリプトで非常に厄介な問題を抱えています。問題は、ログインが間違ったユーザー名やパスワードでも機能することです。私はLinux用のXAMPP 7.0.8で動作させています。ところで、データベース「ログイン」のテーブル「ユーザー」には1行しかありません。PHPログインが間違ったユーザ名とパスワードで動作する

私はこの種のスクリプトがどのように動作するかを理解しようとしていましたので、最も基本的なログイン方法を試しました。しかし、それは私には謎であり続けていますが、今はそれを実現させることはできませんでした。ここで

は、PHPの一部です:

<?php 

    session_start(); 

    if(isset($_POST['login'])) { 


     $db = mysqli_connect("localhost", "root", "", "login"); 

     $username = strip_tags($_POST['username']); 
     $password = strip_tags($_POST['password']); 

     $username = stripcslashes($username); 
     $password = stripcslashes($password); 

     $username = mysqli_real_escape_string($username); 
     $password = mysqli_real_escape_string($password); 

     $sql = "SELECT * FROM users WHERE username = '$username' LIMIT 1"; 
     $query = mysqli_query($db, $sql); 
     $row = mysqli_fetch_array($query); 
     $id = $row['id']; 
     $db_password = $row['password']; 

     if($password == $db_password){ 
      $_SESSION['username'] = $username; 
      $_SESSION['id'] = $id; 
      header("Location: index.php"); 
     } else { 
      echo "Error: the information is not correct."; 
     } 


    } 
?> 

そして、ここでHTMLフォーム:

<!DOCTYPE html> 
    <html lang="es"> 
    <head> 
     <meta charset="UTF-8"> 
     <title>Client's area</title> 
    </head> 
    <body> 
      <form method="post" action=""> 
        <input type="text" name="username"> 
        <input type="password" name="password"> 
        <input class="login" type="submit" name="login" value="Login"> 
      </form> 
    </body> 
    </html> 

編集:この記事のアイデアは、セキュアなログインスクリプトをしようとしていませんでした、それはいくつかのPHP機能を理解することを目的としていました。実際のログインプロジェクトにこのコードの一部を使用することは安全ではないことを認識しています。

+1

に役立つ単純なクエリ

$sql = "SELECT * FROM users WHERE username = '$username' and password= '$password'"; $query = mysqli_query($db, $sql); if(mysqli_num_rows($query) > 0) { //Records matched process further $_SESSION['username'] = $username; $_SESSION['id'] = $id; header("Location: index.php"); exit(); } else { //Record not found throw error echo "Error: the information is not correct."; } 

希望を使う店プレーンテキストPASSWをいけないしてくださいあなたのデータベースのord。パスワードハッシングを使用します。 PHPは['password_hash()'](http://php.net/manual/en/function.password-hash.php) と['password_verify()'](http://php.net/manual/ en/function.password-verify.php)それらを使用してください。 ここにいくつかの[パスワードに関する良いアイデア]があります(https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet) 5.5より前のバージョンのPHPを使用している場合は、[互換パックがあります](https ://github.com/ircmaxell/password_compat) – RiggsFolly

+1

あなたのスクリプトは[SQL Injection Attack]の危険にさらされています(http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in- php) [Little Bobby Tables](http://bobby-tables.com/)に何が起こったかを見てください。 [入力を逃れているなら、その安全ではありません!](http://stackoverflow.com/質問/ 5741187/sql-injection-that-gets-around-mysql-real-escape-string) [prepared parameterized statements](http://php.net/manual/en/mysqli.quickstart.prepared-statements)を使用してください。 php) – RiggsFolly

+2

これは本当に悪いログインシステムです。パスワードをplとして保存していますPDOと 'password_hash'を使用する別のチュートリアルを見つけてくださいhttp://php.net/manual/en/function.password-hash.php – cmorrissey

答えて

0

することができますが、あなたの「エラーメッセージ」を追加しますこれは

0

問題があっても、直接変数$rowを設定しているという問題があります。これにより、$ db_passwordが ''に設定され、パスワードは ''に設定されます。したがって、それは通過する。

変更$行この

if ($row = mysqli_fetc_array($query) { 

へのコマンドとは、下から3行目に}を追加します(空白部分)と同様

関連する問題