個人的なメモと備忘録 2003年 2月

HOME | LastUpdate: 2003-03-09

目次


2003.02.23(Sun)

PHP の PEAR には、いろいろと便利そうなクラスがありますので、少し見てみました。PHPUnit などはかなり使えそうですので、実際に使って行こうと思います。時間があれば、また、メモを書くと思います。

>>CVS のブランチ作成

CVS でブランチを作成する必要がありましたので、簡単なメモを残しておきます。CVS の基本的な部分は他のページに詳しく載っていると思いますので、省略します。CVS は多くのコマンドがあるため、間違えていたり、勘違いしている可能性もありますので、気をつけて下さい。

ブランチの作成 : 作業ディレクトリ上でブランチを作成する場合は以下のようにします。

$ cvs tag -b <ブランチタグ名>

作業ディレクトリではなく、リポジトリから直接ブランチを作成する場合は rtag を使います。

$ cvs rtag -b <ブランチタグ名> <モジュール名>

タグの削除: 間違えたタグを付けてしまった時くらいにしか使わない方が良いと思います。間違えてタグを削除したときに、元に戻すのは別でリポジトリのバックアップを持っていないと非常に難しいです。また、下手にタグの削除や移動を行うとリポジトリに問題が発生する可能性があるかもしれません。

$ cvs tag -d <削除したいタグ名>

同じように、作業ディレクトリがない場合は、以下のようにします。

$ cvs rtag -d <削除したいタグ名> <モジュール名>

リビジョン間のマージを行う場合は、作業ディレクトリで以下のように行うことができます。対象ファイル名を付けない場合は、ディレクトリ以下の全てのファイルが、対象タグ名のファイルとマージされます。変更箇所がファイルに書き加えられ、バックアップが作成されますので、一つずつ、ファイルを修正していきます。修正が終わったら、その作業ディレクトリでコミットします。

$ cvs update -j <対象タグ名> <対象ファイル名>

CVS のタグを一覧表示 : CVS に登録されているタグ名を一覧表示することができます。

$ cvs status -v <ファイル名>

>>セキュリティ関係

*OpenSSL

OpenSSL の OpenSSL 0.9.7a と OpenSSL 0.9.6i が公開されています。

詳細は、OpenSSL Security Advisory [19 February 2003]を参照してください。

日本語の情報として、セキュリティホールメモの 2003.02.20 の情報 や、OpenSSLに脆弱性、0.9.7aと0.9.6iリリース( スラッシュドット・ジャパン ) があります。

*PHP

PHP 4.3.1 が公開されています。PHP 4.3.0 では、CGI 版を使用する際に、セキュリティ上、重大な問題があることが確認されたそうです。PHP 4.3.0 で CGI 版を使用している人は、バージョンアップしてください。

詳しくは、PHP Security Advisory: CGI vulnerability in PHP version 4.3.0 を読んでください。また、PHP のメーリングリストに、和訳が投稿されていますので、参考にしてください。

( 2003.03.02 追記 ) : 以下のページにも情報があります。

*その他

その他にも、いくつか気になった問題がありましたので、挙げておきます。Oracle とか Norton は使える環境もありませんし、あまり詳しく調べるほど時間と余裕がありません。

>>気になったニュースなど

▲ 目次へ戻る


2003.02.16(Sun)

ゆっくり PHP のメモなどを書いていたら、時間がなくなってしまいました・・・。PHP で PostgreSQL を使っている人にしか意味のないメモですが。本当に休みは時間が経つのが早いです。

>>PHP

*PHP 4.3.0 の PostgreSQL 関数 ( pg_select, pg_update, pg_insert, pg_delete )

さらに先週の続きです。PHP 4.3.0 で追加された PostgreSQL 関数で、残りの4つの関数を説明してみます。

これらの関数は、PHP マニュアルで実験的なステータスにあるという記述がありますので、使用する時は、注意してください。また、間違いや、おかしい点などがありましたら、ぜひメールで指摘して下さい。

今回は、下の 4つの関数についてのメモです。

例として使用するデータベースのテーブル定義は、以下のように先週と同じものを使用します。

=> \d test
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 test1  | integer               | 
 test2  | character varying(6)  | 
 test3  | boolean               | 
 test4  | text                  | 

