昨日はPHP全般の話題でしたが、今回はXOOPSだけの話。それも、XOOPSだけに実装されていると思われる、簡易CSRF対策についてです。
さすがにこれについては、情報も共有されているので今さら説明するまでもないのですが、DBレイヤーにおいて、POSTかつRefererが内部でなければ、SELECT以外のSQL発行をスキップする、というものです。
これ自体は、なかなか面白い発想です。DBレイヤーに手を入れるだけで、「CSRF対策」が出来てしまうので、「とりあえず」の対策としては最善策だったでしょう。(このあたり、さすがはJM2さんという気がします)
しかし、開発チームからJM2さんが抜けて、XOOPS2になっても、その「とりあえず」の対策から何一つ改善されなかったことは明らかに問題です。
例えばXOOPSのnewsモジュールで投稿したとしましょう。その時、なんらかの理由で、リファラー送信をOFFにしていたら、「投稿されました」というメッセージだけが出て、実際には投稿されていません。これはとても奇妙な動作です。そして、どこに原因があるのか、きわめて判りづらいでしょう。
「リファラーが送信されていません」とだけメッセージを表示してexitしていれば、直ちに修正が可能なのに! そして(チケットチェックがない、もしくは、再投稿を実装してあれば)exitされた時点で、リファラーをONにしてリロードすることで、投稿内容も失わないのに!
トータルセキュリティという観点からも、SQL発行以外(例えばファイル処理)は普通に処理されてしまうのも問題です。おかしいと判断できたら、さっさとexitするのは鉄則です。
XOOPS CubeがXOOPSからフォークした理由の一つに、チケットシステムへの理解、というのがあったはずです。であるなら、チケットシステムを導入するだけでなく、「とりあえず」の簡易CSRF対策を外して欲しい、と思っているのは私だけでしょうか。
don't forget CSRF starts with the assumption that Javascript code can be inserted