5

ご存知のように、Yii などのフレームワークでは生の MySQL クエリを使用できません。mysql_escape_stringユーザー入力での SQL インジェクションを回避するために、Yii フレームワークで実行されるプロジェクトで使用したいと考えています。

mysql_escape_stringは PHP 5.5 で廃止され、PDO の代替手段があることを認識しています。Yii フレームワークの代替手段と mysql_escape_string() の PDO 方法は何ですか?

4

5 に答える 5

10

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 インジェクションから保護されます。

于 2013-02-15T15:13:03.283 に答える
5

パラメータの自動エスケープには、プリペアド ステートメントを使用することをお勧めします。ただし、CDbConnection のこのメソッドもトリックを実行する必要があります。

Yii::app()->db->quoteValue($your_value);

本質的に、これはクエリで使用する文字列値を引用します。これは のラッパーですPDO::quote()

詳細はこちらをご覧ください

于 2018-06-01T05:49:11.903 に答える
3

準備されたクエリ「?」を使用してクエリ パラメータをエスケープする プレースホルダーには欠点があります (エスケープされたパラメーターがクエリの本体から移動されるため、一部のクエリの操作が難しくなります。常に正当化されるとは限らないデータベースへの追加のラウンドトリップが発生する可能性があります。クエリが本質的に動的である場合は、それらの多くを準備すると、実際にはサーバーのリソースが必要になる場合があります)。

Yii には、準備されたクエリ フォームの外でクエリ パラメータをエスケープするために使用できるquoteValueメソッドがあります。

于 2013-12-09T13:54:52.353 に答える
0

を使用する場合は、パラメーターをエスケープする必要はありませんActiveRecords

mysql_escape_stringただし、その機能を使用したい場合は、試してみてくださいmysqli_escape_string()

モデルを操作するとパフォーマンスの問題が発生する複雑なクエリを実行するときにこれを使用Yiiし、DB に対して直接 SQL クエリを実行する必要がありました。

Yii::app()->db->createCommand($sql)->queryAll()これを行うには、 (または他の同様の関数)を使用できます。

于 2013-12-09T14:22:09.397 に答える
0

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 パラメータに悪意のあるコードが追加される可能性があります。

于 2013-02-15T16:33:37.387 に答える