Jeans & Development:2007年 12月の記事

SQLite Manager で、新規データベースを登録するとき [Nucleus/SQLite]

2007年12月23日

WindowsでSQLite Managerを使うと、ディレクトリ指定に『 \ 』を用いていることに伴って、新規データベースの登録がうまく行かない。そこで、『 \ 』をすべて『 / 』に変更する必要がある。

また、sqlite_open() 関数でできた、長さゼロのデータベースファイルを登録しようとしても、うまく行かない。こうった場合は、一度データベースファイルを削除し、SQLite Manager に空のデータベースファイルを作成させるようにする。

以前同じ問題を解決していたにもかかわらず忘れていたので、ここにメモ。もしかしたら、新しいバージョンのSQLite Managerでは解決されているのかもしれないけれど…。
登録の例

SQLiteの、便利だけれど危険な機能 [Nucleus/SQLite]

2007年12月21日

PHPヘルプのsqlite_create_function関数の説明文より、

PHP は、データベースが最初にオープンされる際に phpという名前の特別な関数を登録します。 このphp関数は、事前に登録することなしにあらゆるPHP関数をコールする ために使用可能です。

例 2. PHP関数の使用例

<?php
$rows = sqlite_array_query($db, "SELECT php('md5', filename) from files");
?>


この機能、とても便利だけれど、諸刃の剣である。あらゆるPHP関数をコールすることが出来るのは、プログラマーにとって有益だけれど、同時にクラッカーにとっても有益であるということ。すなわち、SQLiteでSQLインジェクションが起きてしまった場合、それは即、PHPのあらゆる関数を呼び出すことが出来るということになる。例えば、file_get_contentsを使えば、サーバー上のファイルの内容を呼び出せるし、file_put_contentsを使えば、任意のファイルをサーバー上に構築したり出来てしまう。

幸いに、sqlite_create_functionを用いてオーバーライドすることが可能なので、この機能を無効化したり、呼び出す関数に制限を加えたりすることは簡単に出来る。例えば、

sqlite_create_function($db,'php','pi');

とすれば、クエリー中でphp関数を用いても、円周率の値を返すだけになる。

次期バージョンのSQLiteラッパーで対応します

架空のCMS [General]

2007年12月17日

先の記事で考察したNucleusの長所・短所を鑑みて考えた、架空のCMSの基本部分は、次のとおり。

Nucleusのconfig.phpとglobalfunctions.phpに相当する部分だけ、コードを書いてみた。

globalfunctions.phpに関する考察 [Nucleus]

2007年12月17日

某掲示板でも指摘されていた、globalfunctions.phpについて。この記事の最後に、globalfunctions.phpの概要をまとめてみた。それを参考に話を進めたい。まず始めに確認しておきたいのは、globalfunctions.phpはconfig.phpから呼び出されるため、Nucleusの何かしらの機能を使おうとすると必ずパースされることである。ここにある無駄は、Nucleusの機能全体に影響を及ぼす。

Nucleusの長所と短所 [Nucleus]

2007年12月17日

Nucleus は、私としてはとてもお気に入りのツールなのだけれど、当然ながら長所もあれば短所もある。最も気に入っているは、プラグインインターフェースが充実していて、プラグインを自分で書けばいろいろなことが出来てしまうところ。反面、これはだめだなぁと思うのは、とにかくSQLクエリーの数が多いこと。デフォルトスキンではせいぜい10回ほどのクエリーの数なのだけれど、プラグインをいくつか入れるとあっという間に100を超えてしまう。

Nucleus は、その設計思想から、軽さが売りである。ところが、利用の仕方によってはその設計思想が逆に災いして、重くなってしまうことが多々ある。こういったことの対策としては、NP_Cache・NP_EzCache・NP_znItemCacheなどのキャッシュ系プラグイン(それぞれ、Radekさん、Andyさん、佐藤(な)さん)を利用して軽くしてしまうのがとりあえずの対処方法といったところ。

根本的にこれを解決する試みとしては、コアでSQLクエリーの結果をキャッシュしてしまおうという方法(hsurさん)や、スキンそのものをPHPで完全に書き換えてしまう方法(ZAPAさん)が報告されている。こういったことを参考に、今後自分としてNucleusとどのように向き合ってゆけばいいのか考えるため、Nucleusの長所と短所を、思いつくままにピックアップしてみた。

Nucleus 3.31 SHA-encryption edition [Nucleus]

2007年12月15日

