1

ユーザーがデータベースを検索できるスクリプトを作成しています。私の理解では、PDO では LIKE オペランドのパラメーターを設定できません。だから私はそれを補うためにこのコードを持っています

$sQuery = "SELECT * FROM table WHERE column LIKE '%" . $this->sQuery . "%' LIMIT 30";
$Statement = $this->Database->prepare($sQuery);
$Statement->execute();

これが SQL インジェクションに対して安全であるとは思えません。安全にする方法はありますか?

4

2 に答える 2

1

その通りです。任意の値を SQL 文字列に補間すると、SQL インジェクションの脆弱性が発生するリスクが生じます。ときは SQL クエリ パラメータ プレースホルダを使用しprepare()、次にその値をパラメータとして指定することをお勧めしますexecute()

$pattern = "%" . $this->sQuery . "%";
$sQuery = "SELECT * FROM table WHERE column LIKE ? LIMIT 30";
$Statement = $this->Database->prepare($sQuery);
$Statement->execute(array($pattern));

あなたの例からどのMySQL拡張機能を使用しているのかわからないので、それを疑似コードと見なしてください。私は PDO を想定しています。これにより、パラメーターを配列引数として に送信できますexecute()

を使う人もいますPDOStatement::bindParam()が、そうするメリットはありません。他の RDBMS ブランドではPDO::PARAM_STR問題になるかもしれませんが、MySQL ドライバーでは、パラメーターの型は無視されます。

PS: あなたが尋ねたセキュリティの問題は別として、データが大きくなるにつれて、あなたが行っているようなワイルドカード ベースのパターンの検索がうまく機能しないことがわかります。私のプレゼンテーションFull Text Search Throwdownを参照してください。

于 2013-02-10T16:22:53.177 に答える
0

これはうまくいくはずです:

$sQuery    = "SELECT * FROM table WHERE column LIKE :query LIMIT 30";
$Statement = $this->Database->prepare($sQuery);
$Statement->execute(array(':query' => '%' . $this->sQuery . '%'));
于 2013-02-10T16:23:09.643 に答える