=> SELECT * FROM test;
 test1 | test2  | test3 |  test4  
-------+--------+-------+---------
     1 | TEST_A | t     | TEST_A1
     2 | TEST_B | t     | TEST_B2
     3 | TEST_C | f     | TEST_C3

pg_select は、簡単に SQL の SELECT 文の結果を取得できる関数です。この関数を使用すると、SQL 文を記述する必要がなくなり、結果を配列でまとめて取得できますので、便利です。ただし、複雑な SELECT 文が発行できる訳ではありませんので、pg_query を使って SQL 文を発行する必要がなくなる訳ではありません。

pg_select では、以下のように、4つの引数を与えることが可能です(4つ目の引数はオプション)。

  • データベースの接続リソース( pg_connect の返り値 )
  • データベーステーブルの名前
  • WHERE 文に使用するための連想配列( フィールド名 => 値 )
  • 第3引数の連想配列に対して、pg_convert を 使用するかどうかのフラグ(デフォルト:TRUE)

例としては、以下のようになります。

$conn = pg_connect( "dbname=test" ) or die( 'データベースの接続に失敗しました。' );
$array =& pg_select( $conn, 'test', array( 'test1' => 2 ) );
print_r( $array );

結果は以下のようになります。指定したレコードの全てのフィールドが取得できています。

Array
(
    [0] => Array
        (
            [test1] => 2
            [test2] => TEST_B
            [test3] => t
            [test4] => TEST_B2
        )

)

次に、pg_insert ですが、この関数では、引数は pg_select と同じです。

指定した連想配列が追加されます。例としては、以下のようになります。

$conn = pg_connect( "dbname=test" ) or die( 'データベースの接続に失敗しました。' );
pg_insert( $conn, 'test', array( 'test' => 4, 'test2' => 'TEST_D', 'test3' => 'f', 'test4' => 'TEST_D4' ) );

psql でデータベースに接続して、一覧をしてみると、上で入力したレコードが追加されています。

=> SELECT * from test;
 test1 | test2  | test3 |  test4  
-------+--------+-------+---------
     1 | TEST_A | t     | TEST_A1
     2 | TEST_B | t     | TEST_B2
     3 | TEST_C | f     | TEST_C3
     4 | TEST_D | f     | TEST_D4
(4 rows)

行を削除する場合には、pg_delete が使えます。この関数の引数も、pg_select とほとんど変わりません。WHERE 句の部分に連想配列が使われます。例として、先ほど追加した行を削除します。

test1 フィールドの値が 4 のレコードを削除します。

$conn = pg_connect( "dbname=test" ) or die( 'データベースの接続に失敗しました。' );
pg_delete( $conn, 'test', array( 'test1' => 4 ) )

指定した行が削除されています。

=> SELECT * from test;
 test1 | test2  | test3 |  test4  
-------+--------+-------+---------
     1 | TEST_A | t     | TEST_A1
     2 | TEST_B | t     | TEST_B2
     3 | TEST_C | f     | TEST_C3
(3 rows)

最後に、pg_update ですが、これまでの関数と違い、引数が5つあります。

  • データベースの接続リソース( pg_connect の返り値 )
  • データベーステーブルの名前
  • UPDATE を適用するデータの連想配列( フィールド名 => 値 )
  • WHERE 文に使用するための連想配列( フィールド名 => 値 )
  • 第3引数の連想配列に対して、pg_convert を 使用するかどうかのフラグ(デフォルト:TRUE)

例として、フィールド名 test1 で値が 2 のレコードの test3 (現在は TRUE) を FALSE に設定します。コードは以下のようになります。

$conn = pg_connect( "dbname=test" ) or die( 'データベースの接続に失敗しました。' );
pg_update( $conn, 'test', array( 'test3' => FALSE ), array( 'test1' => 2 ) )

以下のように、順番が入れ替わっていますが、更新されています。

 SELECT * from test;
 test1 | test2  | test3 |  test4  
-------+--------+-------+---------
     1 | TEST_A | t     | TEST_A1
     3 | TEST_C | f     | TEST_C3
     2 | TEST_B | f     | TEST_B2
(3 rows)

