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を全消去されたり、または情報が漏洩したりと損害は計り知れません。
- SaaSで情報漏洩にあたる事例とは?注意すべきポイントと対策
![SaaSで情報漏洩にあたる事例とは?注意すべきポイントと対策 SaaSで情報漏洩にあたる事例とは?注意すべきポイントと対策]()
- ベクトル検索とは?仕組みからRAG・生成AIでの活用方法まで初心者向けに解説
![ベクトル検索とは?仕組みからRAG・生成AIでの活用方法まで初心者向けに解説 ベクトル検索とは?仕組みからRAG・生成AIでの活用方法まで初心者向けに解説]()
- Salesforceのプログラミング言語「Apex」を学べば案件獲得できるのか?フリーランスエンジニアが学ぶべき理由と現実
![Salesforceのプログラミング言語「Apex」を学べば案件獲得できるのか?フリーランスエンジニアが学ぶべき理由と現実 Salesforceのプログラミング言語「Apex」を学べば案件獲得できるのか?フリーランスエンジニアが学ぶべき理由と現実]()
- Open AIを利用した占いサイトの構築|AIで恋愛占いを身近なWebサービスへ
![Open AIを利用した占いサイトの構築|AIで恋愛占いを身近なWebサービスへ Open AIを利用した占いサイトの構築|AIで恋愛占いを身近なWebサービスへ]()
- AI駆動開発で注意すべきリスクとセキュリティー上の問題点
![AI駆動開発で注意すべきリスクとセキュリティー上の問題点 AI駆動開発で注意すべきリスクとセキュリティー上の問題点]()
- AI時代のスキルシートの書き方|エンジニアが評価される経験・スキルの伝え方
![AI時代のスキルシートの書き方|エンジニアが評価される経験・スキルの伝え方 AI時代のスキルシートの書き方|エンジニアが評価される経験・スキルの伝え方]()
- AI駆動開発 生成AIの無料枠と有料版で出るクオリティーの違いはあるのか?
![AI駆動開発 生成AIの無料枠と有料版で出るクオリティーの違いはあるのか? AI駆動開発 生成AIの無料枠と有料版で出るクオリティーの違いはあるのか?]()
- PHP・Laravel案件が減ってJava・Python・ノーコードが主流に?フリーランスエンジニアが今インプットすべきこと
![PHP・Laravel案件が減ってJava・Python・ノーコードが主流に?フリーランスエンジニアが今インプットすべきこと PHP・Laravel案件が減ってJava・Python・ノーコードが主流に?フリーランスエンジニアが今インプットすべきこと]()
- フリーランスエンジニア・業務委託でフルリモート案件が激減している理由
![フリーランスエンジニア・業務委託でフルリモート案件が激減している理由 フリーランスエンジニア・業務委託でフルリモート案件が激減している理由]()
S.E->Weekly Ranking;
S.E->プロフィール;














![Apple AirPods Pro[MWP22J/A]の偽物(コピー品)を正規品と徹底比較 Apple AirPods Pro[MWP22J/A]の偽物(コピー品)を正規品と徹底比較](https://www.programming-se.com/wp-content/uploads/2020/07/スクリーンショット-2020-07-13-0.00.32-300x176.jpg)






