2011-06-25 7 views
1

私には2つの問題があります。 問題1: ユーザーが自分のウェブサイトに登録できる登録フォームを作成しようとしています。 私が手dublicateエントリが見つからこのmysqlのステートメントを実行すると、エラー:

$sql "insert into users(username, password) values('$username, sha('$password'))"; 
私は、文字列のSHA(「$パスワード」)を数回変更しているにもかかわらず、キー「パスワード」 ため

重複したエントリ「da39a3ee5e6b4b0d3255bfef95601890afd80709」 。 助けてください。

else{ 
    include("databaseconnection.php"); 
    $databaseconnect = connect($host,$user,$password,$database) 
     or die("couldnot connect to database serever.\n"); 
    $database_select = mysql_select_db($database,$databaseconnect) 
     or die("could not select dabases.\n " .mysql_error()); 
    $query2 = "insert into company(username,password) 
     values('$username',sha1('$password'))"; 
    $result2 = mysql_query($query2,$databaseconnect); 
    echo "you have been registered as '$companyloginName' <br/>"; 
    header("Location:/index.php"); 

私のログインPHPスクリプトは以下の通りです:

$result ="select username, password form users where username ='$username' and password = sha('$password'); 
    if(mysql_num_rows($reuslt)==1){ 
    echo"welcome '$username"; 
    } 
+1

なぜパスワードフィールドにUNIQUE制約がありますか?複数のユーザーが同じパスワードを持つことは可能でしょうか? –

+0

私は実際にパスワードフィールドのuniqueconstraintを削除しましたが、何が起こっているのかは、異なるパスワードを持つユーザがsha( '$ password')とsha( '$ password1' )は 'da39a3ee5e6b4b0d3255bfef95601890afd80709'と同じです。 – sareeye

+0

@Emilが言っていることに加えて、人々が同じパスワードを持っていることを許可してください。または、すでにパスワードを入力した場合にメッセージを表示しないでください。 –

答えて

0

da39a3ee5e6b4b0d3255bfef95601890afd80709は、空の文字列のsha1ハッシュです。実際にパスワードをSQLクエリに挿入することを確認してください。たとえば、クエリをSQLサーバに送信する代わりにエコーするなどです。あなたの質問に追加された新しい情報で編集

、これらの2行をチェックしてください:ここで

include("databaseconnection.php"); 
$databaseconnect = connect($host,$user,$password,$database) 

は、$passwordがデータベースに接続するためにを使用するパスワードです。 databaseconnection.phpをインクルードすると、おそらく以前に$password変数に上書きされていたものが上書きされます。

echo $query2を試してみてください.SQLクエリにはパスワードがまったく含まれていないか、そのパスワードがユーザーが入力したものと同じではないことがよくわかります。

+0

ありがとう、エミール、私は実際にデータベースに挿入されていることがわかります、theis string'da39a3ee5e6b4b0d3255bfef95601890afd80709 'がパスワードの列に挿入されます。表のユーザーの他のすべての列には、正しく入力されます。 – sareeye

+0

ここにPHPコードです:else { \t \t include( "databaseconnection.php");/ \t \t/* $ databaseconnect = connect($ host、$ user、$ password、$ database)またはdie( "データベースsereverに接続できませんでした\ n"); */ $ database_select = mysql_select_db($ database、$ databaseconnect )またはdie( "データベースを選択できませんでした。\ n" ".mysql_error()); \t $ query2 = "会社(ユーザー名、パスワード)の値( '$ username'、sha1( '$ password'))に挿入します。 $ result2 = mysql_query($ query2、$ databaseconnect); \t \t \t \t \t \t \t \t "あなたは '$ companyloginName'
として登録されている" エコー; \t \t \t \t header( "Location:/index.php"); – sareeye

+0

@sareeye、これを反映するために質問を更新してください。 – Inca

0

コメント行から推測すると、ユーザパスワードではなく 'databaseconnection.php'で設定された接続パスワードを誤って使用する可能性があります。$パスワード文字列の初期化方法は表示されません。

もあってはならない、あなたのSQLにカンマを注意してください。

insert into company(username,password,) 
            ^

ことが原因である場合、私はテストしていませんが、あなたはおそらくそれを取り除くと、再びそれをテストする必要があります。

また、ユーザー入力からパスワードを挿入する場合は、pdo/prepared文をSQLインジェクションを防ぐために真剣に検討してください。

+0

コンマ(、)を削除しました。動作しませんでした。 ... – sareeye

+0

ありがとうございます。あなたは間違って接続パスワードを使用していました。もう一度よくやったよね – sareeye

1

まず、私はパスワードハッシュの目的のためだけではMySQLのsha()やPHPのsha1()を使用して強く反対アドバイスをでしょう。 これは、データベースが侵害された場合に、ユーザーにとって大きなセキュリティリスクです。

データを適切に保護するには、read my previous answer on the subject of password hashingまでお時間をいただきますようお願いいたします。


第2に、コードにはSQL Injection attackの脆弱性があります。事前にクエリに入れる変数をエスケープするには、mysql_real_escape_string()を使用します。

$query2 = "insert into company(username,password) 
    values('" . mysql_real_escape_string($username) . 
      "', sha1('" . mysql_real_escape_string($password) . "'))"; 

第三に、あなたの$password変数は、あなたのdatabaseconnection.phpファイルによって上書きされています。

include("databaseconnection.php"); 
$databaseconnect = connect($host,$user, $password ,$database); 

重点を置くために...

$databaseconnect = connect($host,$user,$password,$database);

そのため、クエリの後半で使用$passwordはまだデータベース接続用のパスワードが含まれている、いないユーザーのパスワード。

変数名をdatabaseconnection.phpに変更するか、配列を使用してすべての設定を保持してください。次のように

その後
$dbConnectParams = array('host' => 'localhost' 
         'user' => 'myUser', 
         'pass' => 'myPassword', 
         'db' => 'myDB'); 

、あなたのコードを変更:

include("databaseconnection.php"); 
$databaseconnect = mysql_connect($dbConnectParams['host'], 
          $dbConnectParams['user'], 
          $dbConnectParams['pass'], 
          $dbConnectParams['db']); 

mysql_connect()を呼び出すときにすでにデータベースを渡しているので、あなたがmysql_select_db()を呼び出す必要もしません。

+0

@Andreqそのシンプルでエレガントなコードには大変感謝しています.... – sareeye

関連する問題