コフス技術ブログ

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

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

クロスサイトスクリプティング(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にでも置いておくと便利に使えると思います。