Nucleus

Jeans & Development 電子ブロック工房 三日坊主 フロントページ

NP_R2Referer [Nucleus]

2007年11月19日

公式Wiki本家フォーラムを見ていて思いついたプラグイン。

ログイン/ログアウトした直後に、リファラにリダイレクトするだけ。リファラが管理ページの場合/リファラが設定されていない場合/リファラがログアウトページの場合、リダイレクトは行わない仕様。需要があるようなら公式Wikiに載せますけれど、どうでしょう?

NP_Multilingual [Nucleus]

2007年11月18日

多国語表示プラグインがどうやら出来たみたいだ。50行に満たない長さだけれど、予定していた機能は一通り実装している。

始めは、どのような言語を使うかというところについて、プラグインオプションで設定できるようにしようかと考えたけれど、PHPファイルを直接書き換えて設定するようにした。自分自身で使う場合は日本語(ja)と英語(en)だけだし(デフォルトの状態)、他の人が使う場合でもインストールの際に一度きり設定するだけだろうから、これでよいだろう。

とりあえずこのブログにインストールして、少し使用した後に、公式サイトのWikiに上げる予定。

多国語表示プラグイン [Nucleus]

2007年11月18日

ちょっと思うところあって、多国語表示プラグインを考えてみたい。具体的には、URLに

index.php?lang=ja
index.php?lang=en

などとすると、それぞれの言語を用いてブログを表示するというもの。実は、よく似たことをちょこっとやっていたりするのだが(これと、これ)、今のものはどうも使いにくくて、拡張性も低いので、改めて開発することにする。

リモートファイルインクルードを阻止 [Nucleus]

2007年8月22日

先日、リモートファイルインクルードを狙った不正アクセスが多い件について書いた。これらの不正アクセスによるクラッキングは当然ながら失敗しているのだが、一日100件ほどあるこういった不正アクセスにサーバのリソースが消費されていることを考えると馬鹿馬鹿しいので、やはり対策をしたほうがいいだろう。

index.php の冒頭に、次のコードを挿入した。

if (isset($_REQUEST) and isset($_COOKIE)) {
    foreach($_COOKIE as $key=>$value) {
        if (isset($_REQUEST[$key])) unset($_REQUEST[$key]);
    }
}
$except=array('query','userid');
check_remote_inclusion($_REQUEST,$except);
function check_remote_inclusion(&$var,&$except){
    foreach($var as $key=>$value){
        if (in_array($key,$except)) continue;
        if (is_array($value)) check_remote_inclusion($value,$except);
        elseif (preg_match('!^[a-zA-Z]{1,5}://!',$value,$matches)) {
            echo '<html><head><title>ERROR</title><body>';
            echo 'Request cannot start from "'.htmlspecialchars($matches[0]).'".';
            echo '</body></html>';
            exit;
        }
    }
}
unset($except);

『http://』、『ftp://』、『php://』などで始まるリクエストをすべて排除する仕組み。ただし、『query=http://....』『userid=http://....』といったリクエストは例外的に受け付けるようにしてある。

(追記) 攻撃は、このサイトの他のブログにも向けられてきたので、すべてのブログに同じ措置を施した。

(追記 070901 コード改定)クッキー関連で不具合があったので、$_REQUEST から $_COOKIE を削除するルーチンを加えた。

ファイルインクルードを狙ったクラック [Nucleus]

2007年8月7日

最近、Nucleusに対するこの手のアクセスが多い。例えば、今日 16:49:08 GMT から 19:08:14 GMT までの間に、17回の不正アクセスが4つのIPアドレスからあった。手口からすると、IP詐称でさまざまなアドレスからアクセスしてくるのでは無いらしい。Uset-Agent は、『libwww-perl/x.xx』で、PERL用のライブラリ。x.xxの部分はバージョンで、5.65 から、 5.808 までさまざまである。アクセスしてくる4つのアドレスは、バックドアを仕掛けられた4つのサーバに相当していて、クラッカーはこれらの乗っ取ったサーバを経由してアタックしてきているのではないかと思われる。

具体的なURIとしては、例えば
/index.php?body=http://xxx.xxx.com/larry123/safe.txt?
こんな感じ。

インクルードしようとするスクリプトはPHPで書かれているが、これについては、にっき - ほしにねがいをに、ある程度まとめられている。

今のところNucleusでの被害は起こりそうに無いけれど、プラグイン製作の際は当然ながらファイルインクルード系の命令には注意が必要だ。

ブログの多言語化 [Nucleus]

