• ビジネス
  • IT
  • テクノロジー
  • 医療
  • 建設・不動産
  • TRENDY
  • WOMAN
  • ショッピング
  • 転職
  • ナショジオ
  • 日経電子版
  • 日経BP
  • PR

  • PR

  • PR

  • PR

  • PR

PHP TIPS

23. 関数とバイナリセーフ

2007/04/03 ITpro

関数の中にはバイナリデータを正しく扱うことが出来る関数(バイナリセーフ)とそうではない関数があります。これを把握しておかないと、思わぬところでバグを発生させかねません。今回はその中でも正規表現によるマッチングに焦点を当てます。

正規表現によるマッチング関数にpreg_matchとeregがあります。前者はPerl互換 性、後者はPHPのPOSIX互換性正規表現関数です。これらは入力値をフィルターす るときにしばしば用いられます。しかし、eregには落とし穴が存在します。

その落とし穴とは「ereg関数はバイナリセーフではない」ということです。例え ば、ユーザ入力をフィルタリングするスクリプトを考えてみましょう。

if (ereg('^[0-9A-Za-z_]+$', $_POST['login_id'])) {
// 正しい入力に対する処理
}

ここでの目的はポストされたlogin_idが半角英数、アンダーバーのみで構成され ているか確認することです。一見、何の問題もないように思われます。しかし、 $_POST['login_id']にヌルバイト文字(\0)を入れられると、このフィルタリン グは意味を持たなくなります。ためしに

$_POST['login_id'] = "abc\0 -** 1 **-";

としてみて下さい。ereg関数はtrueを返し、if内部のスクリプトが実行されたと 思います。この原因はereg関数がヌルバイト文字の直前までしかマッチングを行 わないことにあります。つまり、バイナリセーフな関数ではないため、ヌルバイ ト文字で文字列が終了したとみなしてしまいます。このような場合にはeregでは なくpreg_matchを用いて下さい。

ただし、これはmb_ereg系には当てはまりません。名前は似てい ますが、これらはバイナリセーフな関数です。また、preg系の関数ではその代 わりになりえません。

以上の様に、入力値に対してバイナリセーフではない関数を用いる場合には注意 が必要です。特に正規表現関数の使い所には気を付けて下さい。

他のバイナリセーフではない関数の一部

ereg_replace(), eregi(), eregi_replace(),
split(), spliti(),
include(), include_once(), require(), require_once()
fopen(), file_get_contents(), readfile(), basename()



(アシアル 井川数志)


この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。

あなたにお薦め

連載新着

連載目次を見る

今のおすすめ記事

  • 【VoLTEの謎】

    格安スマホでもVoLTEは使える?

     最近はMVNOが提供する格安スマートフォン(スマホ)を利用する人が増えています。こうした格安スマホのユーザーでも新しい音声通話技術である「VoLTE」は使えるのでしょうか。

ITpro SPECIALPR

What’s New!

経営

アプリケーション/DB/ミドルウエア

クラウド

運用管理

設計/開発

サーバー/ストレージ

クライアント/OA機器

ネットワーク/通信サービス

セキュリティ

もっと見る