カテゴリ: PHP 更新日: 2025/12/30

PHP の XSS(クロスサイトスクリプティング)対策を完全解説!初心者向けガイド

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

新人と先輩の会話形式で理解しよう

新人

「XSS って何ですか?」

先輩

「XSS は『クロスサイトスクリプティング』の略で、悪意のあるスクリプトをウェブサイトに埋め込み、ユーザーの情報を盗んだり、意図しない動作をさせたりする攻撃のことだよ。」

新人

「そんなことができるんですか? どういう仕組みなんでしょうか?」

先輩

「それじゃあ、XSS とは何か、どんな仕組みで攻撃されるのかを説明しよう!」

-

1. XSS とは?

1.  XSS とは?
1. XSS とは?

XSS(クロスサイトスクリプティング)は、悪意のあるスクリプトがウェブサイトに埋め込まれることで、ユーザーの個人情報を盗んだり、ページの内容を書き換えたりする攻撃のことです。

例えば、攻撃者が以下のようなスクリプトをフォームに入力し、それが適切に処理されずに表示されると、意図しない JavaScript が実行される可能性があります。


<input type="text" name="name" value="<script>alert('あなたの情報は盗まれました!');</script>">

このコードがそのままブラウザで実行されると、アラートが表示されてしまいます。これが XSS 攻撃の基本的な仕組みです。

2. XSS 攻撃の仕組み

2. XSS 攻撃の仕組み
2. XSS 攻撃の仕組み

XSS 攻撃にはいくつかの種類がありますが、基本的な流れは次のようになります。

1. ユーザーが入力フォームにスクリプトを埋め込む

例えば、コメント欄やお問い合わせフォームに JavaScript を記述し、それが適切に処理されないと、スクリプトがページ上で実行されます。

2. サーバーがスクリプトをそのまま保存し、他のユーザーに配信

ユーザーが入力した内容をデータベースに保存し、それを適切に処理せずに表示すると、スクリプトが実行される可能性があります。

3. 他のユーザーのブラウザでスクリプトが実行される

例えば、以下のような掲示板のコードがあるとします。


<?php
$name = $_POST['name'];
echo "こんにちは、" . $name . "さん!";
?>

このコードには適切なエスケープ処理が行われていないため、ユーザーが入力したスクリプトがそのまま実行される可能性があります。

4. ユーザーの情報が盗まれる

攻撃者がスクリプトを使ってクッキー情報を盗んだり、偽のログインフォームを表示させたりすると、被害が発生します。

5. XSS の危険性

XSS は次のような被害を引き起こします。

  • ユーザーの個人情報(クッキー、セッション情報)の盗難
  • 偽のログイン画面を表示し、ID・パスワードを盗む
  • ページの内容を改ざんし、悪意のある情報を表示する

このような攻撃を防ぐために、適切な XSS 対策を行う必要があります。

3. XSS の種類(反射型 XSS、格納型 XSS、DOM-based XSS)

3. XSS の種類(反射型 XSS、格納型 XSS、DOM-based XSS)
3. XSS の種類(反射型 XSS、格納型 XSS、DOM-based XSS)

XSS にはいくつかの種類があり、それぞれ攻撃の方法や影響が異なります。ここでは主に 3 つのタイプを解説します。

1. 反射型 XSS(Reflected XSS)

反射型 XSS は、ユーザーが入力したデータが即座にページ内で処理され、そのまま実行される攻撃のことです。URL に悪意のあるスクリプトを埋め込んで、ユーザーを誘導することが多いです。

例えば、以下のような PHP コードがあるとします。


<?php
if (isset($_GET['query'])) {
    echo "検索結果: " . $_GET['query'];
}
?>

この状態で、以下の URL にアクセスすると、スクリプトが実行されてしまいます。


http://example.com/search.php?query=<script>alert('攻撃成功');</script>

2. 格納型 XSS(Stored XSS)

格納型 XSS は、ユーザーの入力データがデータベースなどに保存され、後で別のユーザーがページを閲覧したときにスクリプトが実行される攻撃です。

