Nucleus/SQLite

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ラッパーで対応します

コメント

コメントはありません

コメント送信