作成日: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)); // 元に戻る
```