その通りです。任意の値を 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を参照してください。