英語版 Nucleus 3.31 のパスワード認証機能を拡張し、ハッシュ値の計算に MD5 ではなくて、SHA512 もしくは、SHA1 を使うようにしたもの。アルファーバージョンなので、使用は評価のみに限定したい。

PHP のバージョンにより、MD5, SHA1, SHA512 を自動的に使い分ける仕様である。具体的には、PHP4.3.0 未満では MD5 を、4.3.0 以上 5.1.2 未満では SHA1 を、5.1.2 以上では、SHA512 を使うようにしてある。

また、先の記事で述べたように、ランダムな文字列を付加した後にハッシュ値を計算する機能を取り入れたので、たとえハッシュ値が洩れても、現在のところはパスワード解析はほとんど不可能。ここで使うランダム文字列(Salt)は、config.php で、$HASH_SALT として設定する。

以前のバージョンからのアップグレードにも配慮していて、アップグレードの瞬間にログインできなくなるどの不具合は無いはず。今までどおり使用していても、ユーザーはどこがどう変わったかまったく気が付かないはず。MD5 から SHA1/SHA512 への切り替えは、ログインの瞬間に行われる。

ダウンロードはこちらから。
<%media(20071216-nucleus331sha_a1.zip|Nucleus 3.31 SHA)%>

SHA1バトル [三国志]

2007年12月9日

魔法のMD5というサイトに在るMD5バトルというゲームが以外に面白かったので、SHA1でまねしてみました。オリジナルのMD5バトルと異なり、SHA1ハッシュ値の全データを用いているので、簡単には最強の戦士を作ることはできないと思います。

ブルートフォースアタックを防ぐために - 2 [Nucleus]

2007年12月4日

先の記事で書いたこととほぼ同様のことを、今のバージョンのNucleusで実現する方法を考えていたが、以外と簡単にできそう。

まず、確認しておかないといけないのは、現在の Nucleus (ver 3.3) では、パスワードの長さが40文字に制限されていること。これは、非常に長い文字列を用いれば、md5 コリジョン脆弱性を用いて、任意のハッシュ値を生み出すようなパスワードが作成できるかもしれないので、それを防ぐためである。

現在のコンピューターの性能だと、ランダムな40文字の文字列の可能性のすべてをブルートフォースで調べるのはほぼ不可能であろうから、キー長としてはこれでよかろう。

実装には、config.php を若干書き換えるだけである。コアの改造も、これ用のプラグインも要らないし、実装後のコアのバージョンアップも問題なく行える。これを実装することにより、SQLインジェクションでパスワード用のハッシュ値を盗み取るだけでは、ブルートフォースアタックはほとんど不可能になるはずだ。

ブルートフォースアタックを防ぐために [Nucleus]

2007年12月3日

現在のところNucleusは、パスワードをMD5ハッシュ値として保存している。平文ではなくハッシュを用いているのは、万一サーバの保存データが洩れた場合に、容易ににパスワードを類推できないようにするためである。

ところが、先の記事で述べたように、たとえMD5の様なハッシュ関数を用いても、PS3のような演算速度の速いコンピューターでパスワードをはじき出すことが容易になってきた。MD5の代わりにSHA1のような新しいアルゴリズムのハッシュを用いても、解決にはならない。

王道の解決方法は、長いパスワードを用いることである。100文字ほどの長さのパスワードを用い、SHA1のような最新もしくはそれに順ずるアルゴリズムでハッシュ化すれば、ブルートフォースでパスワードを求めることは、現在の技術ではほとんど不可能になる。

ところが、パスワードを100文字にすると、それを入力するのが面倒くさいばかりでなく、パスワードの内容まで忘れてしまうことは頻繁に起こりうるだろう。そこで、どうすればよいか対策を考えてみた。

PS3で米大統領選の結果を「正確に」予知? [コンピューター・その他]

2007年12月3日

スラッシュドット ジャパンより

PS3で米大統領選の結果を「正確に」予知?…実はMD5脆弱性への問題提起

アイントホーフェン工科大学(TUE)のBenne de Weger、CWIのMarc Stevens、ベル研のArjen Lenstraらセキュリティ研究者3名が、SonyのPlayStation 3一台を使用して2008年米国大統領選挙の結果を正確に予知したと発表した(Predicting the winner of the 2008 US Presidential Elections using a Sony PlayStation 3)。「有権者への影響を考慮して予知結果は選挙後まで秘密とするが、予知結果を記入したファイルが後で改竄されていないことを証明するため、ファイルのフィンガープリントをウェブサイトで公開しておく」としてMD5ハッシュの値を公開している。(スラッシュドット ジャパンより抜粋)
<<前の記事