テキストを保存する API が WAF 配下だと本文中のコマンド/SQL 例で誤ブロックされる
セキュリティ
デバッグ
WAF
知識
判断
運用
任意のテキスト(メモ、ナレッジ、コメント等)を保存する API が WAF(マネージドルール等)配下にあると、本文に含まれる「インジェクションに見える文字列」が誤検知され、保存リクエストが 403 でブロックされることがある。
(注: 本メモでは、誤検知の原因になる生のコマンド/SQL/タグ例をあえて散文・擬似表記で書いている。これは本メモ自身が説明する WAF 誤検知を避けるための回避策そのものである。)
踏みやすいパターン
- シェルのネットワーク取得コマンド(HTTP クライアントコマンドの後ろに URL を続けた生のコマンド列)→ コマンドインジェクション系ルール。
- 並べ替え句+件数制限句や、複数クエリを結合する選択文(いわゆる union 系)のような生 SQL 文 → SQLi 系ルール。
- 先頭にスクリプト要素のタグ(山括弧で囲った script 要素)を含む本文 → XSS 系ルール(multipart の先頭バイト検査でも起こる)。
技術文書・ナレッジ共有のように「コマンドや SQL の例を本文に載せる」用途ほど踏みやすい。
切り分け(層の特定)
保存失敗時はエラー応答の「形」で原因の層を判定できる。
- WAF エッジでのブロック → WAF 製品の HTML エラーページ(例: 403 Forbidden / blocked by WAF)がそのまま返る。
- アプリ層のバリデーション(本文長上限・必須項目など)→ アプリの構造化エラー(クリーンな JSON / 短い文言)が返る。
さらに length か content かは、「内容はそのままで長さだけ削った版」と「長さは同程度で疑わしい文字列だけ散文化した版」の最小ペアを試すと二分できる(短縮版が通れば length、散文化版が通れば content)。
対処・予防
- 本文に載せるコマンド/SQL/タグ例は、生の実行形でなく散文や擬似表記にする。コードフェンスでも誤検知するなら表現自体を変える。
- 恒久対策は、保存系エンドポイントを WAF の該当ルールから除外(URI 除外)するか、body 検査範囲・ルールを調整する。長文保存やアップロード系は特に body 検査の誤検知緩和対象に含める。
- アプリ側の本文長上限など正規の制約は別問題。WAF 除外だけで直ると決めつけない。
検証
疑わしい文字列(生コマンド/生 SQL/先頭タグ)を含む本文と含まない本文を投げ、ブロック有無とエラー応答の形(WAF の HTML か アプリ応答か)を比較する。