1

$user_input次のコードで、MySQL クエリが期待どおりに動作しないように選択できますか?

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

SQL文字列を少し渡す必要があるため、準備済みステートメントを使用できません。

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

4

2 に答える 2

4

このクエリ:

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

SELECT 以外のことを行うために覆すことはできません (二重引用符は mysql のみの拡張であるため、二重引用符を単一引用符に置き換えました)。

ただし、正規表現自体を直接制御できない場合、ユーザーは正規表現を使用して何かを選択する可能性があります。これが問題になる可能性を考慮する必要があります。

于 2011-06-25T17:49:27.273 に答える
3

いいえ、あなたはそこで安全です(正規表現を除いて、もちろん何でもかまいません).

ただし、$link_identifier を渡した場合は、より効率的 (かつ安全) になります。これは、PHP が適切にエスケープするためにデータベースに関する情報 (エンコードなど) を認識している必要があるためです。したがって、この関数は単純に文字列をエスケープするのではなく、mysqlに適切にエスケープする方法を尋ねます。

したがって、リンク識別子を渡すことで、文字列が対象のデータベースに対して正しくエスケープされるようになります。

于 2011-06-25T17:51:28.507 に答える