昨日に引き続いて第二回は、とその前に前回の説明で少し・・・。メニュー設定ですが、レガシーでない設定でないと前回のメニューは作成されない事をここで補足しておきます。
さて、第二回は、ページカウンターを上の画像のように、変更してみます。Joomla!のデフォルトだと見た目が・・・アレなので、表示されていない方もたくさんおられるでしょうが、少し体裁というより表示する文字を、ランゲージファイルの変更をしないで変更してみます。
Joomla!のデフォルトのテンプレート(rhuk_milkyway)では、オーバーライドされていないのでまずは、オーバーライドテンプレートを作成します。(beezや、ja_purityでは、すべてでは無いかもしれませんが、オーバーライドされています。)
お使いのテンプレート/html/com_content/category
お使いのテンプレート/html/com_content/frontpage
お使いのテンプレート/html/com_content/section
(※すでにある場合は作成する必要はありません。)
Joomla!1.5.8からでしょうか、1.5.7か1.5.6と比較するとそうでなさそうなのでたぶんそうでしょう。フロントエンドからの新規投稿時に公開終了日時が現在時刻で初期化された値がすでに表示されてしまっていて気づかずにそのまま保存すると、公開と同時に終了となってしまいます。
Joomla.orgのフォーラムでもあがっていました。Joomla!1.5.9で修正されると思います。
こういう仕様だと言われればそうなのかもしれないが、使い勝手が悪い。
なので少し変更してみました。
Root/components/com_content/views/article/tmpl/form.php
$config =& JFactory::getConfig();
$publish_up =& JFactory::getDate($this->article->publish_up);
//$publish_down =& JFactory::getDate($this->article->publish_down);
$publish_up->setOffset($config->getValue('config.offset'));
//$publish_down->setOffset($config->getValue('config.offset'));
$publish_up = $publish_up->toFormat();
//$publish_down = $publish_down->toFormat();
$publish_down = '';上記のようにすることで解決します。
本体をさわりたくなければ、テンプレート側でオーバーライドしてやれば良いですね。
以前に紹介して実際にこのサイトでも使っているDS-Syndicateでセキュリティホールが公表されていました。私は、改造して使っていたりなのですが、そこまで見ていませんでした。
対応策
new_feed(mosGetParam( $_GET, 'feed_id', ""));
を
new_feed(intval( mosGetParam( $_GET, 'feed_id', "") ));
のように(他の方法でももちろん良い)数値にサニタイズすることで対処できます。
追記:さらにすでに攻撃されたかどうかは、Root/components/com_ds-syndicate/feedフォルダ内を見て下さい。そこに通常のファイルではなさそうなものがあればすでに攻撃されたものだと思われます。フォルダ内のファイルをすべて削除する必要があります。
念のためまだ10月の途中ですが、毎月行っているiLogScannerのスキャンを行ってみました。
22日現在の時点で104件の攻撃で幸い成功はしていないようです。
成功していないというのは厳密に言うと間違いです。この攻撃を使ってのインジェクション攻撃は成功しています。そしてデータベースのnameとpasswordは見る事ができたかもしれません。ですが、Joomla!は生のパスワードは保存していません。パスワードは、Joomla!の独自メソッドでハッシュ値に変更されたものなので生のパスワードを悟られる事はまずありえ無いでしょう。心配な方は、パスワードを変更してください。
ログを見てみるとDS-Syndicateに対する攻撃は、10月6日から来ています。公表されるずいぶん前の時点ですね。情報を素早く入手することももちろん大切ですが、エクステンションを導入するときには気軽に導入すべきではないことも事実のようです。また、たくさんの人が使っているから大丈夫ということも絶対言えませんし、あのサイトで紹介されているから大丈夫とも言えません。
Joomla!1.5.3JPを新規インストールし、管理画面から新規にテスト記事を作成してみたら、記事の公開終了日時が公開日以前になってしまうではないか・・・。編集時にすでにそう表示されてしまっています。
なぜか、うちのテストサーバーでは正常です。ま、とりあえず応急策。
Joomla Root/administrator/components/com_content/controller.php
if (JHTML::_('date', $row->publish_down, '%Y') <= 1969 || $row->publish_down == $db->getNullDate()) {
$form->set('publish_down', JText::_('Never'));を以下のように変更した。
if ($row->publish_down == JText::_('Never') || JHTML::_('date', $row->publish_down, '%Y') <= 1969 || $row->publish_down == $db->getNullDate()) {
$form->set('publish_down', JText::_('Never'));これでとりあえず解決。
にしても、あらかじめわかっている結果までもJHTMLにつっこむってのはどうなんだろう。それか、"Never"を入れるのではなく、"nulldate"入れておけば、それでOKな気がするし、そうしておけば、nulldateで"Never"と表示すればいいわけで・・・。結局"nulldate"入れるんだし。
と、思って変更しましたが、これだと二度手間なので違う場所を変更します。上記のコードは、無視します。あらためて以下を
$row->publish_down = JText::_('Never');を
$row->publish_down = $nullDate;
に変更した方が無駄がありません。よく考えなくても”終了無し(Never)”の場合、データベースには$nullDate(0000-00-00 00:00:00)で登録される訳なのでこの方がスマートですし、先の方法では管理画面のランゲージを変更した場合に同じ条件にならない可能性がありますね。
※これは、私の環境でのみ発生した事象かもしれません。ちなみにランゲージを英語に変更すると正常に表示されます。ですが、各国の言語で”Never"を表現していてそれをJHTMLからdateな判断をさせるのは少しおかしい気がします。
また、Fireboardのコードを変更しちゃいました。
投稿メッセージ中にコードを入力するとうちではSyntaxHighliterプラグインによってHighlightされますが、コード中に改行が入っていても<br />タグに変換されてしまうため見苦しいものになっていました。
そこで・・・。
root/components/com_fireboard/template/default/smile.class.php 内5カ所を変更・追加しました。
if ($break == "\r") $break = "\n"; while (list(, $value) = each($content))
を
if ($break == "\r") $break = "\n"; $textarea = false; while (list(, $value) = each($content))
のように
if ((!count($innbr) && in_array($t[1], $nobr)) || in_array($t[1], $innbr)) $innbr[] = $t[1]; // Otherwise this is a closing tag
を
if ((!count($innbr) && in_array($t[1], $nobr)) || in_array($t[1], $innbr))
$innbr[] = $t[1];
// Otherwise this is a closing tag
if(strpos($value, 'name="code"')){
$textarea = true;
}
のように
if (in_array(substr($value, 1), $innbr)) unset($innbr[count($innbr)]);
を
if (in_array(substr($value, 1), $innbr))
unset($innbr[count($innbr)]);
if(strpos($value, 'textarea')){
$textarea = false;
}
のように
if (!count($innbr) && !$textarea)
$value = str_replace("\r", "<br />\n", $value);
を
if (!count($innbr) && !$textarea)
$value = str_replace("\r", "<br />\n", $value);
のように変更してみました。
この変更は、少し場当たり的と言えるかもしれませんが、一番簡単で私の目的は成し得ていますので十分と言えると思っています。