例えば、掲示板やコメント欄にスクリプトを埋め込むと、そのまま保存され、他のユーザーが閲覧したときにスクリプトが動作してしまいます。


<?php
// データベースからコメントを取得
$comment = $db->query("SELECT comment FROM comments WHERE id = 1")->fetchColumn();
echo "コメント: " . $comment;
?>

このようなコードがあると、攻撃者がコメント欄に以下のスクリプトを投稿すると、他のユーザーのブラウザで実行されてしまいます。


<script>alert('クッキーを盗みました!');</script>

3. DOM-based XSS

DOM-based XSS は、サーバー側ではなく、JavaScript の DOM 操作によって発生する攻撃です。

例えば、以下のような JavaScript コードがあるとします。


<script>
document.getElementById("message").innerHTML = location.hash.substring(1);
</script>

このページに対して、以下の URL にアクセスすると、スクリプトが実行されます。


http://example.com/#<script>alert('攻撃成功');</script>

4. PHP における XSS の具体的な攻撃例

4. PHP における XSS の具体的な攻撃例
4. PHP における XSS の具体的な攻撃例

PHP の XSS 攻撃は、主にユーザー入力を適切に処理しないことで発生します。ここでは、具体的な攻撃例を紹介します。

フォーム入力を利用した XSS

例えば、以下のようなフォームがあるとします。


<form action="process.php" method="post">
    <input type="text" name="username">
    <button type="submit">送信</button>
</form>

このフォームの入力を適切に処理せずに表示すると、スクリプトが実行される可能性があります。


<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    echo "こんにちは、" . $_POST['username'] . "さん!";
}
?>

ここに以下のようなスクリプトを入力すると、攻撃が成功します。


<script>alert('攻撃成功');</script>
-

5. XSS を防ぐための基本的な対策方法(エスケープ処理、入力チェックなど)

5. XSS を防ぐための基本的な対策方法(エスケープ処理、入力チェックなど)
5. XSS を防ぐための基本的な対策方法(エスケープ処理、入力チェックなど)

XSS を防ぐためには、以下の基本的な対策を実施する必要があります。

1. エスケープ処理

出力時にエスケープ処理を行うことで、スクリプトがそのまま実行されるのを防ぎます。


<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8');
    echo "こんにちは、" . $username . "さん!";
}
?>

2. 入力チェック(バリデーション)

不要な文字列を除去し、意図しないデータが送信されないようにします。


<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = strip_tags($_POST['username']);
    echo "こんにちは、" . htmlspecialchars($username, ENT_QUOTES, 'UTF-8') . "さん!";
}
?>

3. HTTP ヘッダーの設定

HTTP ヘッダーを適切に設定することで、XSS 攻撃のリスクを軽減できます。


<?php
header("Content-Security-Policy: default-src 'self'; script-src 'self'");
?>

4. データベースの出力時もエスケープ処理

データベースから取得したデータを出力する際にも、必ずエスケープ処理を行いましょう。


<?php
// データベースから取得
$comment = $db->query("SELECT comment FROM comments WHERE id = 1")->fetchColumn();
echo "コメント: " . htmlspecialchars($comment, ENT_QUOTES, 'UTF-8');
?>

このようにすることで、スクリプトが実行されるのを防ぎます。

6. XSS を防ぐためのより高度な対策方法(CSP の導入、出力のサニタイズなど)

6. XSS を防ぐためのより高度な対策方法(CSP の導入、出力のサニタイズなど)
6. XSS を防ぐためのより高度な対策方法(CSP の導入、出力のサニタイズなど)

XSS を防ぐためには、基本的なエスケープ処理や入力チェックだけではなく、より高度なセキュリティ対策も必要です。ここでは「コンテンツセキュリティポリシー(CSP)」と「出力のサニタイズ」について解説します。

1. コンテンツセキュリティポリシー(CSP)の導入