とりあえず、今回で PHP 4.3.0 で追加された PostgreSQL 関数の使い方メモは終わります。

今回、PHP 4.3.0 で追加された PostgreSQL 関数をいろいろと見て思ったのですが、かなりマニュアルに間違いや不明な点が多いような気がします。

特に、pg_update は、引数に連想配列を指定する部分が2つあり、マニュアルを読んだ限りでは引数の位置が反対のような気がします。実際に、最初に間違えてしまって、かなり悩んでしまいました。PostgreSQL 側から、発行された SQL 文を表示して、やっと解決したのですが、あまりに PHP 4.3.0 で追加された PostgreSQL 関数の情報が少なかったために、とりあえず、メモを書いてみました。

3週間くらいに渡って適当にメモを書いてきましたが、時間が取れれば、そのうち別でまとめ直そうと思っています。PHP マニュアルも、随時、修正が入っていますし、日本語化も進んでいますので、近いうちにここで指摘したような問題は修正されると思います。

>>セキュリティ関係

>>気になったニュースなど

▲ 目次へ戻る


2003.02.09(Sun)

@Random に参加してきました。山口先生の話ははがかなり面白かったです。JPCERT/CC は、あと数ヵ月したらいろいろと動きがあるとおっしゃってましたので、期待できるかもしれません。

>>PHP

*PHP 4.3.0 の PostgreSQL 関数 ( pg_meta_data, pg_convert )

先週の続きですが、PHP 4.3.0 から追加された PostgreSQL 用の関数のうち、今週は以下の2つの関数についてメモします。この2つの関数は、PHP マニュアルでは実験的な関数となっていますので、使用については自己責任で行ってください。

例として使用するデータベースのテーブル定義は、以下のように先週と同じものを使用します。

=> \d test
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 test1  | integer               | 
 test2  | character varying(6)  | 
 test3  | boolean               | 
 test4  | text                  | 

=> SELECT * FROM test;
 test1 | test2  | test3 |  test4  
-------+--------+-------+---------
     1 | TEST_A | t     | TEST_A1
     2 | TEST_B | t     | TEST_B2
     3 | TEST_C | f     | TEST_C3

まず、pg_meta_data についてですが、引数にデータベースのコネクションハンドルとテーブル名を与えると、テーブル定義を返してくれます。フィールド数や、フィールド名などをまとめて取得したい場合は非常に便利な関数です。

例としては、以下のようにします。

$conn = pg_connect( "dbname=test" ) or die( 'データベースの接続に失敗しました。' );
$array =& pg_meta_data( $conn, 'test' );
print_r( $array );

以下のような結果になります。

Array
(
    [test1] => Array
        (
            [num] => 1
            [type] => int4
            [len] => 4
            [not null] => 
            [has default] => 
        )

    [test2] => Array
        (
            [num] => 2
            [type] => varchar
            [len] => -1
            [not null] => 
            [has default] => 
        )

    [test3] => Array
        (
            [num] => 3
            [type] => bool
            [len] => 1
            [not null] => 
            [has default] => 
        )

    [test4] => Array
        (
            [num] => 4
            [type] => text
            [len] => -1
            [not null] => 
            [has default] => 
        )

)

次に、pg_convert は、連想配列を SQL 命令として実行可能なものに変換する命令です。以前は addslashes や、pg_escape_stringで、ユーザからの入力をエスケープすることで対処するのが一般的だったと思うのですが、pg_convert は、連想配列をそのまま SQL 文として使用できる形に変換することが可能です。

なぜユーザからの入力をエスケープするのかについては、PHP マニュアルのデータベースのセキュリティの項をを読んでみると分かると思います。何らかの形でデータベースを利用する人は必ず読んでおいた方が良いと思います。

pg_convertを使用した例を示します。

$conn = pg_connect( "dbname=test" ) or die( 'データベースの接続に失敗しました。' );
$array = array( 'test1' => '1', 'test2' => "'test'", 'test3' => FALSE, 'test4' => '\\\\\\\\' );
$array =& pg_convert( $conn, 'test', $array );
var_dump( $array );

結果は以下のようになります。シングルクォートとバックスラッシュがエスケープされているのが分かります。

