2011-08-12 9 views
1

MYSQL注入をmd5で暗号化すると、それでも実行されますか? 「mysql_real_escape_string」を実行する前にMYSQL注入を暗号化すれば、mysql注入をNULLにすることができますか?私は暗号化する前に "mysql_real_escape_string"を実行する必要がありますか?MYSQL注入とmd5暗号化

+1

注射を暗号化することはどういう意味ですか?例がありますか? – Vache

+1

あなたは、PHPソリューションをタグとして、または質問本体自体を明示的に見ていると言及してください。 – bdares

答えて

2

md5() functionは、ASCII文字0-9とa-fを含む文字列を返します。 SQLインジェクションでは、'または"のような文字を使用する必要があります。したがって、md5()によって生成されたハッシュされた文字列は、アルゴリズムが期待通りに機能することを考慮してSQLインジェクションを発生させません。

$username = mysql_real_escape_string($_POST['username']); 
$password = md5($_POST['password']); 
mysql_query("SELECT * FROM users WHERE user='$username' AND pass='$password'"); 

をしかし、それは常にあなたがmysql_real_escape_string()とあなたのクエリに渡すデータをエスケープすることをお勧めします:

したがって、あなたが心配することなく、このような何かを書くことができます。

+0

私は通常、 "sprintf()"とmysql_real_escape_stringをクエリの第2引数として使用します。私はMD5の暗号化を逃れることができないのかどうかはわかりませんでしたが、コード化されているときに悪意のある使用ができなければ、心配する必要はありません。 –

+0

'良い練習'は、すべてのデータをエスケープすることです。 MD5リターンは信頼できる。差別せずにすべてのデータをエスケープすると、2つの問題が発生します。1.エスケープは必ずしもデータをサニタイズする方法ではありません(数字を考える).2つの共通点はありませんが、実際にはダブルエスケープ問題に陥る可能性があります。 – Mchl

+0

@Mchl:** All **データは信頼できないエンティティ(プログラマー)によって処理されるため、信頼できません。そのため、SQLクエリーに渡すすべてのデータをエスケープするのがよい方法です。 – Dor

1

MD5で値をハッシュしても、悪意のある注射可能な文字は含まれなくなりました。 MySQLはMD5ハッシュをデコードせず、SQLとして解釈/実行します。実際、一方向アルゴリズムであるため、MD5ハッシュはデコードできません。

+0

それは設計されていますが、意図したほど強くはありません。 – bdares

1

MD5のハッシュ値はバイナリデータで、16進数はPHPで表されます。つまり、数字には0..9とA〜Fの文字しか含まれていません。 この文字ではSQLインジェクションはできませんので、安全です。

1

MD5ハッシュ値自体はSQLインジェクションを引き起こすことはできませんが、SQLインジェクションを回避しようとしている場合は、には非常に良い方法です。原因はです。

注射(MD5'dパスワード)を引き起こすことができない変数の1つのクラスを特殊ケースに入れ、別のもの(例:整数に評価されたもの)をエスケープする必要があります。あなたのチームの誰もそれを見つけ出すことはできません。あなたのコードには本当の脆弱性があります。

安全なクラスを1つエスケープしないで、2番目の安全なクラスをエスケープしないようにしてから、3番目のクラスも安全であると間違って判断した場合 - MD5はバイナリエンコーディングであり、それを使って注射を作成する方法...おっと...あなたのコードにもう一つ本当の脆弱性があります。

次のようにしてください。

1)常にパラメータ化されたクエリを使用してください。これは不要なエスケープを行い、何かを逃れることを忘れるリスクを回避します。 mysqlibind_paramを使用します。

$stmt = $db->prepare('insert into users (username, password) values (?, ?)'); 
$stmt->bind_param('ss', $name, md5($password)); 
$stmt->execute(); 

2)何らかの理由で、すべてを逃れることができない場合。それが不要な場合でも。あなたは何かを忘れたくはありません。

SQLインジェクションと戦うためのルールは、何が安全で何が安全でないかを習得しようとしないでください。安全な値を安全でないものとして扱う場合、プログラムは正しく機能します。安全でない値を安全なものとして扱う場合、プログラムには大きなセキュリティホールが含まれます。

0

一般的に、md5ハッシュ値は注入攻撃に使用できませんが、未加工 md5ハッシュ値を利用できることを指摘しておく価値があります。生のmd5ハッシュは、 md5($userSubmittedValue, true)で生成されたハッシュです。出力は16進数でない出力を含むことがあるため、脆弱です。ハッシュを生の形式で生成するのは一般的ではありませんが、技術的にハッシュ値は注射攻撃で悪用される。

はここでそれを行うことができる方法の例です:

http://cvk.posterous.com/sql-injection-with-raw-md5-hashes

他が指摘したように、しかし、進MD5の出力は、インジェクション攻撃に対して脆弱ではありません。

関連する問題