2016-05-16 16 views
1

入力フィールドに入力されたユーザー名とパスワードがデータベースに格納されているかどうかを確認しようとしています。そして、それがなければエラーメッセージを出さなければならない。私のデータベースにユーザがいます: ユーザ名:Alexander
パスワード:alexalex

しかし、ログインするために自分のコードを実行すると、正しいログインとは言えません。sqliteログインフォームが正常に動作しない

<?php 
try{ 
    $db = new PDO('sqlite:users.db'); 
} 
catch(PDOException $err){} 
if(isset($_POST['username'])){ 
    $username = $_POST['username']; 
    $password = $_POST['password']; 

    try{ 
    $sql = "SELECT * FROM players WHERE username='$username' AND password='$password'"; 
    $st = $db->prepare($sql); 
    $st->execute(); 
    if($st->fetchColumn() == 1){ 
    //SUCCES LOGIN 
    }else{ 
    //FAILED LOGIN 
    } 
    }catch(PDOException $err){} 
    } 
    ...HTML CODE... 
    <form action="" method="POST" class="login-form"> 
    <input type="text" id="one" name="username" placeholder="Username"> 
    <input type="password" id="two" name="password" placeholder="Password"> 
    <input type="submit" value="LOGIN" class="three"> 
    </form> 

このログインを解決できる人には非常に感謝しています。ジェイ・ブランチャードで述べたように

+0

**プレーンテキストのパスワードを保存しないでください!**パスワードのセキュリティを処理するには、PHPの[組み込み関数](http://jayblanchard.net/proper_password_hashing_with_PHP.html)を使用してください。 5.5より小さいPHPバージョンを使用している場合、 'password_hash()' [互換パック](https://github.com/ircmaxell/password_compat)を使用することができます。ハッシュする前に[パスワードを逃さないでください](http://stackoverflow.com/q/36628418/1011527)、または他のクレンジングメカニズムを使用していることを確認してください。パスワードを変更すると、パスワードが変更され、不要な追加のコーディングが発生します。 –

+0

[Little Bobby](http://bobby-tables.com/)は、[あなたのスクリプトはSQLインジェクション攻撃の危険にさらされていると言います。](http://stackoverflow.com/questions/60174/how-can-i-prevent -sql-injection-in-php)を実行します。 [文字列をエスケープする](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)でも安全ではありません! [PDO](http://php.net/manual/en/pdo.prepared-statements.php)の[prepared](http://en.wikipedia.org/wiki/Prepared_statement)のステートメントについて学んでください。 –

+0

'fetchColumn()'ではなく 'fetch()'を使うべきです。http://php.net/manual/en/pdostatement.fetch.php –

答えて

1

if($st->fetchColumn() == 1) 

あなたがfetch()を使用している必要があります。

しかし、それはまだ一度fetch()に変更し、この条件文であなたを失敗していました:

if($st->fetch() == 1) 

が唯一の1であり、また、両方の条件を満たさなければならない場合にはチェックして。

同じユーザー名の行が複数ある場合は、それも失敗します。

したがって、>1または>=1を使用してください。

コメントにも記載されています。これがライブサイトまたはライブを目的とする場合は、準備文とpassword_hash()を使用してください。

データベースがハッキングされるまでには時間がかかるだけです。

+0

ありがとう! – Aplex

+0

@Aplex大歓迎です。 –

関連する問題