カテゴリ: PHP 更新日: 2026/01/20

PHPのXSS対策を完全ガイド!初心者でもわかる安全なWebアプリの作り方

PHP の XSS(クロスサイトスクリプティング)対策
PHP の XSS(クロスサイトスクリプティング)対策

先生と生徒の会話形式で理解しよう

生徒

「PHPのセキュリティでXSS対策ってよく聞くんですけど、そもそもXSSって何なんですか?」

先生

「XSSは『クロスサイトスクリプティング』と呼ばれる攻撃で、悪意のあるスクリプトがWebページに入り込む危険な問題だよ。」

生徒

「スクリプトってJavaScriptみたいなものですか?実際どういう被害が起きるんです?」

先生

「そう。JavaScriptが勝手に実行されてしまい、ログイン中のユーザー情報を盗まれることもあるんだ。今日はPHPで安全にするためのXSS対策を詳しく学んでいこう!」

-

1. XSS(クロスサイトスクリプティング)とは?初心者向けにやさしく解説

1. XSS(クロスサイトスクリプティング)とは?初心者向けにやさしく解説
1. XSS(クロスサイトスクリプティング)とは?初心者向けにやさしく解説

XSS(クロスサイトスクリプティング)とは、攻撃者が悪意を持って作成したJavaScriptなどのスクリプトを、ユーザーが閲覧するWebページに勝手に混入させ、実行させてしまう問題です。 初心者の方でもイメージしやすくすると、まるで「手紙の空白に勝手に落書きされ、その落書きに触るとスマホが勝手に動き出す」というようなイメージです。

PHPを使ってWebアプリケーションを作る場合、このXSSはとても重大なセキュリティ問題になります。 特にフォーム入力、コメント欄、検索フォーム、ユーザー名表示など「ユーザーが入力した内容をそのまま表示する場面」はXSS攻撃の代表的な入口です。

XSS攻撃で実際に起こる危険として以下のようなものがあります:

  • ユーザーのクッキー(ログイン情報)が盗まれる
  • 勝手に偽フォームが表示され情報が抜き取られる
  • サイトの画面が書き換えられる
  • ユーザーが意図しない動作を実行させられる

PHPで安全なWebアプリを作るためには、このXSS対策を「必須の基本知識」として身につける必要があります。 ここからは、初心者でも確実に理解できるように、実例を交えながらPHPで行うXSS対策を一つずつ解説していきます。

2. PHPで最も重要なXSS対策:htmlspecialchars() の使い方

2. PHPで最も重要なXSS対策:htmlspecialchars() の使い方
2. PHPで最も重要なXSS対策:htmlspecialchars() の使い方

PHPでXSS対策といえば、まず最初に覚えるべきが htmlspecialchars() という関数です。 この関数は、HTMLの特別な意味を持つ記号を無害化して表示してくれる働きをします。

たとえば、悪意ある攻撃者が次のような文字を入力したとします:


<script>alert('攻撃!');</script>

これをそのまま画面に表示すると、ブラウザがJavaScriptとして実行してしまい、攻撃が成立します。

そこで htmlspecialchars() を使います:


<?php
$user_input = "<script>alert('攻撃!');</script>";
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
?>

こうすると、ブラウザが特別な記号を文字として表示するため、攻撃コードは無害になります。 PHPで安全なWebアプリを作る上で最も重要な基本対策です。

3. ENT_QUOTES と UTF-8 を必ず指定する理由

3. ENT_QUOTES と UTF-8 を必ず指定する理由
3. ENT_QUOTES と UTF-8 を必ず指定する理由

htmlspecialchars() を使う時、よく初心者がやってしまうミスが「第2引数と第3引数を省略してしまう」ことです。

正しくは次のように指定します:


htmlspecialchars($value, ENT_QUOTES, 'UTF-8');

なぜこれが重要なのか、初心者向けに分かりやすく解説します。

● ENT_QUOTES を付ける理由

ENT_QUOTESは「シングルクォートとダブルクォートの両方をエスケープする」という設定です。 これがないと一部の攻撃を防げません。

● UTF-8 を指定する理由

