2012-02-07 13 views
1

私は私のプログラムでは、検索機能電源を書くしようとしている:PDO/MYSQLプリペアドステートメントはエスケープ文字ではありませんか?

$search = "%".$_POST['search']."%"; 
$query=$connection->prepare("SELECT * FROM TABLE WHERE COLUMN LIKE ?"); 
$query->execute(array($search)); 

しかし、ユーザーが単に%に入ることができるようだし、それはすべての結果を返します。これを防ぐ方法を教えてください。私は、準備されたステートメントを使用すると、これらの文字をエスケープしたという印象を受けました。これは他の文字(\、 'など)にも適用されますか?これをどうやって解決するのですか?

答えて

1

準備文は何もエスケープしません。ステートメントを準備すると、クエリがプリコンパイルされ、プレースホルダ(?)のみを入力する必要があります。プリコンパイルされたクエリのSQLを変更する方法はないため、エスケープは必要ありません。

これを修正するには、%_を手動でエスケープします。

を追加しました:常識推論の

ビット:あなたのケースでは、WHNユーザーが検索ボックスに%に入り、あなたの$search変数は、文字列%%%が含まれています。 MySQLはどのように知っていますか?%は逃げなければなりません。

1

有効な入力としたくない場合は、アプリケーションコードに%または_が含まれないように保護する必要があります。

if (strpos($_POST['search'], '%') !== FALSE || strpos($_POST['search'], '_') !== FALSE) { 
    $query = $connection->prepare("SELECT * FROM TABLE WHERE COLUMN LIKE ?"); 
    $query->execute(array($search)); 
} 
else echo "% and _ are not allowed!"; 

'のような文字については、それらが?プレースホルダの代わりに渡された文字列の一部として扱われている、SQLステートメントを構築することで連結されません。だから彼らは安全です。

0

サーバがワイルドカードであることを知らせるためには、ユーザの入力を適切にエスケープし、一致させるデータを指定する必要があります。

$search = '%' . str_replace(array('_', '%'), array('\\_', '\\%'), $_POST['search']) . '%'; 

これは、さもなければワイルドカードとみなされるこれらの文字をエスケープします。

%100\%% 

I always give 100% when workingではなくI do 100 pushups dailyにマッチします:$searchは今の線に沿って何かを含んでいるでしょう。

関連する問題