PHPとSQLは攻撃防止テクニックを注入します。
次にSQLの注入攻撃がどのように実現されるかについて話します。この例を見てください。
// supposed input
$name = "ilia'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE name='{$name}'");
で明らかに最後にデータベースで実行される命令は、SELECT*FROM users WHERE name=iliaです。DELETE FROM usersはこれでデータベースに壊滅的な結果をもたらしました。Cのすべての記録は削除されました。でも、使っているデータベースがMySQLなら、まだいいです。query()関数はこのような操作を直接行うことができませんので、安心してください。もしあなたが使っているデータベースがSQLiteまたはPostgreSQLであれば、このような文言を支持しています。上に述べたように、SQL注入は主に不安定なデータをデータベースに提出して攻撃目的を達成します。SQLの注入攻撃を防止するために、PHPは入力した文字列を処理する機能を備えています。より低いレベルで入力を安全に初歩的に処理することができます。つまり、Magic Quotesです。php.ini magic_quot tesgpc)magic_ならquot tesgpcオプションを有効にすると、入力した文字列のシングルクォーテーションマークと、他の文字の前に自動的にバックスラッシュが加算されます。しかし、Magic Quotesは一般的な解決策ではなく、潜在的な危険性のあるすべてのキャラクターをブロックできず、多くのサーバーでMagic Quotesは有効にされていません。したがって、SQL注入を防ぐために他の様々な方法を使用する必要があります。多くのデータベース自体がこのような入力データ処理機能を提供しています。例えばPHPのMySQLの操作関数の中にmysql_というものがあります。リアル.エスケープstring()の関数は、特殊文字とデータベース操作でエラーが発生する可能性のある文字を変換します。このコードを見てください。
// Magic Quotes
if (get_magic_quotes_gpc()) {
$name = stripslashes($name);
}else{
$name = mysql_real_escape_string($name);
}
mysql_query("SELECT * FROM users WHERE name='{$name}'");
注意してください。データベースが持つ機能を使う前に、Magic Quotesが開いているかどうかを判断します。上の例のように、二回で処理を繰り返すとエラーが発生します。MQが有効になったら、私たちは追加された\を取り除いて真実のデータを得るべきです。上記の文字列形式のデータを前処理する以外に、Binaryデータをデータベースに保存する場合も、前処理に注意してください。データベース自体の格納フォーマットと競合して、データベースが崩壊し、データレコードが失われ、ライブラリ全体のデータが失われることがあります。いくつかのデータベースはPostgreSQLのように、バイナリデータをエンコードするための関数pg_を提供します。エスケープbytea()は、Base 64と同様にデータを符号化することができる。例えば:
// for plain-text data use:
pg_escape_string($regular_strings);
// for binary data use:
pg_escape_bytea($binary_data);
の他の場合、私たちもこのような仕組みを採用します。それはデータベースシステム自体がサポートしていない多バイト言語です。中国語、日本語などです。一部のASCII範囲とバイナリデータの範囲が重複しています。ただし、データをエンコードするとLIKE abc%のようなクエリ文が無効になる可能性があります。