2011-06-25 3 views
1

次のコードの$user_inputを選択して、MySQLクエリが期待どおりに動作しないようにすることができますか?mysql_real_escape_string()はMySQL REGEXPに十分ですか?

<? 
$regexp = mysql_real_escape_string($user_input); 
mysql_query("SELECT col FROM table WHERE col REGEXP \"$regexp\""); 
?> 

SQL文字列をビットごとに渡す必要があるため、私は準備済みの文を使用できません。

編集:私はすでに正規表現のDoS攻撃を認識していると付け加えます。

+0

%が最初であるため、 '%needle'はインデックスを使用しません。それは遅くなるかもしれません。 –

答えて

4

このクエリ:

mysql_query("SELECT col FROM table WHERE col REGEXP '$regexp'"); 

は(ダブルmysqlの専用拡張されているので、私は、シングルと二重引用符を置き換え)SELECT以外のことを行うために堕落することはできません。

しかし、正規表現そのものが直接のコントロールにない場合、ユーザーはそれを使って何かを選択する可能性があります。問題の可能性を考慮する必要があります。

3

いいえ、あなたはそこでは安全です(ただし、正規表現は除きます)。

PHPが適切にエスケープするためにデータベースに関する情報を知っているので(たとえば、エンコーディングなど)、$ link_identifierを渡すと、より効率的(安全)になります。 この関数は単純に文字列をエスケープするのではなく、mysqlにをどのように入力するかを尋ねます。は適切に処理します。

リンク識別子を渡すと、文字列がデータベース用に正しくエスケープされます。

+1

なぜdownvote? – enyo

+0

なぜリンク識別子を渡す方が効率的で安全なのでしょうか? (私はdownvoteをしなかった) – Tim

+0

私のdownvoteも、私は同じ質問があります。 – Jon

関連する問題