2009-07-26 13 views

答えて

23

あなたのアプリケーションがあなたのサイトに登録したり、ログインしているときにアプリケーションがmd5を計算するだけであれば、md5への多くの呼び出しを1時間ごとに行いますか?数百のカップル?もしそうならば、私はが実際には小さいとは思わない。 PHPとMySQLの違いはまったく重要である。

「パスワードはmd5を使って格納されているということはどこに置くのですか」という質問は、「私はほとんど何も勝てない」よりももっと似ているはずです。

また、別の質問として、次のような質問があります。その種の計算にはどこでリソースを費やすことができますか?あなたは10台のPHPサーバとすでに重い負荷の下で1 DBサーバーを持っている場合は、あなたの答えを得る;-)

しかし、ちょうど楽しみのために:

mysql> select benchmark(1000000, md5('test')); 
+---------------------------------+ 
| benchmark(1000000, md5('test')) | 
+---------------------------------+ 
|        0 | 
+---------------------------------+ 
1 row in set (2.24 sec) 

そしてPHPで:

$before = microtime(true); 
for ($i=0 ; $i<1000000 ; $i++) { 
    $a = md5('test'); 
} 
$after = microtime(true); 
echo ($after-$before) . "\n"; 

あなたはおそらくこのような百万md5を計算しませんでしょうか?

(そして、これはSQLインジェクションを防ぐこととは何の関係もありません:ちょうど脱出を/引用、あなたのデータは常にまたはプリペアドステートメントを使用します!!)

+6

それ以外は失敗したら、実験を行います。 – Rafe

+2

だから、phpで行うのではなく、約1マイクロ秒をデータベースに保存します。かなり無視できるように聞こえるが、それでもなお興味深いのは – Kip

+1

+1は非常に徹底的な答えとSQLインジェクションについての重要な点です:) – Draemon

4

どちらが速いのかわかりませんが、PHPで実行すると、SQLインジェクションの可能性は避けられます。

+1

いずれにしても、$ pwd paramsにmysql_real_escape_stringを作成します。 –

+1

これはそれとは関係ありません。準備されたステートメントは、MD5関数を動かさずにこれを修正します。また、PHP MD5関数を使用してパスワードを "エスケープ"します。 – Draemon

+1

@Draemon:他の方法はないとは言いませんでしたが、この例ではパラメータをエスケープする兆候はありません。 @ hiam:あなたがphpでそれをすることにした場合、パスワード文字列を最初にエスケープするべきではありません。 phpのmd5関数は任意の文字列を取ることができ、^ [0-9a-f] {32} $ – Kip

0

これを測定してください。それは確かな唯一の方法です。

3

ここでパフォーマンスが本当に問題になりますか?それは限界があると思われる。 MySQLの中でそれをやって

  • は、DBはMySQLの中でそれをやって良いこと
  • ある平文パスワードが沿ってさらに渡さ意味(とDB接続は、多くの場合、暗号化されていない)多くの作業を、行うことができます。
  • これはSQLインジェクションとは関係ありません。あなたはMD5機能を動かさずに最初のバージョンを修正することができます。また、PHPのMD5関数にバグがあった場合でも、まだインジェクション攻撃の可能性があります。
+2

を返すことが保証されています。何とかそれを悪用しようとしていますが、32桁の16進数の代わりにいくつかの特殊文字と整形式のSQL文が出力されますか?起こらないだろう。 – lacop

+1

これはまさに悪用につながる態度です。あなたは任意の機能を使用してはいけませんし、あなたのデータを消毒することを願っています。誰かがある時点でMD5要件を削除した場合 - データが安全でないことを認識しているか? – Draemon

+1

これは単なる愚かなことです。エスケープする機能を信頼することはできませんし、まったく極端な機能にすることもできません。 PHP自体やmysqlでもバグが発生する可能性があります。だから、悪用を避ける唯一の方法は、コードを書かないことです。 – lacop

0
私は、MySQLのうち列の値を読み、言う

、そして比較あなたのクライアントコード(例えばphp)に計算されたハッシュの結果。

これを行う主な理由は、データベースが非バイナリ形式(例:大文字小文字を区別しない)で列を照合するなどの愚かなことを避けることです。

関連する問題