ご存知のように、Yii などのフレームワークでは生の MySQL クエリを使用できません。mysql_escape_string
ユーザー入力での SQL インジェクションを回避するために、Yii フレームワークで実行されるプロジェクトで使用したいと考えています。
mysql_escape_string
は PHP 5.5 で廃止され、PDO の代替手段があることを認識しています。Yii フレームワークの代替手段と mysql_escape_string() の PDO 方法は何ですか?
ご存知のように、Yii などのフレームワークでは生の MySQL クエリを使用できません。mysql_escape_string
ユーザー入力での SQL インジェクションを回避するために、Yii フレームワークで実行されるプロジェクトで使用したいと考えています。
mysql_escape_string
は PHP 5.5 で廃止され、PDO の代替手段があることを認識しています。Yii フレームワークの代替手段と mysql_escape_string() の PDO 方法は何ですか?
PDOの代替手段mysql_escape_string
は、準備済みステートメントを使用することです。たとえば、Yii では次のようになります。
$user = Yii::app()->db->createCommand()
->select('username, password')
->from('tbl_user')
->where('id=:id', array(':id'=>$_GET['userId']))
->queryRow();
(Yii リファレンス ドキュメントhttp://www.yiiframework.com/doc/api/1.1/CDbCommandから)
準備されたステートメントでプレースホルダーを介してパラメーターを渡すと、SQL インジェクションから保護されます。
パラメータの自動エスケープには、プリペアド ステートメントを使用することをお勧めします。ただし、CDbConnection のこのメソッドもトリックを実行する必要があります。
Yii::app()->db->quoteValue($your_value);
本質的に、これはクエリで使用する文字列値を引用します。これは のラッパーですPDO::quote()
。
詳細はこちらをご覧ください。
準備されたクエリ「?」を使用してクエリ パラメータをエスケープする プレースホルダーには欠点があります (エスケープされたパラメーターがクエリの本体から移動されるため、一部のクエリの操作が難しくなります。常に正当化されるとは限らないデータベースへの追加のラウンドトリップが発生する可能性があります。クエリが本質的に動的である場合は、それらの多くを準備すると、実際にはサーバーのリソースが必要になる場合があります)。
Yii には、準備されたクエリ フォームの外でクエリ パラメータをエスケープするために使用できるquoteValueメソッドがあります。
を使用する場合は、パラメーターをエスケープする必要はありませんActiveRecords
。
mysql_escape_string
ただし、その機能を使用したい場合は、試してみてくださいmysqli_escape_string()
モデルを操作するとパフォーマンスの問題が発生する複雑なクエリを実行するときにこれを使用Yii
し、DB に対して直接 SQL クエリを実行する必要がありました。
Yii::app()->db->createCommand($sql)->queryAll()
これを行うには、 (または他の同様の関数)を使用できます。
CHTMlPurifier を使用します。
// Example
$p = new CHtmlPurifier();
$user = Yii::app()->db->createCommand()
->select('username, password')
->from('tbl_user')
->where('id=:id', array(':id'=>$p->purify($_GET['userId']);))
->queryRow();
get パラメータに悪意のあるコードが追加される可能性があります。