1 つは入力データがフィルターされていない (フィルター入力) こと、もう 1 つはデータベースに送信されるデータがエスケープされていない (エスケープ出力) ことです。これら 2 つの重要な手順は不可欠であり、プログラム エラーを減らすために特別な注意が必要です。
攻撃者にとって、SQL インジェクション攻撃を実行するには、思考と実験が必要です。データベース ソリューションについて十分に根拠のある推論を行うことが非常に必要です (もちろん、攻撃者がソース プログラムとデータベース ソリューションを参照できないことを前提としています)。次の単純なログイン フォームを考えてみましょう。 :
コードをコピー コードは次のとおりです:
攻撃者として、彼はクエリ ステートメントを推測してユーザー名とパスワードを確認することから始めます。ソースファイルを見ることで、彼はあなたの習慣を推測し始めることができます。
たとえば、名前の習慣。通常、フォーム内のフィールド名はデータ テーブル内のフィールド名と同じであると想定されます。もちろん、それらが異なることを保証することが、必ずしも信頼できるセキュリティ対策であるとは限りません。
最初の推測として、通常は次の例のクエリを使用します:
コードをコピーします コードは次のとおりです:
$password_hash = md5($_POST['password ']);
$sql = "SELECT count(*)
FROM users
WHERE username = '{$_POST['username']}'
AND パスワード = '$password_hash'";
ユーザー パスワードの MD5 値を使用する これは以前は一般的な方法でしたが、現在は特に安全ではありません。最近の研究では、MD5 アルゴリズムには欠陥があり、多数の MD5 データベースによって MD5 逆クラッキングの難易度が低下していることが示されています。デモを見るには http://md5.rednoize.com/ にアクセスしてください (原文どおり。山東大学の Wang Xiaoyun 教授の研究によると、MD5 の「衝突」、つまり、衝突を引き起こす 2 つの異なるファイルと単語がすぐに見つかることがわかっています。ただし、この結果によると、上記の特殊な場合に md5 を直接使用するのは危険です。)
最善の保護方法は、独自に定義した文字列をパスワードに追加することです。例:
コードをコピーします コードは次のとおりです:
$salt = 'SHIFLETT' ;
$password_hash = md5($salt . md5($_POST['password'] . $salt));
?>
もちろん、攻撃者は最初からそれを正しく推測できない可能性があり、多くの場合、それを正しく推測する必要があります。いくつかの実験をしてください。実験するより良い方法は、ユーザー名として一重引用符を入力することです。これにより、重要な情報が公開される可能性があります。多くの開発者は、Mysql ステートメントの実行中にエラーが発生したときに、関数 mysql_error() を呼び出してエラーを報告します。以下の例を参照してください:
ただし、これはこのメソッドは開発中です。非常に便利ですが、重要な情報が攻撃者に公開される可能性があります。攻撃者がユーザー名として一重引用符を使用し、パスワードとして mypass を使用した場合、クエリ ステートメントは次のようになります: