[Zen Cart] security_patch_v138_20090619適用の2つの注意点
2009年11月25日(水)09:00|谷口
谷口です。
Zen Cart本家では今年6月下旬に、日本語版では8月に発表されたセキュリティパッチがあります。これを適用すると動作しなくなるモジュールがあったり、カスタマイズした機能が使えなくなったりして困ったことはありませんか? その問題の解決方法を紹介しようと思います。(今更感がありますが。。。) Zen Cart.comフォーラム Security Announcement — security_patch_v138_20090619.zip ※上記のパッチは非常に重要なパッチですので、まだ適用していない方は必ず適用しましょう。
このパッチはどういった脆弱性を防ぐものなのか?
簡潔に説明しますと、管理画面のCSRF攻撃を防ぐパッチです。 CSRF攻撃につきましては、クロスサイトリクエストフォージェリ – Wikipediaなどを参考にしていただければと思います。
注意点
- 動かなくなる機能があった場合の対処
- 本パッチでCSRF攻撃を防ぎきれない可能性のチェック
動かなくなる機能があった場合の対処
formタグを生成する際にzen_draw_form関数を使っていない場合に起こる可能性があります。 もし、動かなくなる機能があったら、直接formタグを書いている場所が無いかチェックしてみてください。 そういった箇所があればビンゴです。formタグをzen_draw_form関数を使うようにすれば、機能するようになると思います。 直らなければ、このパッチのせいではないかもしれません。
本パッチでCSRF攻撃を防ぎきれない可能性のチェック
※こちらは主にZen Cartの管理画面をカスタマイズしてご利用の場合が対象です。
さて、何をチェックすれば良いかというと、まず本パッチで展開されるファイルの一つに、以下のファイルがありますので、その中身を見てみましょう。 admin/includes/init_includes/init_security_patch_v138_20090619.php
この16行目以降が本パッチの肝です。
16: if (isset ( $_GET ['action'] ) && in_array ( $_GET ['action'],
array ('save', 'layout_save', 'update', 'update_sort_order',
'update_confirm', 'copyconfirm', 'deleteconfirm', 'insert',
'move_category_confirm', 'delete_category_confirm',
'update_category_meta_tags', 'insert_category' ) ))
17: {
18: if (strpos ( $PHP_SELF, FILENAME_PRODUCTS_PRICE_MANAGER ) === FALSE
&& strpos ( $PHP_SELF, FILENAME_PRODUCTS_OPTIONS_NAME ) === FALSE
&& (strpos( $PHP_SELF, FILENAME_CURRENCIES ) === FALSE)
&& (strpos( $PHP_SELF, FILENAME_LANGUAGES ) === FALSE)
&& (strpos( $PHP_SELF, FILENAME_SPECIALS ) === FALSE)
&& (strpos( $PHP_SELF, FILENAME_FEATURED ) === FALSE)
&& (strpos( $PHP_SELF, FILENAME_SALEMAKER ) === FALSE))
19: {
20: if ((! isset ( $_SESSION ['securityToken'] )
|| ! isset ( $_POST ['securityToken'] ))
|| ($_SESSION ['securityToken'] !== $_POST ['securityToken']))
21: {
22: zen_redirect ( zen_href_link ( FILENAME_DEFAULT, '', 'SSL' ) );
23: }
24: }
16行目のin_array関数の第2引数の配列で指定されているactionパラメータ以外はCSRF対策が有効になりません。 そのため、上記以外のactionパラメータを付けているフォームがあったら、in_array関数の第2引数の配列にそのaction名を追加しましょう。 また、CSRF対策が必要にもかかわらずaction名のないフォームがあったら、有効になるようにaction名を付けましょう。
CSRF対策パッチの注意点を書きましたが、他のパッチでも何かあればまた記事にします。