PHPでhtmlspecialchars関数をh()で省略する書き方&注意点

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つのこと

記号名 変換前 変換後
アンパサンド & &
ダブルクォート " "
シングルクォート ' '
小なり < &lt;
大なり > &gt;

もしフォーム送信でHTMLを許可している場合、悪意のあるスクリプト( <script>~</script> )を送信されたら困りますよね。そのサイトがXSS攻撃の標的になってしまいます。

 

それを防げるのが htmlspecialchars関数です。

一番分かりやすい使い方はこういうの

▼ htmlspecialchars関数の使用コード例

▼ 変換後の $user_name  はこうなる

ちゃんとエスケープされてます・・・でもいちいち htmlspecialchars とか書くのは長いし面倒です。どうせなら h($user_name);  みたいに1文字だけで書けた方が便利ですよね。

その方法というか書き方が次の内容です。

htmlspecialchars関数を h() で定義する手順

次の2点に注意しないといけません。

  • 同名関数が存在しないかチェックする
    ただでさえ h() とかいう短い名前なので、同名の関数がないかどうかのチェックが必要になる。かならず。
  • h関数の返り値について
    あとから変更できないので、「エスケープした内容を返すのか」あるいは「エスケープした内容を出力(echo)するのか」を最初に決めておくこと。

ここでの h() はエスケープ内容を出力することにします。

 

そのために必要なのが 次の関数定義 です。

▼ このように定義するのが無難

大事なのは function_exists('h')  で同名関数が存在してないかチェックしてることです。あとは渡された引数を htmlspecialchars($s, ENT_QUOTES, "UTF-8");  でエスケープして出力するだけ。(第2引数以降は任意)

これからは h() だけ書けばいいので楽できます。

やっぱり楽するのって大事ですね。

あとはエスケープが必要な場所でh()を呼び出すだけ

ここまでで定義は終わったので・・・

あとは適宜 h関数を呼び出せばOKです。

▼ 例えばこういう感じで

以上、htmlspecialchars関数をh関数として定義でした。

フレームワークを使えない環境とかで役立つはずです。ではまた

PHP

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください