SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CodeZineニュース

[PHPプロ!] preg_matchの注意点

  • X ポスト
  • このエントリーをはてなブックマークに追加

  • X ポスト
  • このエントリーをはてなブックマークに追加

PHP Security Blogでpreg_matchをフィルターとして使用する際の注意点について言及されています。

 PHP Security Blogでpreg_matchをフィルターとして使用する際の注意点について言及されています。

 以下のような$_GET['var']をフィルタリングするスクリプトを考えます。

<?php
$clean = array();
if (preg_match("/^[0-9]+:[X-Z]+$/", $_GET['var'])) {
 $clean['var'] = $_GET['var'];
}
?>

 この場合、改行文字が$_GET['var']の最後にあってもpreg_matchはその改行文字を「$」で捉えることができません。

<?php
$str_list = array(
  "OK" => "1234:XYZ",
  "OK_EOL" => "1234:XYZ" . PHP_EOL,
  "NG_1" => "1234:XYZ" . PHP_EOL . "aaa"
);
 
foreach ($str_list as $k => $v) {
 if (preg_match("/^[0-9]+:[X-Z]+$/", $v)) {
   echo $k . " => " . $v;
   echo PHP_EOL . "----------------" . PHP_EOL;
 }
}
?>

 上記のスクリプトの実行結果は以下のようになります。

OK => 1234:XYZ
----------------
OK_EOL => 1234:XYZ

----------------

 preg_matchでは評価する文字列の最後が改行文字の場合、その文字列は評価されません。ただし、「D」修飾子を追加することでこの動作を修正することができます。

<?php
$str_list = array(
  "OK" => "1234:XYZ",
  "OK_EOL" => "1234:XYZ" . PHP_EOL,
  "NG_1" => "1234:XYZ" . PHP_EOL . "aaa"
);
 
foreach ($str_list as $k => $v) {
 if (preg_match("/^[0-9]+:[X-Z]+$/D", $v)) {
   echo $k . " => " . $v;
   echo PHP_EOL . "----------------" . PHP_EOL;
 }
}
?>
OK => 1234:XYZ
----------------

 これは、HTTPヘッダインジェクションや、E-mailのヘッダーインジェクション攻撃の元となりうるので注意が必要です。ただし、HTTPヘッダインジェクション攻撃は、PHPのheader()関数で複数のヘッダをPHP 4.4.2およびPHP 5.1.2以降では出力できなくなっているので、最新のPHPではこのフィルターを通過した値をheader()関数で使用しても改行文字が他のヘッダに影響を与えることはありません。

 いずれにしても、trim()関数などでの処理はヘッダに使用する値に関しては忘れてはいけないことなので、注意しましょう。(PHPプロ!

関連リンク

関連ニュース

転載元

 PHPプロ!:最新のPHPニュース

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
この記事の著者

PHPプロ!(PHPプロ!)

PHPプロ!」は、アシアル株式会社が運営するPHP開発者のためのポータル&コミュニティサイトです。同サイトでは、PHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座、PHP中級者のためのTIPSメーリングリスト、中・上級者向けの技術ノウハウ満載のPHPプロ!マガジンの提供など、PHP開発...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1212 2007/04/06 12:22

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング