Free lancer’s blog

フリーランス活動に関する記録を記して行こうと思います。

PHP で制御文字をエスケープ

制御文字を削除する記事はよく見かけるけど、エスケープする記事がなかったので自作

<?php
public static function Escape( $str ) {
	return preg_replace_callback( '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', function ( $m ) {
		return '0x' . strtoupper( implode( '', unpack( 'H*', $m[ 0 ] ) ) );	
	}, $str );
}

大文字に変換してるのは、単純に個人的にといいますか、16進数は大文字で書くようにしてます。

水平タブと、改行は残してあります。

これに引っかかるときって、考えると、ISO-2022-JP を使ってるとか、携帯の絵文字?よく調べてないけど

などなど考えられるけど

それ以外と言ったら、やはり悪意のあるコードになる。

ヌルバイトの後にコードを埋め込んだりとか。

PHP関数はバイナリセーフになっているものの、そんなものを読ませたくはない。

引っかかったらログ取って終わり。



検索すると、制御文字を消すコードが多数引っかかるけど、どこで使うのかわからない。

消して処理続行?

いい加減にもほどがある。

もし、特殊文字をユーザーが入力する可能性があるなら、受け入れられませんってアラート表示するだろうし。

消すメリットってなんだろ。


因みにこのコードは、処理続行させるためのものじゃなく、ログをとるだけのためのものです。
何を送ってきたかわかるから、対策もできるでしょ。

htmlentities が近しい動作をするので、それを使ってもいいかもしれません。