1

そのため、3 つの競合するもの (バインドされたパラメーター、正規表現、ユーザー入力を使用した部分一致検索) を安全に組み合わせる方法に頭を悩ませようとしていますが、これらを処理する正しい/安全な方法を発見したかどうかはわかりません。もの。これは珍しい問題ではありませんが、PDO と php の 3 つのセキュリティ要素すべての交差を扱うドキュメントは、見つけるのが難しいか存在しません。

私のニーズは比較的単純で標準的です。優先順位は次のとおりです。

  1. SQL インジェクションを防止したい (現在、バインドされたパラメーターを使用しています)
  2. 正規表現インジェクションを防ぎたい
  3. ユーザー入力文字列を使って部分一致で検索したい

したがって、たとえば、ユーザーが大文字と小文字を区別しない部分一致でユーザー名を検索できるようにしたい。たとえば、検索するとユーザー名が表示XiuされXiuXiuluさらにxiuislowercase

現在、私は次の声明を持っています:

select * from users where username ilike :search_string || '%'

他の場所では、次のように正規表現演算子を使用してより複雑なケースを使用します。

select * from users where username ~* :search_string || '%'

はphp pdo:search_stringのバインドされたステートメントであり、データベースはpostgresqlです。これは正しい検索を実行し、正しい結果を返します。バインドされたパラメーターであるため、SQL インジェクションに対する証拠であると確信しています。ただし、それが正規表現インジェクションに対する証明であるとは確信していません。また、正規表現インジェクションに対する証明と同時に、SQL インジェクションに対する証明を行う方法もわかりません。
PHP、PDO、およびpostgresqlを使用して、正規表現インジェクションに対しても完全に保護するにはどうすればよいですか?

4

1 に答える 1

2

LIKE正規表現をサポートしていません。パターンマッチングのメタ文字%とが制限されているだけ_です。したがって、パラメータ値を渡す前に文字列にバックスラッシュを付けてこれらの2つの文字をエスケープすると、安全になります。

<?php
$search_string = preg_replace('/[%_]/', '\\\\$0', $search_string);
$pdoStmt->execute(array('search_string'=>$search_string));

または、ユーザー名の左部分文字列を入力と比較して、メタ文字パターンマッチング機能のない固定文字列と比較することもできます。

select * from users where left(username, :search_string_length) = :search_string

コメントを再確認してください。

コードインジェクションを回避するための一般的なルールは次のとおりです。コードとして任意のユーザー入力を実行しないでください。

これはもちろんSQLインジェクションにも当てはまります。そのため、SQLステートメントの構文を変更するのではなく、パラメーターを使用してユーザー入力を値として解釈するように強制します。

ただし、SQL操作内の正規表現文字列の「コード」にも適用されます。正規表現はそれ自体が一種のコードロジックであり、入力を照合するための有限状態マシンの非常にコンパクトな表現です。

コードインジェクションを回避するための解決策は、(ホワイトリストのように)ユーザー入力にコードを選択させることは問題ありませんが、ユーザー入力をコードとして解釈させないことです。

于 2012-12-28T19:18:31.427 に答える