ラボ > PHP:セキュリティ関連、サーバ:.htaccess、Xampp、linux系、Javascript関連:form

ローカル環境では問題無く、サーバーに反映してform送信を試すと403エラー

WIN + Xamppで試していたら問題なかったのにサーバーにアップして、form送信したら403エラーになる

作成日:2026-01-05, 更新日:2026-01-05

原因

WAF設定が有効になっていたため

状況

レンタルサーバーによってはWAFで拒否られていることがあるとか...
「WAFのログを見たら原因分かるかも?」と言われたので調べてみたら、「検出されたシグネチャ: oscmd-21」というのが出ていた

oscmd-21

シグネチャ oscmd-21 というのは、OSコマンドインジェクション を疑うルールらしい。サーバーを操作するコマンド(ls, cat, chmod, |, ; など)が含まれていると判断された際に発動...するとのこと

対策

  • WAFの無効化: 設定を無効化
  • WAFの無効化: .htaccessを使ってを無効化
  • 文字列を無効化

WAFの無効化: 設定を無効化

レンタルサーバーのWAF設定から無効にして確認(※設定からしばらく待つ。レンタルサーバーによって異なるかも?)

WAFの無効化: .htaccessを使ってを無効化

.htaccess にWAFの除外のルールを記述。とりあえず冒頭に下記のような記述。

▼ text# WAF除外設定 開始
<IfModule mod_siteguard.c>
    # ▼サイト全体で oscmd-21(OSコマンドインジェクション検知)を無効化
    # SiteGuard_User_ExcludeSig oscmd-21

    # URLに "●●●" が含まれる場合のみ除外(下記は、updateの場合)
    SetEnvIf Request_URI "update" SITEGUARD_DISABLE_SIG_oscmd-21
</IfModule>
# 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)); // 元に戻る