前の記事では、
PHPで バリデーション(入力チェック) を行い、
「正しいデータだけを処理する」方法を学びました。
しかし、
それだけでは セキュリティとしては不十分 です。
ユーザー入力には、
・悪意のある文字列
・意図しないスクリプト
が含まれる可能性があります。
その代表例が、
XSS(クロスサイトスクリプティング) です。
この記事では、
XSSとは何か、なぜ危険なのか、どう防ぐのか を
コード付きで分かりやすく解説します。
この記事で学べること
・XSSとは何か
・XSSが起きる仕組み
・実際に何が起こるのか
・PHPでの基本的な対策方法
・バリデーションとの違い
XSSとは何か
XSS(Cross Site Scripting)とは、
ユーザーが入力したスクリプトが、そのまま実行されてしまう脆弱性
のことです。
本来はただの文字として扱うべき内容が、
・HTMLとして解釈され
・JavaScriptとして実行される
ことで、
深刻な被害につながります。
XSSが起きる典型例
まずは、
危険な例 を見てみましょう。
危険な例:そのまま表示する
このコードでは、
・入力された内容を
・一切加工せず
・そのまま画面に表示
しています。
悪意ある入力がされた場合
もし、
ユーザーが次のような内容を入力したらどうなるでしょうか。
この入力がそのまま表示されると、
・スクリプトが実行される
・アラートが表示される
という状態になります。
これが XSS です。
XSSで何が起こるのか
XSSが成立すると、
次のような被害が発生します。
・偽の画面を表示される
・入力内容を盗まれる
・Cookieを不正に取得される
・なりすましが行われる
単なるアラート表示では済まず、
ユーザー被害に直結する脆弱性 です。
なぜXSSが起きるのか
XSSが起きる原因は、
非常にシンプルです。
「ユーザー入力を信用して、そのまま出力している」
これに尽きます。
バリデーションは
「正しい値か」をチェックしますが、
XSS対策は
「安全に表示できるか」を考えます。
XSS対策の基本は「エスケープ」
XSSを防ぐための基本対策は、
エスケープ処理 です。
エスケープとは、
・HTMLとして意味を持つ文字を
・ただの文字として扱う
ように変換することです。
PHPでの基本的なXSS対策
PHPでは、
次の関数を使うのが基本です。
・htmlspecialchars
安全な例:エスケープして表示する
コードの解説
・htmlspecialchars
→ 特殊文字をHTMLエンティティに変換
・ENT_QUOTES
→ シングル・ダブルクォートも変換
・UTF-8
→ 文字コード指定
これにより、
・< や >
・" や '
が、
ただの文字として表示 されます。
バリデーションとXSS対策の違い
ここは非常に重要です。
・バリデーション
→ 入力が正しいか
・XSS対策
→ 表示して安全か
役割がまったく違います。
バリデーションをしていても、
XSS対策は必須 です。
「保存時」ではなく「出力時」に対策する
XSS対策の基本原則です。
エスケープは「表示する直前」に行う
理由は、
・保存形式を壊さない
・用途に応じて出力方法が変わる
ためです。
入力時ではなく、
出力時に必ずエスケープ
と覚えてください。
初心者がよくやる危険なミス
XSS対策で多いミスです。
・バリデーションだけで安心する
・一部の出力だけ対策する
・エスケープを忘れる
「ユーザー入力を表示する」
=
「XSS対策が必要」
この意識を常に持ちましょう。
XSSは必ず対策する前提で考える
実務では、
・XSSが起きないようにする
ではなく
・XSSが起きる前提で対策する
という考え方が基本です。
これは、
プロ・初心者に関係ありません。
まとめ
XSSは、
・ユーザー入力を
・そのまま表示することで
・発生する脆弱性
です。
対策の基本は、
・出力時にエスケープ
・htmlspecialchars を使う
この2点です。
ここまで理解できれば、
PHPフォーム処理の安全性は一段階上 に進みます。
次に読むべき記事
▶ 次の記事
6-11 CSRFとは?仕組みと対策
▶ 関連記事
6-9 PHPのバリデーションとは何か



コメント