itemをevalするのはまずいかも
2008年6月25日
久々の更新。
先日、とあるPHPの本を読んで知ったのだが、HTMLへのPHPコードの挿入は、<?php ... ?>以外に、<script language="php">...</script>でもできる。PHP5でもこれを確認した(PHP6ではどうだか知らない)。
現在のバージョンでは、それぞれのアイテムのパースにもevalを使っている。admin以外でのPHPコードの実行を回避するために、『<?』を『<?』に変換しているが、これだけでは穴があるということになる。
改めて、ブラックリスト形式でのセキュリティー対策が怖いことを思い知らされた。ここの部分の実装を再考せねばならない。ここの対策は、前から気になっていたところではある。
1)いっそのこと、メンバーは一人だけ(superadmin)にする
2)superadmin以外の記事はすべてhtmlspecialcharsし、ホワイトリスト形式で、許されたタグだけ元のタグに戻す
3)superadmin以外の記事はすべてhtmlspecialcharsし、別途BBcodeなどをコアでサポートする
などの対策が考えられる。このツールの開発を始めた当初は1)も考えたが、多分この方法は取らない。Nucleusにおける複数メンバーでの使用の利便性を考えると、superadmin以外はすべてhtmlspecialcharsにしてでも複数メンバーに対応したほうがよさそう。
ならば、2)か3)だが、多分コアでは2)をサポートすることになると思う。とりあえず、正規表現を考えてみる。
どちらの方法を使うにせよ、htmlspecialcharsの後『<%』を『<%』に戻してからevalし、最後にタグに変換するのがよさそう。そのため、『<%』ではPHPコードが実行されないサーバ設定であることを確認するルーチンを入れる必要がある(もっとも、そうなっていないとほとんどのスキン変数でエラーが出るのだけれど)。
先日、とあるPHPの本を読んで知ったのだが、HTMLへのPHPコードの挿入は、<?php ... ?>以外に、<script language="php">...</script>でもできる。PHP5でもこれを確認した(PHP6ではどうだか知らない)。
現在のバージョンでは、それぞれのアイテムのパースにもevalを使っている。admin以外でのPHPコードの実行を回避するために、『<?』を『<?』に変換しているが、これだけでは穴があるということになる。
改めて、ブラックリスト形式でのセキュリティー対策が怖いことを思い知らされた。ここの部分の実装を再考せねばならない。ここの対策は、前から気になっていたところではある。
1)いっそのこと、メンバーは一人だけ(superadmin)にする
2)superadmin以外の記事はすべてhtmlspecialcharsし、ホワイトリスト形式で、許されたタグだけ元のタグに戻す
3)superadmin以外の記事はすべてhtmlspecialcharsし、別途BBcodeなどをコアでサポートする
などの対策が考えられる。このツールの開発を始めた当初は1)も考えたが、多分この方法は取らない。Nucleusにおける複数メンバーでの使用の利便性を考えると、superadmin以外はすべてhtmlspecialcharsにしてでも複数メンバーに対応したほうがよさそう。
ならば、2)か3)だが、多分コアでは2)をサポートすることになると思う。とりあえず、正規表現を考えてみる。
どちらの方法を使うにせよ、htmlspecialcharsの後『<%』を『<%』に戻してからevalし、最後にタグに変換するのがよさそう。そのため、『<%』ではPHPコードが実行されないサーバ設定であることを確認するルーチンを入れる必要がある(もっとも、そうなっていないとほとんどのスキン変数でエラーが出るのだけれど)。