5

次のコードがあるとしましょう(ある種の検索などのために):

$stmt = $pdo->prepare("SELECT * FROM users WHERE username LIKE ?");
$stmt->execute(array('%' . $username . '%'));

指定されたユーザー名は適切にエスケープされますが、文字%(= 0以上の任意の文字)および_(=正確に1つの任意の文字)はMySQLによってワイルドカードとして解釈されます。

%ユーザーが検索にまたはを入力できることを理解してい_ます。検索機能を正しく機能させるには、それをエスケープする必要があります。(のような場合や結果set_ptを取得setoptする場合)。

しかし、私の質問は、誰かがこれを悪用できるかどうかです。はいの場合、誰かがこれをどのように悪用し、どのように防ぐことができますか?以下の機能で十分でしょうか?

function escape_like_string($str) {
  return str_replace(Array('%', '_'), Array('\%', '\_'), $str);
}

私が考えることができる1つの可能性は、大量のを入力することで%あるため、サーバーは大量のメモリを割り当てる必要があります。これは機能しますか?

4

1 に答える 1

3

誰かがこれを悪用できますか?

SQLインジェクションの場合?いいえ。

イースターエッグのような行動のために?おそらく。この場合、ユーザーがこの検索で​​ワイルドカードを使用できないようにするには、次の2つの方法があります。

  1. 適切なエスケープワイルドカード(およびエスケープ文字)、

    str_replace(array('\\', '%', '_'), array('\\\\', '\\%', '\\_'), $str);
    // or:
    str_replace(array('|', '%', '_'), array('||', '|%', '|_'), $str);
    // with SELECT * FROM users WHERE username LIKE ? ESCAPE '|'
    
  2. またはLOCATE(substr, str) > 0完全一致を見つけるために使用します。

于 2013-03-18T12:17:13.520 に答える