PHPセキュリティ対策:定義域エラー

(3/3)

サンプル・プログラム:ユリウス日版

紀元前 4713 年 1 月 1 日からの通日をあらわす「ユリウス日」(Julian Day)というものがある。これであれば人類の有史時代全体を網羅できるので、天文学や歴史学で重宝されている。
space
2番目のサンプルプログラムは、ユリウス日を使って「次の日曜日」を計算するものである。

プログラムを実行する

ダウンロード(PHP4/5共用)

サンプル・プログラムの解説:ユリウス日を計算する

西暦年月日(グレゴリオ暦)からユリウス日を求めるのがユーザー関数 Gregorian2JD である。

0027: /**
0028:  * ユリウス日⇒グレゴリオ暦 変換
0029:  * @param double $jd ユリウス日
0030:  * @param $year, $month, $day  グレゴリオ暦による年月日を格納する変数
0031:  * @return なし
0032: */
0033: function JD2Gregorian($jd, &$year, &$month, &$day) {
0034:     $jd += 0.5;
0035:     $z = floor($jd);
0036:     $f = $jd - $z;
0037:     $aa = floor(($z - 1867216.25) / 36524.25);
0038:     $a = floor($z + 1 + $aa - floor($aa / 4));
0039:     $b = $a + 1524;
0040:     $c = floor(($b - 122.1) / 365.25);
0041:     $k = floor(365.25 * $c);
0042:     $e = floor(($b - $k) / 30.6001);
0043: 
0044:     $day = floor($b - $k - floor(30.6001 * $e));
0045:     $month = ($e < 13.5) ? ($e - 1) : ($e - 13);
0046:     $year = ($month > 2.5) ? ($c - 4716) : ($c - 4715);
0047: }

サンプル・プログラムの解説:checkdateのユリウス日版

西暦年月日(グレゴリオ暦)が正しいかどうかを判断する関数  checkdate  のユリウス日版が、ユーザー関数 mycheckdate である。
space
ここで、西暦 0 年未満、1 万年以上はエラーとしている。
ユリウス日にしても、32 ビット長整数で計算している限り、西暦 1175 万 4266 年にオーバーフローを起こしてしまう。天文学の世界ではあり得ない年数ではないので、エラーチェックをしておく必要がある。

0071: /**
0072:  * 正しいグレゴリオ暦かどうか調べる
0073:  * @param int $year, $month, $day グレゴリオ暦による年月日
0074:  * @return bool TRUE/FALSE
0075: */
0076: function mycheckdate($year$month$day) {
0077:     if (! is_int($year)) return FALSE;
0078:     if (! is_int($month))    return FALSE;
0079:     if (! is_int($day))      return FALSE;
0080: 
0081:     if ($year  < 0 || $year  > 9999)    return FALSE;
0082:     if ($month < 1 || $month > 12)      return FALSE;
0083: 
0084:     if ($day < 1)   return FALSE;
0085:     static $dd = array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
0086:     if ($month == 2 && isleap($year)) {
0087:         if ($day > 29)  return FALSE;
0088:     } else if ($day > $dd[$month])   return FALSE;
0089: 
0090:     return TRUE;
0091: }

その他の解決策

--enable-calendar オプションでコンパイルされている PHP であれば、ユリウス日関係の関数のカレンダー関数が用意されている。
space
PEAR が利用できる環境であれば、PEAR::Date を使ってカレンダー計算を行うことができる。

参考書籍

  • 入門PHP セキュリティ」(クリス・シフレット/桑村潤/オライリー・ジャパン/オーム社/2006 年 05 月/1,890 円)
  • PHP辞典第2版」(西沢直木/翔泳社/2008 年 02 月/2,520 円)
  • PHP の薬箱」(佐久嶋ひろみ/九天社/2006 年 11 月/2,940 円)

参考サイト

(この項おわり)
header