ホームページ > バックエンド開発 > Golang > 未検証のユーザー入力を使用して PostgreSQL の LIKE 式でリテラル パターン マッチングを実現するにはどうすればよいですか?

未検証のユーザー入力を使用して PostgreSQL の LIKE 式でリテラル パターン マッチングを実現するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-21 05:00:12
オリジナル
530 人が閲覧しました

How Can I Achieve Literal Pattern Matching in PostgreSQL LIKE Expressions with Unvalidated User Input?

未検証のユーザー入力に対する PostgreSQL の LIKE 式のリテラル パターン マッチング

PostgreSQL でユーザー入力を LIKE パターンと照合する場合、エスケープすることが重要ですリテラル一致を保証するために、「_」や「%」などの特殊なパターン文字を使用します。 PostgreSQL では、これらの文字をバックスラッシュ () または ESCAPE 句で定義されたカスタム エスケープ文字を使用して引用符で囲む必要があります。

たとえば、「rob」を文字通り一致させるには、アンダースコアまたはを含むユーザー入力をエスケープする必要があります。パーセント記号。ただし、ここには潜在的な落とし穴があります。ユーザー入力にバックスラッシュも含まれている場合は、バックスラッシュもエスケープする必要があります。これは複雑になり、バグにつながる可能性があります。

サーバー側のソリューション

これを適切に処理するには、PostgreSQL の replace() 関数を利用して、特殊文字を特殊文字に置き換えることができます。エスケープされたバージョン。このアプローチにはいくつかの利点があります。

  • サーバー上で実行されるため、クライアント側での処理が不要になります。
  • すべての必要な文字がエスケープされ、一貫性が保証されます。
  • ユーザー入力にアンダースコアやパーセント記号に加えて特殊文字が含まれている場合でも、シームレスに機能します。

たとえば、「rob」を文字通り検索するには、次のクエリを使用できます。

SELECT * FROM users WHERE name LIKE replace(replace(replace(,'^','^^'),'%','^%'),'_','^_') ||'%' ESCAPE '^'
ログイン後にコピー

このクエリ内:

  • $1 はユーザー入力のプレースホルダーです。
  • replace($1,'^','^^') はキャレットをエスケープします。入力文字列内の文字 (^)。
  • replace(replace($1,'^','^^'),'%','^%') は、入力内のパーセント記号 (%) をエスケープします。 string.
  • replace(replace(replace($1,'^','^^'),'%','^%'),'_','^_') はアンダースコア (_) をエスケープします。 ) を入力文字列に含めます。
  • ||'%' は、前方一致の検索文字列の末尾にパーセント記号を追加します。
  • ESCAPE '^' はエスケープ文字として「^」を指定し、許可します。

結論

サーバー側の置換とカスタム エスケープ文字を使用することで、リテラル パターン マッチングを確実に行うことができます。未検証のユーザー入力に対する PostgreSQL の LIKE 式。このアプローチは堅牢で、インジェクションの脆弱性を回避し、コードを簡素化します。

以上が未検証のユーザー入力を使用して PostgreSQL の LIKE 式でリテラル パターン マッチングを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート