<お知らせ>
恥=下記は更新を終了いたしました。以降の更新は、GUILZ.ORG に移転して行っております。今後ともよろしくお願いいたします。
2011年 04月 09日 更新終了のお知らせ
いい年にもなって、いい加減恥を下記まくるのもアレだろうということで、習慣 恥=下記 は更新を停止することといたしました。
既に長期放置が当たり前でしたので、今さらという感もありますが、長らくのご愛顧に感謝いたします。
今後は下記サイトに活動の場を移し、相変わらずの適当な内容を書き綴ることとさせていただきます。
……はい、要するに看板の掛け替えと移転というだけの話でした。今後とも気が向かれましたら、上記サイトのご閲覧をいただければ幸いです。
習慣 恥=下記 につきましては、未だに一部の記事について検索エンジン等からご訪問いただいているようですので、このまま残しておく予定です。(新規記事は GUILZ.ORG のみとなります)
それでは。
2011年 02月 27日 BaserCMS、だいぶ分かってきたかも
■[ネット] BaserCMS colorbox が動かなかった問題に対処してみた
今回も BaserCMS ネタ。ほぼ全ての修正作業も終わったので、テストしてみようといろいろ更新したりしていたら、colorbox がうまく動かないことが判明。悩んだ結果、動作するようになったのでメモ。
■ 解決策
colorbox のサンプルを見れば一目瞭然だったが、以下のようなコードをレイアウトファイルに追加することで解決。
<script type="text/javascript">
jQuery(document).ready( function() {
$("a[rel='colorbox']").colorbox();
});
</script>
単純にBaser標準タグで jquery.colorbox-min.js だけを呼んでも、そりゃ動くわけないよね。他のライブラリも同じようなものなんだし。つい、BaserCMS の FAQ を見て、それだけで大丈夫だと勘違いしちゃったんだ・・・。
ということで、問題に対処と言うよりは、単なる自分の無知ぶりを晒しただけだったとさ。まあいいか、このブログの名前は「恥=下記」なんだし。
2011年 02月 25日 PivotX 改ざんされた件のまとめ。マズかったら消すかも
■[ネット] PivotX ハッキングによる改ざん点まとめ
現在も事態は進行中のため詳細には触れられないが、取り急ぎサイトの全データを取得できたため、簡単に解析した結果について書いておく。同様の被害に遭われた方の復旧の参考になれば。(ただし、全ての改ざんされたサイトで同様の手口だったかどうかは定かでありません。下記ハッキングチームであれば似たような手法を採るものと思われますが、あくまで参考にとどめ、必ず詳細な解析を行ってください)
■ 改ざんしたハッキングチーム
画像ならびにタイトル等に、Hacked By BoZKuRT という名称が見られ、かつ画像にはトルコ国旗があることから、トルコのハッキングチームによる可能性が高い。また、ログ解析結果を聞いたところによると、改ざんされたと思われる日時にトルコから複数のアクセスがあったとのこと。
■ 改ざん点
以下全て、PivotX の管理画面より
サイト名
サイト名が Hacked By BoZKuRT に変更されていた。サイトホームページは、次に記載する改変されたページがテンプレートとして指定され、表示されるようになっていた。(トップページとして表示されるようになっていた)
・エントリとページ 画面の、先頭カテゴリのインデックスページ
該当ページのテンプレートが
を呼ぶように改変されていた。
ページ内容自体に変更はなかったが、タイトルが Hacked By BoZKuRT に変更されていた。
pivotx/templates/index.html は以下の通り
<HTML><HEAD><TITLE>||| Hacked By BoZKuRT|||</TITLE> <META http-equiv=Content-Type content="text/html; charset=utf-9"> <META content="MSHTML 6.00.6001.18294" name=GENERATOR></HEAD> <BODY bgColor=#000000 onload=teclear();> <embed src="http://www.fileden.com/files/2011/1/28/3068886/023_Hucum_Marsi.mp3" height="0" type="audio/x-ms-wma"> </embed> <center> <img border="0" src="http://img.webme.com/pic/b/byarsslan/hackked.jpg" > </center> </body> </html>
!注意!
上記リンク先のファイルに、何らかのマルウェアがないとも限りません! アクセスする際には細心の注意を払ってください!!
■ 今回突かれた脆弱性
海外では 2011/02/18、日本では 2011/02/21 に公表された、パスワードに関する脆弱性の可能性が高い。
理由として、スーパーユーザーと推測されるIDのパスワードが変更され、ログインできなくなっていた。かつ、推測されにくいスーパーユーザーのIDは問題なくログインできたことから、この脆弱性が最有力と思われる。
! この他にもXSSなどいくつかの脆弱性が存在しますので、PivotXユーザーの方は、至急 2.2.5 へのアップデートを検討してください !
■ 復旧方法などのリソース
・ PivotX 開発者による復旧手順等
http://forum.pivotx.net/viewtopic.php?f=2&t=1967
http://forum.pivotx.net/viewtopic.php?f=2&t=1958
■ このような攻撃への対応策
今回の攻撃は脆弱性の公表前に攻撃が行われる、いわゆるゼロデイ攻撃であり、セキュリティ情報に網を張っていても防ぐことは簡単ではないと考えられる。
しかしながら、それでも常に迅速なCMSのバージョンアップを行っていれば防ぐことができた可能性もあり(とはいえ、脆弱性対応がされた PivotX 2.2.4 公開後、攻撃を受けるまでの猶予は1週間もなく、かつ 2.2.4 公開のリリースは公式サイトで流されさえしなかったのだが)、迅速なパッチ当てが重要という、セキュリティの常道を守る大切さを身にしみて学習できた。
よく使われるIDの使用も考え直した方がいい。確かに役割が分かりやすいが、ブルートフォースアタック対策にもなるため、スーパーユーザーに類するアカウント名は推測されづらいものに変えようと思う。
そして、CMSの開発チームや開発元に対する精査も今後はより重要となっていくだろう。今回のように重要な脆弱性対応であるにも関わらず、リリース情報すら流していない PivotX 開発チームは、個人的には信頼できない(開発チームは、今回の件を大事にしたくなかったという声もある)。そのようにリスキーと考えられるCMSは、いかに魅力的であろうとも利用する前によくよくの検討が必要だろう。
またWAFの導入など、今回のような脆弱性には対応できないとしても、事前にできる限り大きく網をかけておく事も大切だ。今回はサーバー側の事情でそれが許されなかったが、今後のサーバー契約の際にはWAFを重要な設備として検討したい。
2011年 02月 21日 ハクられた話は、落ち着いた頃にでも・・・
■[ネット] BaserCMS についての小ネタ
激しく間が空いたけれども、今回はBaserCMSネタを。Twitterでも書いたけれど、PivotXで作ってたサイトがハクられてしまったので、もうPivotXは使いたくない、というクライアントや私の個人的心情を踏まえ、BaserCMSに乗り換えるための作業を行っていた。
デザインや機能自体は、PivotXで実現していたものとほぼ同じものが2日(実質1日半くらい) でできたのだけど、若干デフォルトのテンプレートやコードを使うだけではうまくいかなかった点を備忘録としてメモしておく。
■ カテゴリーごとにバナー画像を自動で貼りたい
単純に、各カテゴリーごとに表示させるバナー画像を変えるためのテクニック。たかだかそれだけのためにレイアウトファイルを複数作るのも無駄だし、現在のBaserCMSでページごとに特定のレイアウトを適用する為には、ソース表示をして
<?php $this->layout = 'layout_name' ?>
のようにコードを埋め込む必要があるため、詳しい人ならまだしも、あまり詳しくない人がこの作業を新規ページ作成の度に行うのも難しいだろうということで、以下のようなコードをlayouts/default.ctpに書いた。
ページカテゴリ名をcategory、ページカテゴリタイトルをカテゴリーとした場合。
<div>
<?php
$bannerimg = $baser->getContentsName().'.jpg';
$category = $page->getCategory();
$catname = $category['title'].'バナー';
echo $html->image("$bannerimg", array('alt'=> "$catname", 'width'=> "700", 'height'=> "150"));
?>
</div>
書き出されるコードはこんな感じ。
<div> <img src="/BaserCMS_DIR/app/webroot/themed/THEME_DIR/img/Category.jpg" alt="カテゴリーバナー" width="700" height="150" /> </div>
注意点としては、ページカテゴリ名が英文字の場合、先頭文字が大文字になるため、imgにアップする画像名も先頭文字を大文字にしなければいけない事くらいかな。画像以外にも、カテゴリをトリガーとして、何か変化を付けたい場合には応用できるかも。
■ カテゴリごとのローカルナビゲーションにアクティブ表示をしたい
自分がいるページを示すために、ローカルナビゲーションにid等を割り振ってCSSで表示を変えるというのはよく行われているけど、デフォルトのローカルナビゲーション用コードでは、アクティブ表示ができないようだったので、coreから以下のファイルを持ってきて書き換えてみた。
・ elements/submenus/local_navi.ctp を、自分のテーマのelementsにコピーして編集
<?php
$pageCategory = $page->getCategory();
?>
<?php if($pageCategory): ?>
<div id="local-navi">
<?php $baser->element('page_list',array('categoryId'=>$pageCategory['id'])) ?>
</div>
<?php endif ?>
単純に<h2>が要らなかったので消しただけ。コメント部分は省略。
・elements/page_list.ctp を、自分のテーマのelementsにコピーして編集
<?php
$pages = $baser->getPageList($categoryId);
?>
<ul>
<?php
$curcheck = $baser->getContentsTitle();
if(!empty($pages)){
foreach($pages as $key => $page){
$no = sprintf('%02d',$key+1);
if($curcheck == $page['title']){
$class = ' class="current"';
}else{
$class = ' class="page'.$no.'"';
}
if($this->base == '/index.php' && $page['url'] == '/'){
echo '<li'.$class.'>'.str_replace('/index.php','',$baser->getLink($page['title'],$page['url'])).'</li>';
}else{
echo '<li'.$class.'>'.$baser->getLink($page['title'],$page['url']).'</li>';
}
}
}
?>
</ul>
このコードで、ページのタイトルが一致したら、該当の<li>にclass="current"が付き、それ以外にはpageXX(XXは連番) がクラスとして割り当てられる。idでもいいんだけど、元々がクラスだったので合わせてみた。(本当は番号のクラスも要らないけど、何かに使うかもということで、その部分のコードは元のまま残してある。要らなければelse以下を削れば桶)
<?php $baser->element('local_navi') ?>
書き出されるコードは、こんな感じ
<div id="local-navi"> <ul> <li class="current"><a href="/BaserCMS_DIR/index.php/CategoryName/page01">ページ01</a></li> <li class="page02"><a href="/BaserCMS_DIR/index.php/CategoryName/page02">ページ02</a></li> </ul> </div>
これでカテゴリさえきちんと作っていれば、アクティブ表示も可能となる。
以上の事以外は、特に難しいことをしなくてもパンくずリストも出せるし、かなりテーマのカスタマイズはやりやすかった。ただ、惜しむらくはIEで重いことかな・・・。何故か今回作った、カテゴリごとに画像を読ませるところで、画像表示が遅い。テーマの作りやすさや柔軟さ、各種機能と使い勝手は素晴らしいので、今後の改善に期待しています。
■ 2011/02/28 追記(IE6への対応)
CSSの書き方にもよるのだろうけど、IE6ではクラスではなくIDでアクティブとなる要素を指定しないとうまく動作しなかった。よって、elements/page_list.ctp を以下のように再度編集した。
・elements/page_list.ctp
<?php
$pages = $baser->getPageList($categoryId);
?>
<ul>
<?php
$curcheck = $baser->getContentsTitle();
if(!empty($pages)){
foreach($pages as $key => $page){
$no = sprintf('%02d',$key+1);
if($curcheck == $page['title']){
$class = ' id="current"';
}else{
$class = '';
}
if($this->base == '/index.php' && $page['url'] == '/'){
echo '<li'.$class.'>'.str_replace('/index.php','',$baser->getLink($page['title'],$page['url'])).'</li>';
}else{
echo '<li'.$class.'>'.$baser->getLink($page['title'],$page['url']).'</li>';
}
}
}
?>
</ul>
先のコードではアクティブ要素以外に出力されていた連番要素も排除した。このコードでは以下のように出力される。
<div id="local-navi"> <ul> <li id="current"><a href="/BaserCMS_DIR/index.php/CategoryName/page01">ページ01</a></li> <li><a href="/BaserCMS_DIR/index.php/CategoryName/page02">ページ02</a></li> </ul> </div>
IE6以外のブラウザ(IE7、IE8、Chrome、Firefox、Opera、Safari) では、IDでなくクラスで正常動作した。
今時IE6への対応なんて必須じゃなくなりつつあるけど、それでも対応せざるを得ない場合があるので追記。ほんと、もう、やりたくないんだけどね・・・。
