作成日:2025-12-31,
更新日:2025-12-31
## 概要 WIN + Xamppで試していたら問題なかったのにサーバーにアップして、form送信したら403エラーになる ## 原因 WAF設定が有効になっていたため ### 状況 レンタルサーバーによってはWAFで拒否られていることがあるとか... 「WAFのログを見たら原因分かるかも?」と言われたので調べてみたら、「**検出されたシグネチャ: oscmd-21**」というのが出ていた ### oscmd-21 **シグネチャ oscmd-21** というのは、**OSコマンドインジェクション** を疑うルールらしい。サーバーを操作するコマンド(ls, cat, chmod, |, ; など)が含まれていると判断された際に発動...するとのこと ## 対策 * WAFの無効化: 設定を無効化 * WAFの無効化: .htaccessを使ってを無効化 * 文字列を無効化 ### WAFの無効化: 設定を無効化 レンタルサーバーのWAF設定から無効にして確認(※設定からしばらく待つ。レンタルサーバーによって異なるかも?) ### WAFの無効化: .htaccessを使ってを無効化 `.htaccess` にWAFの除外のルールを記述。とりあえず冒頭に下記のような記述。 ```text # WAF除外設定 開始# ▼サイト全体で oscmd-21(OSコマンドインジェクション検知)を無効化 # SiteGuard_User_ExcludeSig oscmd-21 # URLに "●●●" が含まれる場合のみ除外(下記は、updateの場合) SetEnvIf Request_URI "update" SITEGUARD_DISABLE_SIG_oscmd-21 # WAF除外設定 終了 ``` ### 文字列を無効化 WAFを無効化したくない・出来ない場合、文字列を変換する 1. 送信時にbase64に変換 2. 受取りはデコードする **送信時にbase64に変換** ```javascript // 送信ボタンが押された時の処理 const textarea = document.querySelector('〇〇'); const encodedData = btoa(encodeURIComponent(textarea.value)); textarea.value = encodedData; ``` **受取りはデコード** ```php $rawContent = $_POST[〇〇〇]; $content = urldecode(base64_decode($rawContent)); // 元に戻る ```