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エンティティ(<, > など)に変換できるやつです。
User-Agentは基本的にエスケープ処理しても困ることはない!
最後に
私自身、自分で開発しているWebサービスにUser-Agentでスクリプトを埋め込まれてそれがログに残ってそれを見るための管理画面を確認したところリダイレクトさせられたことがあります。
マジで気を付けてください。
もちろんPHPに限らず