array(4) {
  ["test1"]=>
  string(1) "1"
  ["test2"]=>
  string(10) "'''test'''"
  ["test3"]=>
  string(3) "'f'"
  ["test4"]=>
  string(10) "'\\\\\\\\'"
}

あとは、この連想配列を使って、以下のように結合すれば、SQL 文の WHERE 句などに使用することができます。

foreach ( $array as $field => $value ) {
$array2[] = $field . '=' . $value;
}
echo implode( ' AND ', $array2 )

結果は以下のようになります。

test1=1 AND test2='''test''' AND test3='f' AND test4='\\\\\\\\'

pg_convert は、pg_delete, pg_insert, pg_select, pg_update といった PHP 4.3.0 で追加された関数を使用する場合は、自動的に適用させることができますので、あまり使用することは多くないかもしれません。また、pg_convert を使用する際は、データベースの定義にない連想配列のキーを使用すると、エラーになりますので、気をつけて下さい。

あと、他に PHP マニュアルで気になった部分としては、pg_convert の第4引数は、オプション扱いになっていますが、特に説明がないため、よく分からないと言うところでしょうか。PHP マニュアル全体に言えることですが、新しく追加された関数は不備が多いのかもしれません。

>>セキュリティ関係

*VineLinux

Vim のセキュリティホールの修正パッケージが公開されています。

*RedHat Linux

カーネルのセキュリティ問題修正パッケージが公開されています。

PHP の修正パッケージは、PHP 4.1.2 と PHP 4.2.x で見つかった wordwrap 関数のセキュリティホールの修正のようです。

結構、前から公表はされていたようですが、redhat.com | Errata のページに、今までの RedHat のバージョンのサポート期限が載っています。RedHat 6.2 と RedHat 7.0 は、今年の 3月 31日でサポートを終了するようです。RedHat 7.1 から 8.0 は、今年の 12月 31日になっていますが、RedHat 8.0 は少し短すぎるような気がします。これから長期のサーバ用途して運用するにはには向かないかもしれません。

*FreeBSD

他の OS でも問題になっていた CVS のセキュリティホールについて、勧告が出ています。

*Windows

2つの修正プログラムが公開されています。

上の Internet Explorer の累積的修正プログラムはクロスドメインに関連する脆弱性を修正するということのようです。深刻度が緊急になっています。Internet Explorer を使っている人は修正プログラムをインストールしてください。

下の Windows リダイレクタの未チェックのバッファにより権限が昇格するという問題は Windows XP だけの問題です。深刻度は重要になっています。

*Opera

先日公開された Opera 7 ですが、スラッシュドット・ジャパンに、Opera 7に多数のセキュリティホールという投稿がありました。

その関係だと思いますが、Opera 7.01 が公開されたようです。報告されたセキュリティホールが全て修正されているかは知りませんが、全て修正されていると掲示板に情報があったという報告がありました。

>>気になったニュースなど

▲ 目次へ戻る


2003.02.02(Sun)

休みは時間が経つのが早いですね・・・。

>>PHP

*PHP 4.3.0 の PostgreSQL 関数 ( pg_fetch_assoc, pg_fetch_all )

PHP 4.3.0 から、PostgreSQL 用の関数が追加されましたので、少し試してみました。PHP マニュアルLXXXI PostgreSQL 関数 に一応、説明はあるのですが、PHP 4.3.0 で追加された関数のいくつかは、サンプルのソースコードを見ても間違っていたり、分かりにくいような記述になっているような気がしましたので、使い方のメモを残しておきます。今回は、pg_fetch_assoc と、pg_fetch_all についてメモしておきます。

PHP 4.3.0 では、以下の PostgreSQL 用関数が追加されています。

pg_query で SQL を発行した後の結果取得関数として、pg_fetch_assoc と、pg_fetch_all が追加されています。pg_fetch_assoc は、pg_fetch_row や、pg_fetch_array と同じく、SQL 実行結果を一行ずつ取得する関数です。また、pg_fetch_all は、SQL の結果をまとめて取得できます。

pg_fetch_assoc と、pg_fetch_all の例を挙げます。test というデータベースに、以下ようなテーブル定義とデータがあるとしてメモします。

=> \d test
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 test1  | integer               | 
 test2  | character varying(6)  | 
 test3  | boolean               | 
 test4  | text                  | 

