1

私には2つの問題があります。問題1:ユーザーが自分のWebサイトに登録できる登録フォームを作成しようとしています。このmysqlステートメントを実行すると、get dublicate entry foundエラーが発生します:

$sql "insert into users(username, password) values('$username, sha('$password'))";

文字列sha('$ password')を数回変更したにもかかわらず、キー'password'のエントリ'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";
    }
4

3 に答える 3

1

まず、パスワードハッシュの目的でMySQLまたはPHPを単独で使用することは強くお勧めします。これは、データベースが危険にさらされた場合のユーザーにとって大きなセキュリティリスクです。sha()sha1()

データを適切に保護するために、パスワードハッシュに関する私の以前の回答をお読みください。


次に、コードはSQLインジェクション攻撃に対して脆弱です。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()

于 2011-06-25T20:23:17.273 に答える
0

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

また、SQLに含まれていてはならないコンマにも注意してください。

insert into company(username,password,)
                                     ^

それが原因であるかどうかはテストしていませんが、おそらくそれを取り除き、もう一度テストする必要があります。

また、ユーザー入力からパスワードを挿入する場合は、sql-injectionsを防ぐためにpdo/preparedステートメントを真剣に検討してください。

于 2011-06-25T16:43:05.547 に答える
0

da39a3ee5e6b4b0d3255bfef95601890afd80709空の文字列のsha1ハッシュです。パスワードをSQLサーバーに送信する代わりにエコーするなどして、SQLクエリに実際にパスワードを挿入するようにしてください。

編集質問に新しい情報を追加したら、次の2行を確認してください。

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

ここに、データベースへの接続に$password使用されるパスワードがあります。databaseconnection.phpを含めると、以前は変数に含まれていたものが上書きされる可能性があります。$password

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

于 2011-06-25T15:20:27.293 に答える