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 が近しい動作をするので、それを使ってもいいかもしれません。