本ページはHIGA TSUBASAが属する個人プロジェクト「COFUS」内のBLOGコンテンツです。

PHPにて配列でもテキストでもとりあえずエスケープ(サニタイズ)する例

PHPにて配列でもテキストでもとりあえずエスケープ(サニタイズ)する例

HIGA TSUBAS

Frontend Engineer HIGA TSUBAS

1992年生まれ、沖縄県育ち、現在大阪暮らし。フリーなフロントエンドエンジニアとしてコーディング案件をメインに行いながら、Web制作・Webサイト運営・ツール制作などの活動を行っています。

以前とある案件にて脆弱性の対策を担当した時に便利だったエスケープ処理の例です。

クロスサイトスクリプティング(XSS)対策で一部エスケープ処理が抜けていた箇所を潰した際に用いましたが、とにかく配列(連想配列も可)でもテキストでも構わずエスケープ可能です。

/**
 * Array sanitization.
 *
 * @description Both the array key and the value are sanitized.
 * @param array $input
 *
 */
function _h( $inputs ) {
    if ( is_array( $inputs ) ) {
        $_input = array();
        foreach ( $inputs as $key => $val ) {
            if ( is_array( $val ) ) {
                $key            = htmlspecialchars( $key, ENT_QUOTES, 'UTF-8' );
                $_input[ $key ] = _h( $val );
            } else {
                $key            = htmlspecialchars( $key, ENT_QUOTES, 'UTF-8' );
                $_input[ $key ] = htmlspecialchars( $val, ENT_QUOTES, 'UTF-8' );
            }
        }
        return $_input;
    } else {
        return htmlspecialchars( $inputs, ENT_QUOTES, 'UTF-8' );
    }
}

USE

まずはテキストの時。

$text = '<script>alert(1);</script>';
echo _h($text);

上記の場合だと以下になります。普通にhtmlspecialcharsを通したのと同じですね。

&lt;script&gt;alert(1);&lt;/script&gt;

お次は連想配列の時。

$array = array(
    '<script>alert(1);</script>' => 'サンプルサンプル',
    'text2' => '<script>alert(1);</script>',
);
var_dump( _h($array) );

連想配列でも同様にエスケープ出来ました。

array(2) {
  ["&lt;script&gt;alert(1);&lt;/script&gt;"]=>
  string(24) "サンプルサンプル"
  ["text2"]=>
  string(38) "&lt;script&gt;alert(1);&lt;/script&gt;"
}

ただの組み合わせでしかありませんが、配列でもテキストでも構わずエスケープ出来ると楽ですよね。function.phpにでも置いておくと便利に使えると思います。

RECOMMEND 関連する記事