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_NOQUOTES 利用時は変換されない
‘(シングルクォート)'ENT_NOQUOTESENT_COMPAT 利用時は変換されない
<(小なり)&lt;
>(大なり)&gt;

また、引数の「flags」「encoding」は省くことができます。

flags」の値として用意されているものの中で主に利用するのは下記の3種となります。
基本的には「”」「’」を変換する「ENT_QUOTES」を利用します。

定数名処理内容
ENT_COMPAT(デフォルト値)ダブルクオートは変換しますがシングルクオートは変換しません。
ENT_QUOTESシングルクオートとダブルクオートを共に変換します。
ENT_NOQUOTESシングルクオートとダブルクオートは共に変換されません。

encoding」は利用している文字コードを明示することができます。
「UTF-8」や「Shift_JIS」「EUC-JP」などが引数として指定することができます。

XSS(クロスサイトスクリプティング)の脆弱性があるかの簡単な確認方法

作成したフォームにXSS(クロスサイトスクリプティング)の脆弱性があるか、確認する方法に<input type=”text”>に「<script>alert(‘BAD!!!’);</script>」を埋め込みアラートが実行されるとエスケープ処理の必要があることがわかります。「<」「>」「’」がエスケープされずにそのまま実行されているためです。

「WAF」サーバーでのセキュリティー対策

現在、Webアプリケーションの脆弱性をサーバー側で受け付けなくするための「WAF(Web Application Firewall)」が導入されているサーバーが多くあります。WAFを導入しているサーバーでは上記の確認方法ではWAFにブロックされるため確認することができません。

セキュリティー対策は必須

Webアプリケーションを開発する上でセキュリティー対策は必須となります。
セキュリティー対策を疎かにすることによって最悪サーバーのroot権限を取られたり、DBを全消去されたり、または情報が漏洩したりと損害は計り知れません。

created by Rinker
Webアプリケーションにはなぜ脆弱性が生まれるのか?脆弱性を解消するにはどうプログラミングすればよいか?PHPサンプルへの攻撃を通して脆弱性が生まれる原理と具体的な対処方法が学べる!
created by Rinker
「この目的を実現するためには、どの文法テクニックが適合しやすいだろう」?「このプログラムをより読みやすくするために、どんなアプローチができるだろう」?といったことを思考しつつ、「とりあえずは動く」だけで終わらない、現場に求められる品質を形にするための知識とテクニックを解説します。
created by Rinker
Webアプリケーションの定番言語であるPHPの基礎から実践までを、上下巻のフルボリュームで集大成。「この目的を実現するためには、どの文法テクニックが適合しやすいだろう」?「このプログラムをより読みやすくするために、どんなアプローチができるだろう」?

コメントする

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)