文字コードを指定しないと、ブラウザによっては正しくエスケープが行われず、攻撃が成功してしまう場合があります。 PHPのWebアプリでは基本的にUTF-8を使用するため、必ず指定することが推奨されます。

4. 入力値を加工・検証する「入力バリデーション」も重要

4. 入力値を加工・検証する「入力バリデーション」も重要
4. 入力値を加工・検証する「入力バリデーション」も重要

XSS対策では表示前のエスケープだけでなく、入力の段階で値をチェックする「入力バリデーション」も重要です。 入力バリデーションとは、ユーザーが入力した内容が正しい形式か確認する作業です。

たとえば、メールアドレスならメール形式か、数字なら数字のみか、名前なら長すぎないか、などを確認します。 攻撃者は「本来入力されるはずのないデータ」を送り込み、そこから突破口を作ろうとするため、適切なバリデーションが安全性を高めます。

PHPでは filter_input()filter_var() を使うと簡単に検証できます。

-

5. JavaScriptに値を渡すときのXSS対策

5. JavaScriptに値を渡すときのXSS対策
5. JavaScriptに値を渡すときのXSS対策

画面に値を表示するだけでなく、JavaScript側にPHPの値を渡すときにも注意が必要です。 PHPでエスケープしても、JSの中身として解釈されると危険です。

安全に値を渡す方法は JSON エンコードです:


<?php
echo json_encode($value);
?>

JSONとして正しい形式にして渡すことで、意図していないコードが混入するリスクを避けられます。

6. PHPのテンプレートでのXSS対策

6. PHPのテンプレートでのXSS対策
6. PHPのテンプレートでのXSS対策

最近のPHP開発では、Blade(Laravel)やTwig(Symfony)などテンプレートエンジンを使うことが一般的です。

これらのテンプレートエンジンは基本的に「自動エスケープ機能」が備わっています。 そのため安全性が高まり、初心者でもXSS対策を正しく実践できます。

7. XSS対策のポイント整理

7. XSS対策のポイント整理
7. XSS対策のポイント整理

PHPでWebアプリケーションを作る際には、XSS対策が最重要事項です。 ここまで解説した htmlspecialchars() を中心に、入力バリデーション、JSONエスケープ、テンプレートエンジンの活用を行うことで、攻撃を大幅に防ぐことができます。

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

カテゴリの一覧へ
新着記事
New1
PHP
PHPのCookieセキュリティを完全ガイド!初心者でもわかるSecureとHttpOnlyの使い方
New2
PHP
PHPのCSRF対策を完全理解!トークンを使った安全なフォーム送信の仕組みを初心者向けに徹底解説
New3
PHP
PHPのSQLインジェクション対策を完全解説!初心者でも安全にデータベースを扱う方法
New4
PHP
PHPでカウントダウンタイマーを作る方法!初心者向けにやさしく解説
-
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonでテキストファイルを1行ずつ読み込む方法(readline() / readlines())
No.2
Java&Spring記事人気No2
PHP
初心者向けPHPでMySQLからデータを取得する方法(SELECT文)完全ガイド
No.3
Java&Spring記事人気No3
Python
Pythonのリストの重複を削除する方法を解説!初心者向けにsetとdict.fromkeysの使い方をやさしく説明
No.4
Java&Spring記事人気No4
Python
Pythonで経過時間を測る方法をやさしく解説!初心者向けtime.perf_counterとtime.sleepの使い方
No.5
Java&Spring記事人気No5
Python
Pythonでエラースタックトレースを表示・取得する方法を徹底解説!初心者向け例外処理入門
No.6
Java&Spring記事人気No6
Python
PythonでExcelファイル(.xlsx)を操作する方法を徹底解説!初心者でもできるopenpyxl・pandasの使い方
No.7
Java&Spring記事人気No7
PHP
PHPのOAuth認証をやさしく解説!Google・Facebookログインを初心者向けに実装しよう
No.8
Java&Spring記事人気No8
PHP
PHPのXSS対策を完全ガイド!初心者でもわかる安全なWebアプリの作り方
-
-