Archive for February 2008

PHPとRailsのセキュリティについて思うこと

Matzさんの日記を発端に,PHPが各所で話題になっています。僕は言語を語るほど詳しくないですが,自分の経験をいくらか思い出しました。

最初にサイトを作った99年のころは,まだPHPが使えるホスティング(レンタル・サーバー)はほとんどなかったと思います。当時はまだGeocitiesとかで「ホームページ」を作るのが流行っていたころですから,CGI(Perl)が使えるというだけでもちょっと高級感があったような。いろいろ探して無料でCGIが使えるところを見つけた記憶があります。最初からテンプレートとデータベースを組み合わせてサイトを作ることを考えていたのでCGIは自分にとっては必須でした。Perlはこういったスクリプト言語としては初めて触るものだったので,かなり刺激的でした(特に正規表現)。Larry Wallの講演を聴きに行くなど,一時はかなりPerlにのめりこんでいました。ただ,オブジェクト指向の機能などは「後付け」感が強く,使っていませんでした。

2,3年経って無料サービスが表示する広告がだんだん派手かつアダルト方面に向かっていったため,月額数ドルで使えるホスティングに変更。このときもまだPHPは使えなかったような気がします。

振り返ってみると,90年代半ばにWebが登場し,ダイナミックなコンテンツを作る方法としてCGIが一気に広がりました。しかし,リクエストごとにプロセスを立ち上げるのは効率が悪いなど,CGIを非難する声も上がり,PHPやASP(Active Server Pages)のようにHTMLとスクリプトを混在させるタイプがもてはやされるようになったと思います。そういう意味ではPHPはこのころどちらかというCGI=Perlより高級感があり,個人的にはちょっとあこがれる部分もありました。

2003年にブログを始めたときはBloggerを使ったのでスクリプトは不要だったのですが,コメントを入れるPHPのアドインソフトを探して入れた記憶があるので,そのころにはそのホスティングでもPHPをサポートしていたことになります。ただ,これは入れただけでコードは全く見なかったので,エラーが出てもそのままでした。

2004年にNucleusと出合って,初めて本格的にPHPを使い始めました。といっても最初に書いたのはNucleusではなく,mbstringエミュレータです。

PHPでプログラムを書いた印象は,「分かりやすくしたPerl」でした。Perlでプログラムを書いているときハッシュと配列を最初の文字で区別するのが分かりにくく,かなりまごついた記憶がありますが,PHPでは明確に区別をしないという方法でクリアしています。関数への引数の書き方などはCにも似ていて,Perlよりなじみやすく感じました。

こういった使いやすさが目立つ一方で,新たな言語を覚えるときの刺激はほとんどありませんでした。とんがったところがない,というのもPHPの特徴だと思います。PHPを4年間使って,買った本が2冊だけ,(1冊はPear,1冊はセキュリティ)というのもそのあたりを端的にあらわしていると思います。

PHPにはこのような「ぬるさ」というか,気安さというか親しみやすさがある一方で,セキュリティに関しては,細心の注意を必要とする部分が多聞にあります。

どの言語を使ってもセキュリティに注意を払わなければいけないのは同じですが,PHPの場合,register_globalsとかmagic_quotes_gpcのように,設定によって挙動が変わり,アプリケーションが両方を意識して対応しなければいけない,というケースが多く感じられます。アプリケーションで設定を変えられないのが,その大きな原因であるように思えます。おそらく,当初のPHPでは汎用のアプリケーションなどは想定せず,企業内で開発するときに「こういうのがあったら便利だよね」といった機能を入れてしまったのではないでしょうか。そういった面が今のようにPHPでさまざまなアプリケーションが流通する時代に「ツケ」になってきているのだと思います。

そういったところを長いこと放ってあったり,文字列処理関数にいまだに「バイナリセーフ」でないものが残っているといったところが,PHPが非難の対象になる原因でしょう。こういった危うさが前述の気安さと相まって,セキュリティ対策ができていないソフトを排出してしまっていることは否めないような気がします。

一方,Rubyは安全なのかといえば,Railsには今後第2のPHPになってしまうような危険なところもあると思います。例えばデフォルトのルーティングで ":controller/:action/:id"を展開するようになっていますが,これはコントローラが持っているパブリックなメソッドを何でも呼び出せてしまうものです。プログラマが無自覚にパブリックなメソッドを作っていたら,意図していないURLで何をされるか分かりません。Rails2のRESTfulなscaffoldを使うと,createとかdeleteといった破壊的なメソッドもコントローラのパブリックなメソッドになります。ちゃんと認証を付けるとか,上記のルーティングを消すとかしないと,DB操作し放題ということになりかねません。Railsの「売り」であるAjaxについても,気をつけないとセキュリティホールを作りかねないところがあります。

Railsの場合,Rails開発者やRailsを使ったアプリの開発者の意識がこれまでのところ高いので,あまり問題は出ていないだろうと思いますが,今後PHPのようにカジュアルに使われるようになると,危ないアプリもいっぱいできてしまうことが懸念されます。PHPと同じ道を歩むとは思っていませんが,やはり便利さと危うさは紙一重のところにあるのかもしれません。

04 Feb, 2008 | Rails | | Andy | Leave comment - 0 -

© 2007 yoursite.com | Designed by DesignsByDarren
Ported to Nucleus CMS: Suvoroff