コンテンツセキュリティポリシー(CSP)は、ブラウザに対して「どの種類のコンテンツを許可するか」を制御する HTTP ヘッダーです。これにより、悪意のあるスクリプトの実行を防ぐことができます。

■ 基本的な CSP の設定方法


<?php
header("Content-Security-Policy: default-src 'self'; script-src 'self';");
?>

この設定では、外部の JavaScript の読み込みを禁止し、自サイト内のスクリプトのみを許可することで XSS 攻撃のリスクを軽減します。

2. 出力のサニタイズ(無害化)

入力データのエスケープだけでなく、出力時にも「不要なタグを削除する」処理を行うことで、より安全にデータを扱うことができます。

■ HTML タグを削除する方法


<?php
$comment = "<script>alert('XSS 攻撃!');</script>こんにちは!";
$safeComment = strip_tags($comment);
echo $safeComment;
?>

このコードでは、strip_tags を使って、HTML タグを削除することでスクリプトの実行を防いでいます。

7. PHP でのセキュアなテンプレートエンジンの活用(Twig など)

7. PHP でのセキュアなテンプレートエンジンの活用(Twig など)
7. PHP でのセキュアなテンプレートエンジンの活用(Twig など)

PHP では、セキュリティを強化するために「テンプレートエンジン」を活用する方法があります。代表的なテンプレートエンジンのひとつに「Twig」があります。

1. Twig の特徴

Twig は、PHP の出力をより安全に行うためのテンプレートエンジンで、自動的にエスケープ処理を行う機能を持っています。

2. Twig のインストール

まず、Composer を使って Twig をインストールします。


composer require twig/twig

3. Twig の基本的な使い方

以下のようにして、Twig を使ったテンプレートの表示を行います。


<?php
require_once 'vendor/autoload.php';

$loader = new \Twig\Loader\FilesystemLoader('templates');
$twig = new \Twig\Environment($loader);

echo $twig->render('index.html', ['name' => "<script>alert('XSS');</script>"]);
?>

この場合、Twig は自動的にエスケープ処理を行い、悪意のあるスクリプトの実行を防ぎます。

8. PHP の XSS 対策を学ぶためのおすすめの方法

8. PHP の XSS 対策を学ぶためのおすすめの方法
8. PHP の XSS 対策を学ぶためのおすすめの方法

最後に、XSS 対策を学ぶためのおすすめの方法を紹介します。

1. OWASP(Open Web Application Security Project)を活用する

OWASP は、Web セキュリティに関する情報を提供する非営利団体で、XSS を含むさまざまなセキュリティリスクについて詳しく解説しています。

2. PHP の公式ドキュメントを読む

PHP の公式ドキュメントには、htmlspecialcharsstrip_tags などの関数の詳細な説明が記載されています。

3. セキュリティ専門のオンライン学習サイトを活用する

例えば、「TryHackMe」や「Hack The Box」などのサイトでは、XSS を実際に試しながら学ぶことができます。

これらの方法を活用して、XSS 対策のスキルを磨きましょう!

まとめ

まとめ
まとめ

