\xe3\x83\xbc … のような \x 始まりのエンコードがされた文字列について

時折 Apache のログで見かける \xe3\x83\xbc … のような \x 始まりのエンコードがされた文字列の正体がようやく分かったのでメモ。

経緯

事の発端は、 Apache のログを眺めていると時折

\xe3\x83\x87\xe3\x83\xbc\xe3\x82\xbf\xe3\x83\x99\xe3\x83\xbc\xe3\x82\xb9\xe3\x82\xa8\xe3\x83\xa9\xe3\x83\xbc

のような何某かのエンコードがされた文字列を見かけることがあったのですが

長らくその正体が杳として知れない状態が続いていました。

調査

ところが、別件で検索していたら、偶然正体が分かったのでメモ。

これは Apache 2.2.25 で修正されたログ出力の脆弱性対策とのこと。

具体的には、

  • Apache のログを CLI やシェルスクリプトで処理する際に、制御文字を含ませることで意図しない動作を引き起こすことを防ぐためにあえてエスケープするようになった
    • 特にこうした作業をするのは管理者権限のケースが多いと想定されるため
  • これにより、日本語などの文字列のパーセントエンコーディングの際に %\x に変換している

ということ。

てっきり UTF-8 や UTF-16 の特殊形のようなものかと思ったのですが、実際はパーセントエンコーディングの変形に過ぎなかった、と。

ルールさえ分かればデコードも楽にできますね。ただ、わざわざ脆弱性対策のためにエスケープしているので無暗に元に戻さない方が良いのではありますが、ログを確認する際に読めないのは困るのでサンドボックス内等でケースバイケースで、という感じでしょうか。

参考

サンプルケース

正体

変換フォーム

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。