エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


連想配列のキーも値もまとめてhtmlspecialchars()でサニタイズする関数の作成解説

      2017/06/16

連想配列のキーも値もまとめてhtmlspecialchars()でサニタイズ

 

PHPの配列・連想配列のキーと値を一括してサニタイズする関数

 
PHPの配列の値に対して一括で htmlspecialchars()関数を実行し、値のサニタイズ(無害化、無毒化)を行う方法を解説します。
また、配列の値だけではなく、連想配列のキーに対してもサニタイズ(無害化、無毒化)を行っています。
 
 

PHPの配列・連想配列のキーと値を一括してサニタイズする関数のサンプルソースコード

 

 
 

PHPの配列・連想配列のキーと値を一括してサニタイズする関数の解説

 
配列(連想配列)を引数に関数を実行すると、配列のキーと、値に対して一括して htmlspecialchars()関数を実行し、サニタイズ(無害化、無毒化)を行った結果を返す関数です。
 
クロスサイトスクリプティング(XSS)の対策のために htmlspecialchars()関数でサニタイズ(無害化、無毒化)を行いますが、この関数では、配列(連想配列)に対しても一括して処理を実行することができます。
 
 
見てもらえばわかると思いますが、foreach文でグルグル回しながら、入力値が配列であれば、改めて「mysanitize()」関数を呼び出し、さらに foreach文を実行して階層を深堀していく、という処理になっています。
 
配列でなければ「htmlspecialchars()」関数でサニタイズを実行します。
また、連想配列のキーもサニタイズを実行しています。
 
 

連想配列のキーも値もまとめてサニタイズする処理を作った経緯

 
この記事を書くきっかけになったのは、下記のツールを作成したことでした。
 
JSONの値のデコードツール
XMLを配列に変換するツール
 
そして、そのツールの解説記事として下記の記事を書きました。
JSON形式の値を配列形式に変換・PHPでは json_decode()、json_encode()
XML形式の値を配列形式に変換・PHPでは simplexml_load_string()
SMTP Mailerでスパム判定回避。WP Mail SMTPで発生する送信エラーも対応
 
 
作成したツールは、入力された JSON形式のデータ、XML形式のデータを配列に変換するという単純なツールなのですが、単純なツールだからと言ってもセキュリティホールを放置するわけにはいかないわけですので、サニタイズの対応を行うことにしました。
 
ですが、簡易的なツールですので、「json_decode()」関数、「simplexml_load_string()」関数で生成した配列を、そのまま「print_r()」で出力しているだけのツールでした。
 
そのため、「json_decode()」関数、「simplexml_load_string()」関数で生成した配列を何とかまとめてサニタイズを行う方法を実装しないと、JSON形式、XML形式の変換ツールなのにサニタイズの処理の方が大きくなってしまう、と思ったわけです。
 
そして出来上がったのが、このサニタイズの関数です。
 
 
まぁ、結果的にはサニタイズ処理の方が大きな処理ですし、実装にははるかに悩みましたが...
 
 

array_map()を利用してサニタイズする方法

 
最初は、下記のようなサニタイズの処理を書いていました。
ですが、これだと配列の値のサニタイズは問題なくできるのですが、連想配列の場合は、キーに対しては全く無防備だということが確認できました。
 

 
 
そのため、下記の様に修正をしてみました。
 

 
 
この方法でも一応、連想配列のキーもサニタイズできてはいますが、結果が想定しているものとは違う状態になりまして、実用には耐えうることができないと判断するに至りました。
「array_map()」関数は「指定した配列の要素にコールバック関数を適用する」関数ですので、連想配列のキーに対する処理は想定していないからであろう、と思います。
 
もう少しどうにかすれば...という感じもしましたが、下記のサイトに『「array_map()」関数を使うより、foreach文を使おう!』と書いてありましたので、上記の処理はあきらめて、記事の最初に載せた foreach文で実行する方法を採用することにしました。
 http://qiita.com/tadsan/items/bfd1acb7c35a9a6fe452
 
他にこんな簡単な方法があるよ!というのがあると教えていただけると幸いです。

 - PHP・Smarty・ECCUBE

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

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

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

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

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

PHPでスクレイピング。phpQueryとphp-simple-html-dom-parserの比較と設置方法
PHPでスクレイピング。phpQueryとphp-simple-html-dom-parserの比較と設置方法

「PHP スクレイピング」で検索すると「phpQuery」ばかりヒットするが、10年以上も放置されている。なので今も開発が続いている「PHP Simple HTML DOM Parser」をオススメする。

ECCUBEの新規追加ページがInternal Server Error・Not Foundに

ECCUBEで新規追加したページがInternal Server Errorに!原因はファイルのパーミッションの場合が多くその対処方法とプログラムの修正ポイントを解説。Not Foundも解説。

指定した数で文字列を丸める関数substr、mb_substr、mb_strimwidthの違い
指定した数で文字列を丸める(n文字目で…にする)関数substr、mb_substr、mb_strimwidthの違い

文字列を指定された数で抜き出すPHPの関数、substr、mb_substr、mb_strimwidthについての解説。似た関数だが引数の指定方法が違ったり、文字数がバイト数か文字数かも違ったり、注意が必要だ。

路線・駅検索のために緯度経度からPHPで簡易的に距離を計算する処理解説
路線・駅検索のために緯度経度からPHPで2点間の距離を計算する処理解説

路線・駅検索の仕組みの構築は大変。それを簡易に実装するために緯度経度を元に距離計算をする仕組みを考案。まずは2点間の距離を計算する仕組みを解説し、距離計算にまつわる関連技術も紹介。

ECCUBEでカード決済NGの受注情報をマイページ購入履歴に表示しない方法解説

ECCUBEでカード決済に失敗しても購入履歴一覧に注文情報(受注情報)が表示される問題への対処方法を解説。受注情報レコードの作成の流れとステイタスについても解説。

PHPで配列の値をダブルクオーテーションで囲んでimplodeでカンマ区切りにする方法
PHPで配列の値をダブルクオーテーションで囲んでimplodeでカンマ区切りにする方法

PHPで配列の値を、preg_replace関数でクォーテーションで囲み、implode関数で「,(カンマ)」で区切ってテキスト化する方法。この方法であれば配列が空でも分岐の処理は必要なし!

QRコード(二次元バーコード)作成サービスを公開
QRコード(二次元バーコード)作成サービスを公開

QRコード(二次元バーコード)を生成するサービス。QRコードにする文字列を入力するだけで QRコードが簡単に作れる。オプションとして、画像サイズ、余白サイズ、エラー訂正レベルがある。

CentOS6、7のPHPを5.3から5.6、7.0、7.1にバージョンアップする手順の解説
CentOS6、7のPHPを5.3から5.6、7.0、7.1にバージョンアップする手順の解説

CentOS6系、7系のPHPバージョンを5.3から5.6、7.0、7.1にアップする作業手順と解説。yum updateコマンドを使い作業時間は約10分。コマンドの解説や引数の意味なども解説しているので役に立つはず。

PHPパーミッション変更のchmod関数・モードを変数で指定する方法

パーミッション変更関数であるchmod関数の第二引数、ファイルモードの指定に変数を使う場合は8進数に変換するoctdec関数を使って変換します。

ECCUBEの商品一覧ページのSEO対策!rel=”next” rel=”prev”を設定

Googleは関連あるページはその旨明示するよう求めています。ECCUBEの商品一覧ページでその求めに応じるための「rel=”next”」「rel=”prev”」について解説します。