質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

1130閲覧

URLの正規表現で特定の文字列が1つの場合のみマッチさせたい

juso

総合スコア2

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2020/09/01 05:11

編集2020/09/01 06:01

実現したいこと

PCREの正規表現で想定していないクエリを含んだURLへのアクセスをAWS WAFにて拒否しようとしています。
例えば、パラメータを複数つけられた以下のようなidが複数存在するケースを除外し、1つだけのパラメータがつけられたものにマッチさせたいと考えています。

  • マッチさせたい文字列(id=が1つだけ)

https://www.example.co.jp?id=3

  • マッチさせたくない文字列(id=が2つ以上)

https://www.example.co.jp?id=3&id=3&id=3

条件

AWS WAFの制約により、後方参照と部分式取得はサポートされていない環境です。

質問

/(id=*){1}/のような形で正規表現を書いた場合、複数であったとしてもマッチしてしまいました。

「特定の文字列が1つのみの場合マッチさせる」という正規表現は、どのようにすれば満たせるのでしょうか?
正規表現に初めて触れているため、拙い質問で恐縮ですがよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

juso

2020/09/01 05:53

ご返信ありがとうございます。 存在しないURLという文言は不適切でした。 あくまでこちらが「想定していないクエリを含むURLに対して」という意味に修正致しました。
yambejp

2020/09/01 06:02 編集

ちなみに言語はperlなのでしょうか?phpとかでもいいですか? 想定は「スラッシュ間にid=n」は1つだけ・・・という条件でいいですか? /aid=1/bid=2/的なことは起こり得ないのでしょうか?
juso

2020/09/01 06:03

AWS WAFのパターンセットによる制御をしようとしています。 内部的にはperlと同様の記法になります。
yambejp

2020/09/01 06:05

あ、パラメータでも不正をチェックするのですね 一般に?id=1&id=2&id=3の場合、最後のid=3が採用されます チェックボックスなどでよく使われるので、URLをフィルタするのはあまり 好ましくありません
juso

2020/09/01 06:21

前提の情報不足申し訳ありません。例としてidを出しましたが、実際はidではなく入力されるフォームも存在しません。 意図した攻撃からサーバー側を守るためのフィルタとお考え頂ければと存じます。
yambejp

2020/09/01 06:23

サーバー側の処理ならgetで受けて処理するだけでは? urlを前提にするところがよくわからないのですが・・・
juso

2020/09/01 06:33

サーバー側のメモリ高負荷を解消するための手段として、負荷がかかっているURLアクセスをサーバー前段で排除したいのが目的です。 他の方法でも検討していますが、選択肢として正規表現で該当のパターンを排除できるのか?という点について確認したいものになります。
guest

回答2

0

ベストアンサー

/(id=.?){2}|^(?!.?id=).*$/
とかして否定をとればいけるかもしれません

投稿2020/09/01 06:45

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

juso

2020/09/01 07:22

ご回答ありがとうございます。検討させていただきます。
guest

0

perl記法ということなので、、、

perl

1 if (/id=.*/) { 2 unless (/id=.*?id=.*/) { 3 print $_; 4 } 5 } 6

自分の技量では2つに分けないと書けませんでした。。。

投稿2020/09/01 06:33

DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

juso

2020/09/01 07:22

ご回答ありがとうございます。検討させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問