=> SELECT * FROM test;
 test1 | test2  | test3 |  test4  
-------+--------+-------+---------
     1 | TEST_A | t     | TEST_A1
     2 | TEST_B | t     | TEST_B2
     3 | TEST_C | f     | TEST_C3

以下のような PHP スクリプトを実行すると、動きが分かると思います。テーブルにある全データを取得して表示します。pg_fetch_assocpg_fetch_all で同じ結果を取得します。

<?php
$conn = pg_connect( "dbname=test" ) or die( 'データベースの接続に失敗しました。' );

$result = pg_query( "SELECT * FROM test" );

while ( FALSE !== $tmp =& pg_fetch_assoc( $result ) )
    $arr1[] = $tmp;

$arr2 =& pg_fetch_all( $result );

if ( $arr1 == $arr2 ) var_dump( $arr1 );
?>
array(3) {
  [0]=>
  array(4) {
    ["test1"]=>
    string(1) "1"
    ["test2"]=>
    string(6) "TEST_A"
    ["test3"]=>
    string(1) "t"
    ["test4"]=>
    string(7) "TEST_A1"
  }
  [1]=>
  array(4) {
    ["test1"]=>
    string(1) "2"
    ["test2"]=>
    string(6) "TEST_B"
    ["test3"]=>
    string(1) "t"
    ["test4"]=>
    string(7) "TEST_B2"
  }
  [2]=>
  array(4) {
    ["test1"]=>
    string(1) "3"
    ["test2"]=>
    string(6) "TEST_C"
    ["test3"]=>
    string(1) "f"
    ["test4"]=>
    string(7) "TEST_C3"
  }
}

メモリに余裕があり、結果のみが必要なのであれば、while などを使ってループする必要がない分、pg_fetch_all は便利な関数だと思います。

あと、PHP マニュアルの不備だと思うのですが、気になった点として、pg_fetch_assoc の例で、

$arr = pg_fetch_assoc ($result, 1, PGSQL_ASSOC);

のようになってますが、pg_fetch_assoc の第3引数に値は入れられないようです。正しくは例の第3引数の PGSQL_ASSOC を削除します。

$arr = pg_fetch_assoc ($result, 1);

また、同じく、pg_fetch_all の例でも、

$arr = pg_fetch_all ($result, 0, PGSQL_NUM);

のように使用されていますが、pg_fetch_all は、第1引数しか指定できないようです。正しくは例の第2引数、第3引数を削除して、以下のようにします。

$arr = pg_fetch_all ($result);

以上のように、新しく追加された関数の PHP マニュアルの例などには、不備が多いようで、そのまま使用するとエラーになることがあります。使用する時は気をつけてください。

また、他の PostgreSQL 関数についても書いていきたいと思います。

>>セキュリティ関係

*IPA : オープンソースソフトウェアのセキュリティ確保に関する調査(ドラフト版)

IPA セキュリティセンターで、オープンソースソフトウェアのセキュリティ確保に関する調査(ドラフト版)が公開されています。かなり量があるので、少ししか読んでいませんが、かなり参考になりそうです。ドラフト版ということで、正式版になる前に、気になる点や、問題があれば報告した方がいいと思います。

*Slammer

先週紹介したワーム騒ぎですが、セキュリティホール memo の 2003.01.27 の情報に、かなり詳しくまとめられています。対応方法、回避方法、解説、技術情報のリンクなど、かなり参考になると思います。

*RedHat Linux

Kerberos のセキュリティ修正パッケージが出ています。

*VineLinux

mew のパッケージがセキュリティホールとバグ修正の両方が入っているようです。1月30日付けの新しいパッケージのみをダウンロードすれば良さそうです。

>>気になったニュースなど

▲ 目次へ戻る


更新履歴

2003.02.02

このページを作成。2月2日分を追加。

2003.02.09

2月9日分を追加。

2003.02.16

2月16日分を追加。

2003.02.23

2月23日分を追加。

2003.03.02

PHP CGI SAPI Security Vulnerability に関連情報を追加

2003.03.09

誤字、脱字の修正。

▲ 目次へ戻る

LastUpdate: 2003-03-09 | HOME