PHPにはXSS攻撃を防ぐ関数が用意されてます。
それがあの htmlspecialchars 関数
手軽にHTML特殊文字をエスケープできて便利です、
ただ便利なんですが・・・正直言って長い(笑)
そこで少しでも効率化するために、
この htmlspecialchars() を h() で定義する方法を紹介します。
まずhtmlspecialchars関数の意味と使い方から・・
まずhtmlspecialchars関数について。
PHPにおいては、こういう役割があります。
▼ htmlspecialchars関数の解説
htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = TRUE ]]] ) : string
文字の中には HTML において特殊な意味を持つものがあり、 それらの本来の値を表示したければ HTML の表現形式に変換してやらなければなりません。 この関数は、これらの変換を行った結果の文字列を返します。 入力文字列の中で名前付きエンティティに関連づけられたものを すべて変換する必要がある場合には、代わりに htmlentities() を使用してください。
引用元 : https://www.php.net/manual/ja/function.htmlspecialchars.php
特殊文字とは以下の4つのこと
記号名 | 変換前 | 変換後 |
アンパサンド | & | & |
ダブルクォート | " | " |
シングルクォート | ' | ' |
小なり | < | < |
大なり | > | > |
もしフォーム送信でHTMLを許可している場合、悪意のあるスクリプト( <script>~</script> )を送信されたら困りますよね。そのサイトがXSS攻撃の標的になってしまいます。
それを防げるのが htmlspecialchars関数です。
一番分かりやすい使い方はこういうの
▼ htmlspecialchars関数の使用コード例
1 2 3 4 5 |
/// 仮に $user_name がこういう内容とする $user_name = "<script>alert('XSS attack!!');</script>"; /// 特殊文字をエスケープする $user_name = htmlspecialchars($user_name); |
▼ 変換後の $user_name はこうなる
1 |
<script>alert('XSS attack!!');</script> |
ちゃんとエスケープされてます・・・でもいちいち htmlspecialchars とか書くのは長いし面倒です。どうせなら h($user_name); みたいに1文字だけで書けた方が便利ですよね。
その方法というか書き方が次の内容です。
htmlspecialchars関数を h() で定義する手順
次の2点に注意しないといけません。
- 同名関数が存在しないかチェックする
ただでさえ h() とかいう短い名前なので、同名の関数がないかどうかのチェックが必要になる。かならず。
- h関数の返り値について
あとから変更できないので、「エスケープした内容を返すのか」あるいは「エスケープした内容を出力(echo)するのか」を最初に決めておくこと。
ここでの h() はエスケープ内容を出力することにします。
そのために必要なのが 次の関数定義 です。
▼ このように定義するのが無難
1 2 3 4 5 6 |
/// h関数が未定義の場合は定義 if( ! function_exists('h') ) { function h($s) { echo htmlspecialchars($s, ENT_QUOTES, "UTF-8"); } } |
大事なのは function_exists('h') で同名関数が存在してないかチェックしてることです。あとは渡された引数を htmlspecialchars($s, ENT_QUOTES, "UTF-8"); でエスケープして出力するだけ。(第2引数以降は任意)
これからは h() だけ書けばいいので楽できます。
やっぱり楽するのって大事ですね。
あとはエスケープが必要な場所でh()を呼び出すだけ
ここまでで定義は終わったので・・・
あとは適宜 h関数を呼び出せばOKです。
▼ 例えばこういう感じで
1 2 3 4 |
<form> <input type="text" id="name" value="<?php h($_SERVER['name']); ?>" /> </form> |
以上、htmlspecialchars関数をh関数として定義でした。
フレームワークを使えない環境とかで役立つはずです。ではまた