2007年7月5日

ブログの一部を英語化した。これ用に、一つ簡単なプラグイン(NP_text)を製作した。ソースコードは、記事の続きに。

1)まず、english.php と japanese-euc.php を用意し、スキンディレクトリに配置(nucleus/language/japanese-euc.phpを参考のこと)。

2)スキンの必要な箇所をすべて、<%text(XXXXX)%>に置き換える。

3)head.inc の冒頭に、
<%plugin(text,header,text/html)%>
を記述(HTTPヘッダ送信のための記述;将来、<%text%>タグがコアでサポートされるときのことを考え、<%plugin%>タグとして表記)。

4)HTML タグを、次のように記述。
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%text(_SKIN_LANG)%>" lang="<%text(_SKIN_LANG)%>">
ただし、_SKIN_LANG として、en と ja-JP を用意。

5)META タグを、次のように記述。
<meta http-equiv="Content-Type" content="text/html; charset=<%text(_CHARSET)%>" />


6)英語で使用したいブログのindex.phpに、次の2行を挿入。
$text_language='english.php';
include('../../nucleus/nucleus/language/english.php');

secureCookieKeyについて [Nucleus]

2007年6月15日

Nucleus 3.3 では、クッキー認証キーを暗号化してデータ保存するための機能を新たに追加してあります。また、クッキー認証キーは、IP-Address と関連付けて認証を行うようにしてあるため、別のIP-Addressからアクセスする場合には同じ認証キーが使えないようになっています。(→参考記事

config.php で $CONF['secureCookieKey']の値を設定すれば、この機能を調整することが出来ます(phpMyAdmin で nucleus_config テーブルに値を追加することで調整することも可能です)。

この新しい機能はセキュリティー強化のためのもので、セッションハイジャックを防ぐための手段です。Nucleus 3.3 をインストールした状態(あるいは、以前のバージョンから 3.3 にアップグレードした状態)で不具合がなければ、絶対に$CONF['secureCookieKey']の値を設定したりしないでください。また、この値を変更することでセキュリティー強度がどのように変化するかの深い知識がない場合も、絶対に設定変更しないでください。

よく分からなくても設定してよい例は、
$CONF['secureCookieKey']=32;
だけです。この場合、デフォルト状態よりもセキュリティーが少し強化されます。反面、環境によっては、頻繁に勝手にログアウトしてしまうなどの不具合が出る可能性もあります。その場合は、上記設定を削除してください。

SQL クエリーの実行回数 [Nucleus]

2007年6月13日

globalfunctions.php にある、sql_query() 関数の冒頭部分は、次のようになっている。

function sql_query($query) {
    global $SQLCount;
    $SQLCount++;

これを用いて、何回SQLクエリーを実行したかの大まかな値を取得することが出来る。プラグインによっては、『mysql_query()』を直接呼び出しているものもあるので、実際には $SQLCount プラスαが実行回数である。

 実行回数を知るには、例えば、index.php の最後(『selector();』の次の行)に、次のように記述すると良い。

echo '<!--'.(int)$SQLCount.'/'.memory_get_usage().'-->';

ここでは同時に、メモリの消費量を見るためにmemory_get_usage()関数の戻り値も表示している(PHPのコンパイル方法によっては、この関数は使えないので注意)。

NP_SavePluginOptions [Nucleus]

2007年6月12日

Nucleus::subSilver サポートツール(というより、NP_AccountExのサポートツールか?)の一つ。ほぼ出来上がったように思うので、とりあえずメモ。このプラグイン、NP_SavePluginOptionsを使うと、プラグインオプションとプラグインが使用するSQLテーブルの値を、SQL テキストファイル(*.sql)として保存することが出来る。データをロードするには、『DB保存/復元』の、『ファイルからリストア』を実行すればよい。phpMyAdmin からもロードできるはず。

(追記:070620このプラグインは今後、NucleusJP Forum にてサポートを行います

NP_AboutThis [Nucleus]

2007年6月8日

ブログ内の単一の記事に対するリンクを作成するための簡単なプラグインを書いた。利用方法は、

<%AboutThis(link,『<:name:>』について)%>    … リンクを表示
<%AboutThis(link,『<:shortname:>』について)%> … 上と同じだが、短いブログ名を使用
<%AboutThis(linkraw)%>              … URL のみを表示
<%AboutThis(itemid)%>               … アイテムID のみを表示

各ブログごとにアイテムIDを一つずつ指定する(ブログの設定の NP_AboutThis の所)。
<<前の記事   後の記事>>