2012-02-22 11 views
-1

これは、データベースクエリを実行する前にSQLインジェクションを防止する良い方法ですか?mysql_real_escape_stringとstripslashesを使用したSQLインジェクションの回避

$name = mysql_real_escape_string(stripslashes($name)); 
$age = mysql_real_escape_string(stripslashes($age)); 
$location = mysql_real_escape_string(stripslashes($location)); 

ありがとうございます!

+3

なぜ「stripslashes」が必要ですか?[PDO](http://php.net/manual/en/book.pdo.php)の使い方はどうですか? –

+0

短い回答 - いいえ、そうではありません。 'mysql_ *'関数は使わず、@ClickのようにPDOを使うようにしてください。 –

+0

あなたのコードでは、最近/正しく設定された(マジック引用符が無効になっている)PHPインストールで、バックスラッシュを含む文字列が壊れます。無条件に 'stripslashes'を使用しないでください。 'get_magic_quotes_gpc()'が存在する場合にのみ使用し、 'true'を返します! – ThiefMaster

答えて

4

これは、それがうまく答える:

だから、何ができるのでしょうか?解決策は準備文を使用することです。 は、MySQL(ext/mysql)とSQLite2(ext/sqlite)の例外を除いてほぼすべてのPHPデータベース拡張でサポートされています。 安全なところにいるためには、PDOインターフェイスを使って データベースと話すか、新しいMySQLi (ext/mysqli)エクステンションを使用することをお勧めします。これらのインターフェイスは、クエリの構造とクエリパラメータの間の分離を可能にする用意されたステートメント をサポートしています。

ので、より安全側にあることを、はるかに優れてプリペアドステートメントを使用して、一人でmysql_real_escape_stringに依存しないでください。

+2

なぜこの回答が下降したのですか? 'mysql_real_escape_string'とそれが失敗したときの有用な情報を提供します。少なくともダウンボッターは答えが間違っているとコメントしている可能性があります。 –

+0

あなたが投稿したリンクは、非常に特殊なケースでmysql_ *をコーナーにして意見を推論しています。なぜ誰かがマルチバイト文字を許可する必要があるのでしょうか? PDOはこれを独自の方法で処理しているようですが、mysql_ *が安全性が低いことが証明されていますか? –

+0

@ N.B。 Alshanetskyが記述するセキュリティホールは非常に難解です(これまでGBK文字セットで動作していましたか?)正しい接続エンコーディングを設定することで修正できます。 'mysql _()'ライブラリが古く、PDOを使用する方が優れていることに同意しますが、安全なクエリを作成することは可能ですので、「PDOを使用する」が間違っています。また、PDOを使用したために膨大な注入口が残っていたため、*質問が自動的に保護されていると思っていた人と、長い間議論がありました。 –

関連する問題