未実装の機能をスクリプトの改造で実装する方法について。実行する際はあらかじめバックアップを取って戻せるようにしておきましょう。スクリプトの改造は自己責任ですよ。
※ このページを編集する場合、rNote のバージョンも添えていただけるとよいですね。
複数の RSS を静的に生成する(0.9.7.5) *
まず、rnote_config.php に以下の設定を追加。
define(FNAME_RSS2,'rss2.rdf'); define(FNAME_SKIN_RSS2,DIR_DATA.'rss2_body'.FNAME_SKIN_EXT);
次に rnote.php の860行目あたりにある、function CreateRSS() のあたりを以下のように変更する。
function CreateRSS(){
if(!file_exists(FNAME_RSS))return;
$a = CreateHTML(15,FNAME_SKIN_RSS,false);
if(SITE_CHARSET!='UTF-8') $a = mb_convert_encoding($a,'UTF-8',"auto");
$fp = _fopen_wb(FNAME_RSS);
fwrite($fp,$a);
fclose($fp);
if(!file_exists(FNAME_RSS2))return;
$a = CreateHTML(15,FNAME_SKIN_RSS2,false);
if(SITE_CHARSET!='UTF-8') $a = mb_convert_encoding($a,'UTF-8',"auto");
$fp = _fopen_wb(FNAME_RSS2);
fwrite($fp,$a);
fclose($fp);
}
そうしておいて、rss.rdf があるディレクトリに空の rss2.rdf を置き、パーミッションを 666 にしておくと、再構築時に生成されるようになる。3個以上にしたい場合は上記を参考にさらに書き加えればよいと思われる。
対コメントスパム、トラックバックスパム(0.9.7.5) *
rNote はデフォルトの状態ではコメントスパムやトラックバックスパムに対して無力であるので本体を少しいじって対抗する。
トラックバックスパム*1 *
rnote_configのカスタマイズに、rnote_config.php に記述するタイプの対策があります。互換性を重視される場合はそちらを参照してください。
rNote.php 内の TrackBackSave 関数の
$excerpt = form_treatment($excerpt,true,true,true);
の行(473行あたり)の次に、以下のコードを追加。
// TrackBack送信元の記事を走査するように変更
$tfile = fopen( urldecode( $url ), "r" );
if( !$tfile ){
// TrackBack元エントリのオープン失敗
exit;
}
$tdata = "";
while( !feof( $tfile ) ){
$line = fgets( $tfile, 1024 );
$tdata = $tdata.$line;
}
fclose( $tfile );
if( ( strpos( $tdata, SITE_URL ) > 0 ) || ( strpos( $tdata, SITE_TITLE ) > 0 ) ){
}else{
TrackbackError( 'This entry is not accept your trackback.' );
}
トラックバック送信元の内容を走査し、自サイトの URI かサイトタイトルがあればトラックバックを受信し、無ければ受信しないようになる。
コメントスパム *
rnote_configのカスタマイズに、rnote_config.php に記述するタイプの対策があります。
基本的に rnote_config.php 内の「記録しないリファラ」を応用する。
rnote_config.php に $ng_comment[]='poker'; みたく NG ワードを追加して、rnote.php の Writeback 関係のあたり(520行目くらい)に以下のように追記する。追記するのは global $ng_comment; と foreach 文の3行の計4行。
/=====================================
// WriteBack
function WriteBackSave(){
global $g_bCellphone;
global $ng_comment;
(19行ほど略)
$name = form_treatment($name ,FORM_CONVENC_AUTO,true,true);
$wburl= form_treatment($wburl,FORM_CONVENC_AUTO,true,true);
$com = form_treatment($com ,FORM_CONVENC_AUTO,false,false);
foreach($ng_comment as $n) if(ereg($n,$name)) return;
foreach($ng_comment as $n) if(ereg($n,$wburl)) return;
foreach($ng_comment as $n) if(ereg($n,$com)) return;
(以下略)
こうすることで名前、URI、コメント本文のいずれかに NG ワードがあった場合、「書き込みは終了したかのように見えてログファイルへの書き込み前に関数から抜けている」ので書き込みはない。
エラーページに飛ばしたい場合はソース内を参照して foreach 文を変更すること。新しいエラーメッセージを作るのも良いかも知れない。
NG ワードの一例 *
$ng_comment[]='angebote';
$ng_comment[]='weddingbell';
$ng_comment[]='holdem';
$ng_comment[]='pills';
$ng_comment[]='poker';
$ng_comment[]='roulette';
$ng_comment[]='baccarat';
$ng_comment[]='black';
$ng_comment[]='jack';
$ng_comment[]='casino';
$ng_comment[]='href';
海外からのオンラインカジノ系のコメントスパムが多かったりする*2。一番最後の「href」はコメントに HTML を入れてくるコメントスパム対策。だいたい怪しいサイト関連へのアンカーばっかりですからね。
簡易認証 *
snapblog - rNoteのコメントスパム対策を参照してください。
コメント投稿者 IP アドレスを取得する(0.9.7.5) *
【警告!】
この改造は後継バージョンが出た際コメントログファイルの互換性を損ねる危険性が高いので、そのあたりを割り切れる方だけ改造したほうがいいでしょう
コメントスパムをするひとをアクセス拒否する一助に(なるかも)。
改造箇所は以下の通り。
- WriteBackSave 関数
- 530行目くらい、"//write log" のコメント部分以降を追記変更。
// write log $logfile = DIR_DATA.ext_change($file,EXT_LOGFILE); $times = time(); $postip = $_SERVER['REMOTE_ADDR']; $new_msg = "$name\t$wburl\t$com\t$times\t\t\t$postip\n";
- GetContentsEach 関数
- だいたい1130行目くらい、
list ($name,$url,$com,$times,$title,$mode) = explode("\t",str_replace("\n","",$d0));を以下のように変更。list ($name,$url,$com,$times,$title,$mode,$ip) = explode("\t",str_replace("\n","",$d0));
トラックバックにも IP アドレスを取得するようにはできる……が、トラックバックの場合トラックバック元のブログなりトラックバック送信スクリプトのあるサーバの IP アドレスが記録されるだけ……使い道はあるかもしれないが。
注釈
*1 無思考雑記帖 - TrackBack spamを弾くように改造(其の2)から引用、及び修正点を修正しています。
*2 あくまで筆者のサイトでは、ですよ
![[PukiWiki] [PukiWiki]](image/pukiwiki.png)