HOME | LastUpdate: 2003-03-09
PHP の PEAR には、いろいろと便利そうなクラスがありますので、少し見てみました。PHPUnit などはかなり使えそうですので、実際に使って行こうと思います。時間があれば、また、メモを書くと思います。
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 0.9.7a と OpenSSL 0.9.6i が公開されています。
詳細は、OpenSSL Security Advisory [19 February 2003]を参照してください。
日本語の情報として、セキュリティホールメモの 2003.02.20 の情報 や、OpenSSLに脆弱性、0.9.7aと0.9.6iリリース( スラッシュドット・ジャパン ) があります。
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 追記 ) : 以下のページにも情報があります。
今週も修正パッケージが公開されています。
最近、VineLinux では、まとめて修正パッケージを公開するような気がしますが。
その他にも、いくつか気になった問題がありましたので、挙げておきます。Oracle とか Norton は使える環境もありませんし、あまり詳しく調べるほど時間と余裕がありません。
@IT から。syslog が書き出したログを改竄する方法と LogWatch の説明。とりあえず、勉強に。
@IT から。基礎の部分から丁寧に説明されているので、分かりやすいと思います。
OpenSSL 0.9.7a と OpenSSL 0.9.6i が公開されています。セキュリティホールの修正のようです。
スクリプト言語。CGI 版で使用する時に発生するセキュリティ問題を修正したようです。
有名なブラウザ。Netscape 7.01 から比べて、セキュリティ、安定性が向上しているそうです。また、Windows 版では、新しく Macromedia Flash 6r65 プラグインと、の Java 1.4.0_03 プラグインが含まれています。Netscape 7.0 - 7.02 リリース ノートも参照してください。Mac 版では、新しい Flash Player をインストールしている場合、古いバージョンに置き換えられてしまうという問題がある(スラッシュドット・ジャパン)そうですので、注意してください。
ゆっくり PHP のメモなどを書いていたら、時間がなくなってしまいました・・・。PHP で PostgreSQL を使っている人にしか意味のないメモですが。本当に休みは時間が経つのが早いです。
さらに先週の続きです。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
の返り値 )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
の返り値 )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 マニュアルも、随時、修正が入っていますし、日本語化も進んでいますので、近いうちにここで指摘したような問題は修正されると思います。
修正パッケージが公開されています。
多くのプラットフォームで動く、オープンソースのブラウザ。詳細は、Mozilla 1.3b Release Notes や、日本語訳のMozilla 1.3 ベータ版 リリースノートを参照して下さい。画像自動リサイズや、ジャンクメール分類機能など、数多くの新機能が追加されました。
なかなか実用的なコラムです。perl でネットワーク管理ツールを作成するようです。
@Random に参加してきました。山口先生の話ははがかなり面白かったです。JPCERT/CC は、あと数ヵ月したらいろいろと動きがあるとおっしゃってましたので、期待できるかもしれません。
先週の続きですが、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 マニュアル全体に言えることですが、新しく追加された関数は不備が多いのかもしれません。
カーネルのセキュリティ問題修正パッケージが公開されています。
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 は少し短すぎるような気がします。これから長期のサーバ用途して運用するにはには向かないかもしれません。
他の OS でも問題になっていた CVS のセキュリティホールについて、勧告が出ています。
2つの修正プログラムが公開されています。
上の Internet Explorer の累積的修正プログラムはクロスドメインに関連する脆弱性を修正するということのようです。深刻度が緊急になっています。Internet Explorer を使っている人は修正プログラムをインストールしてください。
下の Windows リダイレクタの未チェックのバッファにより権限が昇格するという問題は Windows XP だけの問題です。深刻度は重要になっています。
先日公開された Opera 7 ですが、スラッシュドット・ジャパンに、Opera 7に多数のセキュリティホールという投稿がありました。
その関係だと思いますが、Opera 7.01 が公開されたようです。報告されたセキュリティホールが全て修正されているかは知りませんが、全て修正されていると掲示板に情報があったという報告がありました。
結構、気になる勧告が出ていました。実際にいつ頃一般的に使用できるようになるのかは分かりませんが、覚えておくといいかもしれません。
GTK を使っている、メールクライアント、ニュースリーダ。細かい修正と速度向上ということのようです。
オープンソースのリレーショナルデータベース管理システム。7.3.1 に問題があったらしいので、バージョンアップすることが強く推奨されています。詳しくは、PostgreSQL 7.3.2 Released のニュースを読んでください。また、少し前に PostgreSQL 7.2.4 も公開されていました。
Unix 系の OS で使用可能なデスクトップ環境。
休みは時間が経つのが早いですね・・・。
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_assoc
と pg_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 セキュリティセンターで、オープンソースソフトウェアのセキュリティ確保に関する調査(ドラフト版)が公開されています。かなり量があるので、少ししか読んでいませんが、かなり参考になりそうです。ドラフト版ということで、正式版になる前に、気になる点や、問題があれば報告した方がいいと思います。
先週紹介したワーム騒ぎですが、セキュリティホール memo の 2003.01.27 の情報に、かなり詳しくまとめられています。対応方法、回避方法、解説、技術情報のリンクなど、かなり参考になると思います。
Kerberos のセキュリティ修正パッケージが出ています。
mew のパッケージがセキュリティホールとバグ修正の両方が入っているようです。1月30日付けの新しいパッケージのみをダウンロードすれば良さそうです。
@IT から。telnet を使って、やさしく解説するところからはじめています。こういう教え方は初心者の方には分かりやすいと思います。
@IT から。XML についての解説。勉強に。
@IT から。Java で起こる文字化けに対する対処方法。
Unix 系の OS で使用できるデスクトップ環境。KDE 3.1 のアナウンスや、3.0.5 から 3.1 の変更点なども参照してください。
高速であることを売りにしているブラウザ。新バージョンでは安定性の向上や描画速度が高速になっているそうです。無料版の方は、また前のバージョンと同じように広告が表示されるようになっています。現在のところは Windows 版のみのようです。
このページを作成。2月2日分を追加。
2月9日分を追加。
2月16日分を追加。
2月23日分を追加。
PHP CGI SAPI Security Vulnerability に関連情報を追加
誤字、脱字の修正。
LastUpdate: 2003-03-09 | HOME