0

スタッフがログインして作業ケースを追加、変更、更新できるページを実装しようとしています。

DB からロードされたデータ (スタッフ名) を含む選択リストがあります。このDBには、基本、ユーザー名、ID、パスワード、電子メールがあります。

選択リスト/ボックスのデフォルト値は「-」です。変更すると、選択したスタッフ メンバーのパスワードを入力するよう求めるフォームがポップアップ表示されます。

jQuery を使用して、ID、ユーザー、およびパスワード (プレーン テキスト) をサーバーに送信します。php ファイルでは、mysqli_real_escape_string3 つの変数すべてをエスケープ ( ) し、パスワードをハッシュ ( md5($salt.$varname)) します。

私は mysql DB をクエリしますSELECT * FROM table WHERE id='".$escapedId."' AND name='".$escapedName."'

num_rows==1私がそうするかどうかを確認した後$hashedPasswd==$mysqlresult['passwd']

$serverResponse->reponses['passwdOK']=true;
echo json_encode($serverResponse);

したがって、私の 2 つの質問は次のとおりです。パスワードを含めるようにクエリを変更する必要がありますか (... WHERE passwd=$hashedPasswd...)、および JS ファイルに送信/返す応答が OK であるかどうか (OK とは、安全で安全かどうかを意味します)。応答がセキュア/セーフでない場合、正しいサーバー応答は何でしょうか。

PS私は別のページにリロードしたりリダイレクトしたりしたくありません。実際、パスワードがOKであれば、すでにロードされたページのいくつかのコントロールをロック解除/有効にしたいです。

4

2 に答える 2

2

あなたのアプローチにはいくつかの問題があります:

  • 最近では、MD5 は速すぎて簡単にブルート フォース攻撃できるため、パスワード ハッシュにはまったく適していません。代わりに bcrypt、scrypt、または PBKDF を使用してください。
  • すべてのパスワードにグローバルソルトを使用していると思いますか? その場合、ハッシュ化されたパスワードはレインボー テーブル攻撃に対して脆弱なままになります。代わりに、個別のユーザーごとにソルトをランダムに生成し、これらをデータベースに保存する必要があります。通常、bcrypt などを実装するライブラリは、すでにソルティングを行っています。
  • 各クエリ パラメータを手動でエスケープし、それらを部分的なクエリと連結すると、SQL インジェクションの脆弱性につながる可能性のあるエラーに対して非常に敏感になります。代わりにプリペアド ステートメントを使用することを強くお勧めします。PHP では、これは多くの場合、PDO フレームワークを介して行われます。
  • パスワードをプレーンテキストで送信するのは危険です。ユーザーとサーバー間のトラフィックが暗号化されるように、HTTPS を使用する必要があります。ただし、これには証明書が必要です。自己署名証明書を使用できます。その場合、アプリにアクセスできる各クライアントは、それを受け入れるように構成するか、認証局によって署名されるようにする必要があります。、あなたが支払う必要があります。HTTPS を使用したくない、または単純に使用できない場合は、オープンな Wi-Fi ネットワークからログインしないこと、およびアプリで使用するものと同じパスワードを使用しないことをユーザーに推奨することをお勧めします。彼らの電子メールアカウント。クライアント側でパスワードのハッシュ化を試すこともできます (サーバー側でも同様です。ここでランダムなソルトも使用することを忘れないでください)。これは、中間者攻撃から保護することはできませんが、パッシブ リスナー (より一般的) によるパスワードのスヌーピングを防ぐことができます。
于 2012-11-24T19:10:09.493 に答える
0

見た目は良さそうですが、ブラウザとサーバー間の通信はすべて暗号化(https)する必要があることを覚えておいてください。そうでない場合、サーバーとブラウザーの間の誰もがユーザーから提供されたすべてのデータ(ログイン、パスワード)を読み取ることができます。

あなたの質問がパフォーマンスにとって最良の選択だとは思いません。パスワードがデータベースのパスワードと一致しない場合にデータを選択する目的は何ですか。クエリは「WHERE id=id AND password='ハッシュ」である必要があります。

パスワードに問題がない場合、データベースからユーザーデータが送信されます。そうでない場合、FALSE以外の情報は取得されません。私はプロスキルのmysqlエキスパートではありませんが、私が知る限り、それはより良い解決策です。

そして、さらに。ハッシュをエスケープする必要はありません。md5()関数から何かを取得した場合、それはすでに「エスケープ」されています。

とにかく、私はそれをそのようにします:

$id = (int) $_POST['id'];
$pass = md5(SALT.$_POST['pass']);
$query = 'SELECT * FROM `user_table` WHERE `id` = $id AND `password` = $pass;
于 2012-11-24T19:07:07.867 に答える