1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHPAdvent Calendar 2024

Day 21

【PHP】User-Agent によるXSS攻撃に気を付けるべき

Last updated at Posted at 2024-12-21

User-Agentとは

アクセスしたユーザーが利用しているブラウザやOSなどのソフトウェア情報のことですが...
そのはずが、めちゃくちゃなことになってます。

レスポンシブ対応やアクセス解析、ログ記録などのために使われていましたが、互換性やらの理由でごちゃごちゃしているのも事実。
ブラウザの特定方法が以下に記載されていました。

PHP での取得方法

PHP (ウェブ実行) では$_SERVERという配列のスーパーグローバル変数が使えます。
このグローバル変数にはサーバーに関する情報が入っており、以下のようにHTTP_USER_AGENTというキーを指定することでUser-Agentを取得できます。

echo $_SERVER['HTTP_USER_AGENT'];
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36

注意すべき点

User-Agent って簡単に偽装できます。
なのでアクセス解析やらする場合も完全な信憑性があるとは言えません。

あと、偽装できるということは、そう。
XSS攻撃されかねないということです。

私もまさかUser-AgentでXSS攻撃できるとは思ってもいませんでした。

User-Agent に<script>...</script>が埋め込まれており、User-Agentのログを取ってそのまま表示させるとそれが実行されてしまうのです。

以下のようなJavaScriptがUser-Agentに埋め込まれてリクエストされたとします。

<script>alert('XSS!');</script>

そのUser-AgentをPHP側で取得してそのままの状態で保存し、ログ画面で出力すると実行されてしまいます。
(MimeTypeがtext/plainならば問題ありませんが、text/html であればブラウザ側でHTMLとして処理されるので)

HTMLエスケープ処理をせよ

つまり、ウェブサービスなどを作る上でUser-AgentをHTMLで表示させるときは、必ずHTMLのエスケープ処理をすべき。

echo htmlspecialchars($_SERVER['HTTP_USER_AGENT'], ENT_QUOTES);

念のためにENT_QUOTES (", ')もしておくこと
(例えば、<a href="$user-agent"> ← あんまリンクとかで使うことはないだろうけど念には念を、属性でのXSS対策もしておくと安全?)

PHP の htmlspecialchars() は、HTMLエスケープを行うPHP標準の関数で、特殊文字(<, >など)をHTMLエンティティ(&lt;, &gt; など)に変換できるやつです。

User-Agentは基本的にエスケープ処理しても困ることはない!

最後に

私自身、自分で開発しているWebサービスにUser-Agentでスクリプトを埋め込まれてそれがログに残ってそれを見るための管理画面を確認したところリダイレクトさせられたことがあります。
マジで気を付けてください。

もちろんPHPに限らず

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?