10

私はWebサービスを持っており、クライアントが使用する必要のあるパラメーターの1つはカスタムキーです。このキーはsha1のハッシュです

eg:
bce700635afccfd8690836f37e4b4e9cf46d9c08

次に、クライアントがWebサービスを呼び出すときに、いくつかのことを確認する必要があります。

  • クライアントはアクティブですか
  • クライアントはWebサービスとサービスを介して送信できます

今私の問題はこれです:

私は質問があります:

$sql = "SELECT permission, is_active FROM clients WHERE sha1(concat(id,key)) = '" . mysql_real_escape_string($key) . "'";

私は正しいことをしていますか?またはより良い方法がありますか?ありがとう

4

2 に答える 2

10

このクエリを実行するたびに、MySQL は のすべてのレコードを調べて、そのおよびclientsの SHA-1 ハッシュを計算する必要があるため、このアプローチはコストがかかります。(ここでは、数行以上ある場合、または少なくとも、数行以上ある場合をサポートするアプローチを使用したいと想定しています。)idkeyclientsclients

(say) という新しいフィールドを追加してみませんid_key_sha1か? トリガーを使用してフィールドにデータを入力したままにし、それにインデックスを追加できます。このアプローチは、はるかに優れたパフォーマンスを発揮するはずです。

追加するために編集:クライアントは、この SHA-1 ハッシュを渡すことに加えて、ユーザー名とパスワードも送信する必要があると述べていますか? あなたのテーブル構造がどのように見えるかはわかりませんが、最初にユーザー名に基づいてクライアントレコードを見つけてから、その特定のレコードの SHA-1 ハッシュを比較する方が理にかなっていると思います。 SHA-1 ハッシュでレコードを検索します。

于 2011-11-29T02:45:47.477 に答える
0

mysql でフィルタリングを行う LHS 列に関数を適用しないでください。
これにより、mysql が比較のためにインデックスを使用できなくなります。

例では、インデックスでの使用を許可します:-

where key = SHA1(CONCAT(id, :key))

// where the :key = user submitted api key
// and in this case mysql able to fetch the matched rows via index
于 2011-11-29T03:03:21.600 に答える