2016-10-13 6 views
0

私は、mysqlデータベースとシンプルなPHPスクリプトを使って簡単なPHPログインシステムを設定しようとしています。それは1つの小さなエラーで動作しているようです。間違った資格情報でログインすることもできます。私はPHPで簡単なログインシステムを設定しようとしています。実行されますが、間違った資格情報でログインすることもできます。私は間違って何をしていますか?

実際にはrietool.roxtest.nlで確認できます。

私のコードは:誰もがOU私を助けることができれば

<?php 
    // get values passed from form in login.php file 
    $username = $_POST['username']; 
    $password = $_POST['password']; 

    // to prevent mysql injection 
    $username = stripcslashes($username); 
    $password = stripcslashes($password); 
    $username = mysql_real_escape_string($username); 
    $password = mysql_real_escape_string($password); 

    // connect to the server and select database 
    mysql_connect("my database info"); 
    mysql_select_db("roxtest_nl_RIEtool"); 

    // query the database for username 
    $result = mysql_query("Select * from users where username = '$username' and password = '$password'") 
      or die ("Failed to query database" .mysql_error()); 
    $row = mysql_fetch_array($result); 
    if ($row['username'] == $username && $row['password'] == $password) { 
     echo "login geslaagd, welkom"; 
    } else { 
     echo "login mislukt, probeer opnieuw"; 
    } 

?> 

、それをいただければ幸いです!

はFYI私は、このチュートリアルに従っ:https://www.youtube.com/watch?v=arqv2YVp_3E

+1

[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)でも安全ではありません! –

+1

*** [mysql_ *関数の使用をやめる](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php)*** [これらの拡張機能](http://php.net/manual/en/migration70.removed-exts-sapis.php)がPHP 7で削除されました。[prepared](http://en.wikipedia.org/wiki/Prepared_statement)について学んでください。 )[PDO](http://php.net/manual/en/pdo.prepared-statements.php)と[MySQLi](http://php.net/manual/en/mysqli.quickstart.prepared- statements.php)、PDOの使用を検討してください。[これは本当に簡単です](http://jayblanchard.net/demystifying_php_pdo.html)。 –

+1

**プレーンテキストのパスワードを保存しないでください!**パスワードのセキュリティを処理するには、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

まず、他の人がすでにウルコードは安全ではない、言ったように! _escapeでもMYSQL_を使用しないでください! 使いやすいPDOの使い方を学び、正しく使うとより安全になります!ウルのコードでは

は、uが既に取得:

where username = username and password = password in ur query 

だから、それは真か偽を返し、ユーザ名とパスワードを比較する場合はuが使用する必要はありません!

U行カウントが必要です.1の場合はユーザー名とパスワードが正しく、0の場合は間違っています。

0

ここで何が起こっているかは完全にはっきりしていません。しかし、私の推測は次のとおりです。

$username = mysql_real_escape_string('foo'); 

評価は偽になっています。これは、まだ開始していないデータベース接続に依存しているためです。パスワードと同じです。

$row = mysql_fetch_array($result); 

$行がfalse:

はその後、あなたは空の結果セットを取得します。 ("SELECT * FROM USERS WHERE username='' AND password=''";

次に、あなたがしている:に相当

if ($row['username'] == $username && $row['password'] == $password) { 

if(null == false && null == false) { 

は次のようになります。

if(true && true) { 

だから我々は持っている:

if(true) { 
    echo "login geslaagd, welkom"; 
} 

どのような資格もこれを満たします!

非常に注意してください!

これを修正するには、mysql_real_escape_string以上の呼び出しを行う前に接続を行い、データベース接続をmysql_real_escape_stringに渡します。関数がfalseを返さないかどうかを確認したいかもしれません。

次に、行があることを確認します。MySQLの機能を使用すると、異なるデータベースインタフェースを使用して、あなたの例を書き換えて、ボード上の他のフィードバックの一部を取ることを望むことが推奨されていませんと

if(
     $row = mysql_fetch_array($result) 
     && $row['username'] == $username 
     && $row['password'] == $password 
) { 
    echo 'Success'; 
} 

そして、エラーの報告とPHPのログインを調べてください。それはここであなたを助けてくれたでしょう。

+0

これはうまくいきました、ありがとう!他のフィードバックを心に留めて、PDOについてもっと学びます。私は非常にジュニア開発者であり、学習することを熱望しています。あなたのフィードバックは多くを意味します! –

関連する問題