PHP セキュリティー フォームから送信したデータをエスケープする

お問い合わせフォームや会員登録フォームなど、エンドユーザーに公開されているページは攻撃の対象となります。フォームでの主な攻撃としてはXSS(クロスサイトスクリプティング)です。
この攻撃に対してPHP側ではHTMLエスケープの処理を行う必要があります。

この記事の著者 ->S.E; です。
普段は、システム開発に必要なヒアリング、システムの要件定義、設計からプログラマとしてWebサイトやWebアプリケーションの開発、WordPressでのブログの執筆やサーバー運用・管理を行っています。
このページは「未経験の為のプログラミング講座 ゼロから始めるPHPプログラミング〜初級から実践編までを網羅〜」としてPHPの基本的な部分を【初級編】【中級編】【上級編】に分けて解説しています。最終的には簡単なフォームやシステム開発をフルスクラッチで行うことを目的としています。また、参考になる書籍なども紹介しています。
XSS(クロスサイトスクリプティング)とは?
XSS(クロスサイトスクリプティング)とは悪意のあるコードを埋め込まれたフォームを経由し、他サイト(XSSの脆弱性があるサイト)へ不正な値を送信し、クッキー情報を盗まれ悪用されたりするなど大きな被害を生んでしまいます。

XSS(クロスサイトスクリプティング)を防ぐ方法
XSS(クロスサイトスクリプティング)を防ぐ方法は、GETやPOSTで送信されたデータをそのまま利用するのではなくHTMLエスケープの処理をし、利用することで防ぐことが可能です。
エスケープの処理をする関数は組み込み関数、特殊文字を HTML エンティティに変換する「htmlspecialchars( string , flags, encoding )」を利用します。
変換対象となる文字は下記の表のようになります。
変換前 | 変換後 | 備考 |
---|---|---|
&(アンパサンド) | & | – |
“(ダブルクォート) | " | 利用時は変換されない |
‘(シングルクォート) | ' | 、ENT_COMPAT 利用時は変換されない |
<(小なり) | < | – |
>(大なり) | > | – |
また、引数の「flags」「encoding」は省くことができます。
「flags」の値として用意されているものの中で主に利用するのは下記の3種となります。
基本的には「”」「’」を変換する「ENT_QUOTES
」を利用します。
定数名 | 処理内容 |
---|---|
ENT_COMPAT (デフォルト値) | ダブルクオートは変換しますがシングルクオートは変換しません。 |
ENT_QUOTES | シングルクオートとダブルクオートを共に変換します。 |
| シングルクオートとダブルクオートは共に変換されません。 |
「encoding」は利用している文字コードを明示することができます。
「UTF-8」や「Shift_JIS」「EUC-JP」などが引数として指定することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php $_POST['post_data01'] = '<div class="className">'; $_GET['post_data01'] = "<?php echo 'エスケープ';?>"; // ポストで送信されたデータをエスケープ処理 $post_data01 = htmlspecialchars( $_POST['post_data01'], ENT_QUOTES ); // ゲットで送信されたデータをエスケープ処理 $get_data01 = htmlspecialchars( $_GET['post_data01'], ENT_QUOTES ); echo $post_data01; echo $get_data01; ?> // 結果 <div class="className"> <?php echo 'エスケープ';?> |
XSS(クロスサイトスクリプティング)の脆弱性があるかの簡単な確認方法
作成したフォームにXSS(クロスサイトスクリプティング)の脆弱性があるか、確認する方法に<input type=”text”>に「<script>alert(‘BAD!!!’);</script>」を埋め込みアラートが実行されるとエスケープ処理の必要があることがわかります。「<」「>」「’」がエスケープされずにそのまま実行されているためです。
「WAF」サーバーでのセキュリティー対策
現在、Webアプリケーションの脆弱性をサーバー側で受け付けなくするための「WAF(Web Application Firewall)」が導入されているサーバーが多くあります。WAFを導入しているサーバーでは上記の確認方法ではWAFにブロックされるため確認することができません。
セキュリティー対策は必須
Webアプリケーションを開発する上でセキュリティー対策は必須となります。
セキュリティー対策を疎かにすることによって最悪サーバーのroot権限を取られたり、DBを全消去されたり、または情報が漏洩したりと損害は計り知れません。
S.E->お勧め記事;
- PHPフレームワーク「Laravel」ディレクティブ-分岐処理(条件分岐)-
- PHPフレームワーク「Laravel」Bladeテンプレートを利用する
- PHPフレームワーク「Laravel」ルーティング Route::get()
- PHPフレームワーク「Laravel」PHPテンプレートを利用する
- PHPフレームワーク「Laravel」MVCとコントローラを利用する
- PHPフレームワーク「Laravel」ファイル構造
- PHPフレームワーク「Laravel」ディレクティブ-繰り返し処理(ループ処理)-
- プログラマー になる為に必要な プログラミング以外 の知識・スキル
- PHP フレームワーク Laravel ディレクティブ – ループ変数 $loop –
S.E->PR;
チームのタスク管理ツール【backlog】
FREENANCE(フリーナンス)
S.E->Weekly Ranking;
S.E->プロフィール;

