【PHP】htmlspecialcharsの使い方を分かり易く解説!
phpのhtmlspecialchars関数は、 HTMLタグ(例:「&」、「”」、「’」、「<」、「>」)
などに使われる特殊文字をエンティティに変換します。
XSS等による攻撃を防ぐためにhtmlspecialchars関数はよく使われます。
ここでは、htmlspecialchars関数の基本的な使い方と、
エスケープ処理をしないとどうなるかをわかりやすく解説します!
目次
htmlspecialcharsの使い方と説明
HTMLの特殊文字とは
特殊文字とは、文字列として入力を行えない特殊な文字のことをいいます。
例をあげると、HTML タグ(例:「&」、「”」、「’」、「<」、「>」)等です。
そんな特殊文字ですが、以下のように変換されます。
特殊文字 | 変換 |
---|---|
&(アンパサンド) | &amp |
“(二重引用符) | &quot; |
‘(一重引用符) | ' |
<(より小) | < |
>(より大きい) | &gt; |
htmlspcialcharの使用方法
htmlspcialchar()関数は、「<」 「>」のような特殊文字を
HTMLエンティティに変換することができます。
構文
1 |
htmlspecialchars( 変換対象文字, 変換パターン, 文字コード ) |
htmlspecialcharsには、( 変換対象の文字, 変換パターン, 文字コード ) の3つの引数があります。
第一引数、変換対象の文字には変換したい文字を設定してください。リテラルでないく変数でも指定できます。
第二引数、変換パターンを指定してください。下記の例は、ENT_QUOTES(シングルクオートとダブルクオートを共に変換)を指定してます。
第三引数、文字コードを指定してください。下記の例ではUTF-8を指定してます。
簡単な例
1 2 |
echo htmlspecialchars('<', ENT_QUOTES, 'UTF-8'); // 結果 『<』 |
htmlspcialcharを使って使用する例
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<!--?php $a = "'"; $b = '"'; $c = '&'; $d = '<'; $e = '>'; echo htmlspecialchars("'", ENT_QUOTES, 'UTF-8'); // 結果 『'』 echo htmlspecialchars('"', ENT_QUOTES, 'UTF-8'); // 結果 『"』 echo htmlspecialchars('&', ENT_QUOTES, 'UTF-8'); // 結果 『&』 echo htmlspecialchars('<', ENT_QUOTES, 'UTF-8'); // 結果 『<』 echo htmlspecialchars('>', ENT_QUOTES, 'UTF-8'); // 結果 『>』 ?> |
実際に出力される文字列は変わりませんが、文字コードが変わっています。
ですが、HTMLで使われる文字コードを無効化してくれ、ただの文字列として扱ってくれます。
エンティティ化した場合としない場合の比較の例
1 2 3 4 5 6 7 8 |
<!--?php $con = "<a href="index.php">フライテックでphpを学ぶ!!</a>"; echo $con; echo " "; htmlspecialchars($con, ENT_QUOTES, 'UTF-8'); echo htmlspecialchars($con); ?> |
出力結果
<a href=’index.php’>フライテックでphpを学ぶ!!</a>
htmlspcialchar()関数を使用していない方は、
htmlのタグであると認識し、リンク先へ飛ぶ文字列へと表示されています。
しかし、htmlspcialchar()関数を使用したは、htmlの「<」と「>」が文字列の「<」と「>」
として認識されている為、全て文字列として表示されています。
パラメータ
htmlspecialchars()関数で使用するパラメータは以下のようになります。
1 |
htmlspecialchars( 文字列, 変換パターン, 文字コード ) |
それぞれのパラメータについて解説していきます。
名前 | 説明 | 必須 | タイプ |
---|---|---|---|
文字列 | 変換する文字列。 | 必須 | 文字列 |
変換パターン | 一重引用符と二重引用符のエンコード。 ENT_COMPAT:二重引用符を変換し、単一引用符は変更しません。 ENT_COMPATはデフォルト設定です ENT_QUOTES:一重引用符と二重引用符の両方を変換します。 ENT_NOQUOTES:一重引用符も二重引用符も変換しません。 |
オプション | 整数 |
文字コード | 使用する文字セットを参照します。 文字セットのリスト。 ISO-8859-1:西ヨーロッパ、Latin-1 [デフォルトの文字セット]。 ISO-8859-15:西ヨーロッパ、ラテン-9。UTF-8:ASCII互換のマルチバイト8ビットUnicode。 cp866:DOS固有のキリル文字セット。 cp1251:Windows固有のキリル文字セット。 cp1252:西ヨーロッパのWindows固有の文字セット。 KOI8-R:ロシア語。 BIG5:繁体字中国語。 GB2312:簡体字中国語。 BIG5-HKSCS:Big5、香港拡張あり。 Shift_JIS:日本語。 EUC-JP:日本語。 |
オプション | 文字列 |
戻り値
変換された文字列を返します。
また、文字列に無効なエンコードが含まれている場合、ENT_IGNOREまたは
ENT_SUBSTITUTEフラグが設定されていない限り、空の文字列が返されます。
エスケープ処理とは
※「エスケープ処理がわかっている方は読み飛ばしてください」
エスケープ処理を行うと「キーボードから入力できない文字を出力させる」ことや
「PC側の解釈が異なって文字の効果を実行してしまう」ことを防ぐなどの効果があります。
これをしないと、クロスサイトスクリプティング(XSS)が行われてしまいますので
思ってないところでプログラムが勝手に実行されたりなどシステムに色々問題が発生してしまいます。
そのような処理を防ぐためにエスケープ処理を行います。
エスケープをする理由
なぜ、エスケープ処理を行うのかというと、タグや改行などを記述する際に
エスケープをしていないと、ブラウザで正しく表示されなくなるからです。
それどころかエラーが発生して処理が止まってしまう場合もあります。
言葉だけだと何言ってるのかわからないと思いますので、
ここでXSS攻撃された(エスケープ処理しなかった)場合と、
XSS攻撃を防いだ(エスケープ処理をおこなった)場合の例をあげて解説していきます。
XSS攻撃の例(エスケープしない場合)
エスケープ処理をしない場合を見てみましょう。
下記の様な掲示板を作成します。
「確認画面へ」を押したら、上に書き込まれて行きます。
テストと入力し「確認画面へ」を押下
下記の様に書き込まれます。
特に問題はないのと思うかもしれませんが、
この掲示板は、エスケープ処理がされていないので問題ありです。
どんなことが問題か見ていきます。
先ほどは「テスト」でしたが、下記の様にJavaScriptを書いて「確認画面へ」を押下してみます
1 |
<script>alert("フライテックでフリーランスになるぞ!!")</script> |
「確認画面へ」を押下
このようにJavaScriptが発生してしまいます。
これが「XSSや悪意のあるスクリプトによる攻撃」と呼ばれるものです。
今回はアラートだけなのでそんなに問題はありませんが、
SQLを書かれたら会員ユーザーの個人情報等が抜き取られてしまうため非常に危険です。
Java等は、型等の制限が厳しいためXSS等をあまり考えなくてもいいのですが、
PHPは変数になんでもブチこめれる為、エスケープ処理をきちんとやらないと非常に危険です。
エスケープした場合の例
それでは、エスケープ処理を行った場合の例を見てみましょう。
scriptタグで囲んで確認画面へのボタンを押下してもJavaScriptは発生せず、文字列として認識
されて表示されました。
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。