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->お勧め記事;
- macOS Monterey にアップデート後、composerやhomebrewでenv: php: No such file or directoryが出る
- CrowdWorks 提案後、受注に繋がりました。提案〜契約までの流れを解説
- PHP フレームワーク Laravel ディレクティブ – ループ変数 $loop –
- XSERVERにSSHを利用してLaravel環境を構築する
- ノートン 360 スタンダード プラス1 3年3台 自動更新版 14,000円が【64%OFF!】で4,980円
- CrowdWorks いつの間にか「プロクラウドワーカー」になっていた
- マカフィー リブセーフ 3年版が特価3,000円!! 18,480円が【83%OFF!】2023/10/22(日)まで
- Shopify APIを利用して在庫管理を行う
- Panic Nova 購入から1年が過ぎライセンスの更新時期の注意点
S.E->PR;
チームのタスク管理ツール【backlog】
FREENANCE(フリーナンス)
S.E->Weekly Ranking;
S.E->プロフィール;