ここまでの内容では、PHP で発生しやすい XSS の脅威と、その攻撃がどのような形でユーザー体験を損ない、さらに個人情報流出や不正操作へつながる危険性を持っているかを、段階的な説明とともに学んできました。日常的に利用されている掲示板やコメント機能、検索フォームなど、さりげない操作の裏側で発生し得る脆弱性は、初心者の学習段階では見落とされがちです。しかし、基本的なエスケープ処理や入力チェックを丁寧に行うだけで、想像以上に広い範囲の攻撃への対策が可能になります。とくにエスケープ処理はPHPの開発では欠かせない基礎であり、どんな規模のアプリケーションにも常に必要とされる重要な工程です。 また、最近ではコンテンツセキュリティポリシーの設定やサニタイズ処理の導入など、一段高いレベルの対策も求められるようになっています。複雑に見える対策でも、一度しくみを理解してしまえば、実践の場面で落ち着いて適用できるようになります。さらにテンプレートエンジンであるTwigのように、安全性を高める工夫があらかじめ施された仕組みを利用することにより、開発者自身の負担を軽減しつつ、堅牢なアプリケーションを実現することもできます。 XSS の仕組みを勉強することは、単なる攻撃の知識ではなく、安全なウェブアプリケーションを構築するうえで欠かせない基盤づくりです。ふだん何気なく利用しているフォームや表示部分が、どれほど細かい工程を経て安全に動いているのかを理解すると、PHP 開発に対する視野も自然と広がります。攻撃者は思わぬ入力欄を狙ってスクリプトを埋め込むため、細かい気配りが開発者に求められますが、そのぶん対策できたときの安心感も大きく、知識として確実に身につけておきたい分野といえます。 さらに実務では、入力値が複雑化したり、多数のユーザーが投稿を行うサービスなどでは、出力処理の丁寧さがとくに重要とされます。エスケープするタイミングを誤れば意図しない表示になることもありますが、適切な場面で適切な関数を使い分けることでトラブルを未然に防ぎ、利用者に安心してサービスを使ってもらえる環境を作れます。難しく感じるかもしれませんが、基本を積み重ねれば自然と応用も見えてきます。 以下では、記事の学習内容をより深く理解できるよう、まとめとしてシンプルなサンプルプログラムも添えています。エスケープ処理やバリデーションを実際に試しながら動きを確かめることで、知識の定着もよりスムーズになります。初学者のうちはとくに、動かして試すことが最も大切です。ぜひここまでの知識を振り返りながら、堅牢なアプリケーションがどう作られているのかを感じ取ってみてください。

安全な出力処理のサンプルコード


<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $username = strip_tags($_POST['username']);
    $safeName = htmlspecialchars($username, ENT_QUOTES, 'UTF-8');
}
?>
<form method="post">
    <input type="text" name="username">
    <button type="submit">送信</button>
</form>
<?php if (!empty($safeName)) : ?>
<p>こんにちは、<?= $safeName ?> さん!</p>
<?php endif; ?>
先生と生徒の振り返り会話

生徒

「今日の学習で、XSS ってただの技術的な話じゃなくて、ふだん使っているサービスの安全性そのものに関わるテーマだってわかりました。とくに出力するときのエスケープ処理が大切なんですね。」

先生

「その通り。スクリプトがそのまま動いてしまうと、簡単に情報が盗まれたり画面が書き換えられてしまうからね。入力された内容をそのまま信用しないことが基本なんだよ。」

生徒

「strip_tags とか htmlspecialchars を使う意味が、実際のコードを見て理解できました。Twig のようなテンプレートエンジンが便利って言われる理由もわかります。」

先生

「テンプレートエンジンは安全な出力を助けてくれる強い味方だからね。サービスが大きくなるほど恩恵も大きいよ。今のうちに基本をしっかり覚えておくと、この先の開発がぐっと楽になるはずだよ。」

生徒

「はい!今回の学習をもとに、これからは表示処理にもっと気をつけて、安全なコードを書けるように頑張ります。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

PHPでXSS(クロスサイトスクリプティング)って何をされる攻撃なんですか?

XSSとは、PHPで作られたウェブサイトに悪意あるスクリプトを埋め込んで、ユーザーのクッキー情報を盗んだり、偽のログイン画面を表示させるなどの被害を与える攻撃です。
コメント
コメント投稿は、ログインしてください

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

カテゴリの一覧へ
新着記事
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
PHP
PHPのXSS対策を完全ガイド!初心者でもわかる安全なWebアプリの作り方
No.6
Java&Spring記事人気No6
Python
PythonでExcelファイル(.xlsx)を操作する方法を徹底解説!初心者でもできるopenpyxl・pandasの使い方
No.7
Java&Spring記事人気No7
Python
Pythonでエラースタックトレースを表示・取得する方法を徹底解説!初心者向け例外処理入門
No.8
Java&Spring記事人気No8
PHP
PHPのOAuth認証をやさしく解説!Google・Facebookログインを初心者向けに実装しよう
-
-