トラックバックスパム対策(その2)
Ogawa::Memoranda さんご提供のスパム対策プラグインに対し、下記の改変を行いました。
- プラグイン:Quasi-Spam Filter Plugin 改変内容:トラックバックのタイトル文字列をフィルタ対象に加える
事後になってしまいましたが改変についてOgawaさんご本人の許諾を頂けましたので、引き続き本エントリーにて公開したいと思います(経緯の詳細等は追記をご覧ください)。
以下、元の記事です。
オリジナルのプラグインは、トラックバックについては概要(excerpt)のみがフィルタ対象となっています。ということで、タイトル(title)にはフィルタ文字列が存在するのですが本文にフィルタ文字列が含まれないトラックバックスパムが到来しました。
本文に含まれる文字列をフィルタ対象にするという手もありますが、本文に特異な文字列が存在していないこととタイトル部分もフィルタ対象に含めた方が効率良さそうなので、quasi-spamfilter.pl を下記の通り修正しました。
sub tbping_filter {
my ($eh, $app, $ping) = @_;
return !is_tbping_spam($ping->excerpt);
return !(is_tbping_spam($ping->excerpt) | is_tbping_spam($ping->title));
}
sub tbping_throttle_filter {
my ($eh, $app, $tb) = @_;
my $q = $app->{query};
return !is_tbping_spam($q->param('excerpt'));
return !(is_tbping_spam($q->param('excerpt')) | is_tbping_spam($q->param('title')));
}
sub tbping_error {
my $app = shift;
my $q = $app->{query};
my $mode = $q->param('__mode') || $app->{default_mode};
return if $mode ne 'ping';
if (is_tbping_spam($q->param('excerpt'))) {
if (is_tbping_spam($q->param('excerpt')) || is_tbping_spam($q->param('title'))) {
$app->add_methods('ping' => sub { });
$app->_response(Error => 'Spam TBPing!', Code => 403);
}
}
動作は一応確認しておりますが適用に際しましては個人の責任で行ってくださいますよう、よろしくお願い致します。なお本改変に対する改善案をOgawaさん本人より頂きいておりますので、興味のある方は該当記事のコメント欄をご覧になってください。
2005.02.17 追記
本改変について「(CCLの条件から外れた形で許諾なしに)改変を掲載しているのはまずいのではないか?」というトラックバックを頂きまして、確かにご指摘の通りでしたので著作権者のOgawaさんにお詫びと許諾の旨、ご連絡致しました。
頂いた回答を引用させて頂きますと「Quasi-Spam Filter Plugin はブログ本体とは異なり、Artistic License に基づいて配布しています」とのことで、
- Quasi-Spam Filter Pluginに基づいていること
- 改変内容の明記
を条件に許諾いただきました。これを受けて記事を若干修正致しました。
なお無断で改変を行っていたことは事実ですので、このような記事を投稿しましたこと、謹んでお詫び申し上げます。
Movable Type 3.15-ja アップグレード
3.121-ja から 3.15-ja にアップグレードしました(ってすでに何日か経ってますが)。
ここでの内容は自宅サーバ用のアップグレード手順です。今回は
を参考にさせて頂きました。ありがとうございました。
1.ダウンロード
Six Apart.よりアップグレード用のパッケージ(ダウンロード画面直前でフルインストールかアップグレードかを決めます)をダウンロードし、解凍します。
2.ファイルのコピー
解凍したフォルダにある下記のフォルダおよびファイルをそれぞれ対応するフォルダ(ファイルはローカル・サイト・パス)にコピーします。なお赤字のものはコピー対象外にしました(配下のファイルを変更または追加しており元の情報が上書きされてしまうため)。
- docs/
- extlib/
- images/
- lib/
- php/
- plugins/
- schemas/
- search_templates/
- tmpl/
- tools/
- LICENSE-COMMERCIAL
- LICENSE-COMMERCIAL-JA
- LICENSE-PERSONAL
- LICENSE-PERSONAL-JA
- mt.cgi
- mt.js
- mt-add-notify.cgi
- mt-atom.cgi
- mt-check.cgi
- mt-comments.cgi
- mt-db2sql.cgi
- mt-search.cgi
- mt-send-entry.cgi
- mt-set-reg.cgi
- mt-tb.cgi
- mt-view.cgi
- mt-xmlrpc.cgi
- styles.css
ずらずらと書きましたが、結局3.1xからのアップグレードの場合で不要なものは
- mt-upgradecheck.cgi
- mt-upgrade20.cgi
- mt-upgrade21.cgi
- mt-upgrade221.cgi
- mt-upgrade25.cgi
- mt-upgrade26.cgi
- mt-upgrade30.cgi
- mt-upgrade31.cgi
です。これらをコピーする必要はありませんので削除します。
赤字の plugins フォルダはプラグインを何も加えていない場合、また search_templates は配下のファイルを変更していなければコピー対象に加えてください。
なお正規のアップグレード手順は docs 配下の mtupgrade.html に記載されています。ちなみにここには「extlibディレクトリ内のファイルをアップロードするときは、以前Movable Typeをインストールしたときにインストールしたライブラリをどれも上書きしないよう注意してください。」と書かれてますが、今回も思いきり上書きしました。
3.セキュリティ脆弱性対策プラグイン削除
Movable Typeの脆弱性と対策についてで公開されているプラグイン patch-20050124-mail-spam.pl を plugins フォルダに設定している場合は削除します。
4.再構築
3.1xからのアップグレードではCGIを起動する必要はありませんので、各アーカイブページをいつも通り再構築するだけです。これで各ページのバージョン表示が更新されます。バージョン表示部分のMTタグをモジュール化されている場合は、モジュール単体での再構築が必要な場合があります(私は以前これにひっかかりました)。再構築後
- Movable Type 3.15-ja
が表示されればOKです。
5.編集画面のテキストエリア拡張
アップグレードとは直接関係ありません。テンプレート編集画面およびエントリー投稿画面のテキストエリアが狭く感じるので個人的に毎回広げてます。テンプレート編集画面、エントリー入力画面ともに縦幅を拡張します。各ファイルの修正行は
- /tmpl/cms/edit_template.tmpl:128行 /tmpl/cms/edit_entry.tmpl:200行
です。具体的な内容は
を参照ください。
以上です。たしかに管理画面のレスポンスが向上しているようです。
トラックバックスパム対策(その1)
数日前に発生した突然のトラックバックスパムは色々なサイトに送信されていたみたいですね。ご近所のサイトをみたところ
より
がありました。
個人的には先日より利用させて頂いているコメントスパム対策が活用できるのではないか?と考えてましたが、考えるだけです(笑)。と思っていたところ、
がバージョンアップされてまして、トラックバックスパムにも対応するようになっていました。
ということでこちらを利用させて頂くことに。
前回との差分は、
# Set your spam pattern
our $COMMENT_PATTERN = '<h1>|<a\s'; # H1 or A elements
our $TBPING_PATTERN = '<h1>|<a\s'; # H1 or A elements
と、トラックバック用の変数が追加されています。赤字の部分を
our $TBPING_PATTERN = 'hoge1|hoge2|hoge3';
とし、最近受けたトラックバックに含まれる一部の文字列に変更しています。
プルダウンメニューに表示されたアーカイブリンクの選択状態を保持する
具体的な動作は、プルダウンメニュー化された月別アーカイブリストやカテゴリーアーカイブリストから任意のアーカイブリンクを選択すると、自動的に選択したアーカイブページにジャンプし、ジャンプ先にある同じプルダウンメニューに、選択されたアーカイブリンクを表示します(通常のプルダウンメニューは他のページにジャンプすると選択状態が元に戻ってしまいます)。このカスタマイズを行うことでプルダウンメニューの直感的な操作が可能になります。左の図は月別アーカイブリストから「2004年11月」を選択した後、リンク先のページで2004年11月が選択状態になっていることを示しています。 以下のカスタマイズはJavascriptを外部ファイルにする場合・しない場合の2パターンで記述しています。外部ファイルにしない場合は1項を、する場合は2項を実施してください。 |
1.JavaScriptを外部ファイルにしない場合のカスタマイズ
1.1 月別アーカイブリストの変更
テンプレートの「日付アーカイブテンプレート」を選択し、サイドメニューの月別アーカイブ("Monthly Archives"というタイトルのタグ)が設定されている直下に青色のタグおよびスクリプトを挿入します。
<script type="text/javascript">
<!--
function selectUrl(sel){
if(sel.options[sel.selectedIndex].value){
location.href = sel.options[sel.selectedIndex].value;
}
}
//-->
</script>
<div class="sidetitle">
Monthly Archives
</div>
<div class="side" id="monthlylist">
<form>
<select name="select" onChange="selectUrl(this.form.select)">
<MTArchiveList archive_type="Monthly">
<option value="<$MTArchiveLink$>"><$MTArchiveTitle$> [<$MTArchiveCount$>]</option>
</MTArchiveList>
</select>
</form>
</div>
<script type="text/javascript">
<!--
var data ="<$MTArchiveTitle$>";
var year = data.substring(0,4);
var month = data.substring(12,14);
var nodes = document.getElementById('monthlylist').getElementsByTagName("option");
for (var i = 0; i < nodes.length; i++) {
var selectYear = nodes[i].innerHTML.substring(0,4);
var selectMonth = nodes[i].innerHTML.substring(5,7);
if(year == selectYear && month == selectMonth){
nodes[i].selected = true;
}
}
//-->
</script>
リストは公開テンプレートを例にしていますがデフォルトテンプレートも大体同じです。緑色部分はデフォルトからセレクトボックスへの変更、および選択時に該当URLにジャンプするためのスクリプトです。既にセレクトボックスが設定済みであれば修正は不要ですので必要に応じて修正してください。また赤色で示す id属性名が他で使用中の場合は、異なる属性名に適宜変更してください。
月別アーカイブをモジュール化(日付アーカイブテンプレートより php または MTInclude タグを用いてインクルード)している場合は、スクリプトをインクルードしている行の直下に設定します。緑色のJavaScriptはどちらに記述しても大丈夫です。
なお、サイドメニューの折りたたみを利用されている方はそちらの id属性名を用いますので、先の
<div class="side" id="monthlylist">
の設定は不要です。ただし現在設定されている id属性名と一致するように、リスト内の赤字部分を適宜修正してください。サイドメニュー折りたたみ用スクリプトが設定されている場合は、上記スクリプトの後方に配置してください。
上記のリストは、図のように先頭から「yyyy年mm月」と表示されているものを前提にカスタマイズしています。先頭に他の文字列を含んでいる場合や年月が「yyyy/mm」等にしている場合は、
var selectYear = nodes[i].innerHTML.substring(0,4);
var selectMonth = nodes[i].innerHTML.substring(5,7);
の赤色部分を修正してください。例えば上の行は「0文字目から4文字目の直前(つまり3文字目)までを取得」という意味です(通常の1文字目はプログラム上「0」と数えます)。
リストをツリー形式にされている場合(例えば該当行のHTMLに月しか表示してない場合)は、先の2行を
var selectYear = nodes[i].value.substring(44,48);
var selectMonth = nodes[i].value.substring(49,51);
として、value属性のURL内にある年月を取得するようにします。赤色部分の値は適宜変更してください。
さらに年月以外のoptionタグが存在する場合は、value属性値(つまりURL)の文字列長をチェックして
for (var i = 0; i < nodes.length; i++) {
var selectYear = nodes[i].innerHTML.substring(0,4);
var selectMonth = nodes[i].innerHTML.substring(5,7);
if(nodes[i].value.length == 61) {
var selectYear = nodes[i].value.substring(44,48);
var selectMonth = nodes[i].value.substring(49,51);
if(year == selectYear && month == selectMonth){
nodes[i].selected = true;
}
}
}
とすれば良いでしょう。
1.2 カテゴリーリストの変更
テンプレートの「カテゴリー・アーカイブテンプレート」を選択し、サイドメニューのカテゴリーリスト("Categories"というタイトルのタグ)の設定されている直下に青色のタグおよびスクリプトを挿入します。リストは公開テンプレートを例にしています。緑色部分の意味は月別アーカイブと同様です。
<script type="text/javascript">
<!--
function selectUrl(sel){
if(sel.options[sel.selectedIndex].value){
location.href = sel.options[sel.selectedIndex].value;
}
}
//-->
</script>
<div class="sidetitle">
Categories
</div>
<div class="side" id="categorylist">
<form>
<select name="select" onChange="selectUrl(this.form.select)">
<MTCategories>
<option value="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$> [<$MTCategoryCount$>]</option>
</MTCategories>
</select>
</form>
</div>
<script type="text/javascript">
<!--
var data ="<$MTArchiveTitle$>";
var nodes = document.getElementById('categorylist').getElementsByTagName("option");
for (j = 0; j < nodes.length; j++) {
if(nodes[j].innerHTML.indexOf(data) == 0){
nodes[j].selected = true;
}
}
//-->
</script>
赤色で示す id属性名が他で使用中の場合は、異なる属性名に適宜変更してください。
カテゴリー・アーカイブをモジュール化(カテゴリー・アーカイブテンプレートより php または MTInclude タグを用いてインクルード)している場合は、スクリプトをインクルードしている行の直下に設定します。緑色のJavaScriptはどちらに記述しても大丈夫です。
なお、サイドメニューの折りたたみを利用されている方はそちらの id属性名を用いますので、先の
<div class="side" id="categorylist">
の設定は不要です。ただし現在設定されている id属性名と一致するように、リスト内の赤字部分を適宜修正してください。サイドメニュー折りたたみ用スクリプトが設定されている場合は、上記スクリプトの後方に配置してください。
今回サブカテゴリー表示を意識したカスタマイズには対応していませんので予めご了承ください。
1.3 メインページの変更
メインページには月別アーカイブリストやカテゴリーリストに追加したものからJavaScript(青字部分)を除いたものを設定します。また空要素をメニュー先頭に表示する場合は茶色で示したタグを追加してください。青字部分が含まれていると再構築時にエラーになりますのでご注意ください。
月別アーカイブリスト
<script type="text/javascript">
<!--
function selectUrl(sel){
if(sel.options[sel.selectedIndex].value){
location.href = sel.options[sel.selectedIndex].value;
}
}
//-->
</script>
<div class="sidetitle">
Monthly Archives
</div>
<div class="side" id="monthlylist">
<form>
<select name="select" onChange="selectUrl(this.form.select)">
<option value="">選択してください</option>
<MTArchiveList archive_type="Monthly">
<option value="<$MTArchiveLink$>"><$MTArchiveTitle$> [<$MTArchiveCount$>]</option>
</MTArchiveList>
</select>
</form>
</div>
カテゴリーリスト
<script type="text/javascript">
<!--
function selectUrl(sel){
if(sel.options[sel.selectedIndex].value){
location.href = sel.options[sel.selectedIndex].value;
}
}
//-->
</script>
<div class="sidetitle">
Categories
</div>
<div class="side" id="categorylist">
<form>
<select name="select" onChange="selectUrl(this.form.select)">
<option value="">選択してください</option>
<MTCategories>
<option value="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$> [<$MTCategoryCount$>]</option>
</MTCategories>
</select>
</form>
</div>
2.JavaScriptを外部ファイルにする場合のカスタマイズ
2.1 外部ファイルの設定
下記のスクリプトを「selectbox.js」というファイル名で保存し、ローカル・サイト・パスに配置(またはアップロード)してください。ファイルはブログで用いている文字コード(UTF-8等)で保存してください。
外部ファイルは日別アーカイブ/カテゴリー・アーカイブ共通に使用します。
selectbox.js
function selectUrl(sel){
if(sel.options[sel.selectedIndex].value){
location.href = sel.options[sel.selectedIndex].value;
}
}
function addSelectForMonthly(data){
var year = data.substring(0,4);
var month = data.substring(12,14);
var nodes = document.getElementById('monthlylist').getElementsByTagName("option");
for (var i = 0; i < nodes.length; i++) {
var selectYear = nodes[i].innerHTML.substring(0,4);
var selectMonth = nodes[i].innerHTML.substring(5,7);
if(year == selectYear && month == selectMonth){
nodes[i].selected = true;
}
}
}
function addSelectForCategory(data){
var nodes = document.getElementById('categorylist').getElementsByTagName("option");
for (var i = 0; i < nodes.length; i++) {
if(nodes[i].innerHTML.indexOf(data) == 0){
nodes[i].selected = true;
}
}
}
2.2 テンプレートの設定(1)
日別アーカイブテンプレート/カテゴリー・アーカイブテンプレートの<head>~</head>部分に下記のタグを設定します。
<script type="text/javascript" src="<$MTBlogURL$>selectbox.js"></script>
この設定で実行し、JavaScriptファイルが正常に取得できなかった場合は <$MTBlogURL$> の部分を適宜変更してみてください。
2.3 テンプレートの設定(2)
日別アーカイブテンプレートの月別アーカイブリストおよび、カテゴリー・アーカイブテンプレートのカテゴリーリストに下記の青色部分を追加します。
日付アーカイブテンプレート
<div class="sidetitle">
Monthly Archives
</div>
<div class="side" id="monthlylist">
<form>
<select name="select" onChange="selectUrl(this.form.select)">
<MTArchiveList archive_type="Monthly">
<option value="<$MTArchiveLink$>"><$MTArchiveTitle$> [<$MTArchiveCount$>]</option>
</MTArchiveList>
</select>
</form>
</div>
<script type="text/javascript">
<!--
addSelectForMonthly("<$MTArchiveTitle$>");
//-->
</script>
カテゴリー・アーカイブテンプレート
<div class="sidetitle">
Categories
</div>
<div class="side" id="categorylist">
<form>
<select name="select" onChange="selectUrl(this.form.select)">
<MTCategories>
<option value="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$> [<$MTCategoryCount$>]</option>
</MTCategories>
</select>
</form>
</div>
<script type="text/javascript">
<!--
addSelectForCategory("<$MTArchiveTitle$>");
//-->
</script>
緑色部分はデフォルトからセレクトボックスへの変更箇所を示しています。既にセレクトボックスが設定済みであれば修正は不要ですので必要に応じて修正してください。また上記の id属性名を他で使用中の場合は青色部分、および select.js の赤色部分を異なる属性名に変更してください。
2.4 メインページの変更
メインページには月別アーカイブリストやカテゴリーリストに追加したものからJavaScript(青字部分)を除いたものを設定します。また空要素をメニュー先頭に表示する場合は茶色で示したタグを追加してください。青字部分が含まれていると再構築時にエラーになりますのでご注意ください。
月別アーカイブリスト
<div class="sidetitle">
Monthly Archives
</div>
<div class="side" id="monthlylist">
<form>
<select name="select" onChange="selectUrl(this.form.select)">
<option value="">選択してください</option>
<MTArchiveList archive_type="Monthly">
<option value="<$MTArchiveLink$>"><$MTArchiveTitle$> [<$MTArchiveCount$>]</option>
</MTArchiveList>
</select>
</form>
</div>
カテゴリーリスト
<div class="sidetitle">
Categories
</div>
<div class="side" id="categorylist">
<form>
<select name="select" onChange="selectUrl(this.form.select)">
<option value="">選択してください</option>
<MTCategories>
<option value="<$MTCategoryArchiveLink$>"><$MTCategoryLabel$> [<$MTCategoryCount$>]</option>
</MTCategories>
</select>
</form>
</div>
3.スタイルシートの設定
スタイルシートの .side が定義されている下に追加します。
.side select {
font-family: Verdana, Arial, sans-serif;
color:#666666;
background: ffffff;
font-size:9px;
}
内容はデザインに応じて適宜変更してください。なお background を設定しない場合、Netscape7.1 ではセレクトボックスの背景色が暗くなりましたのでご注意ください。
以上です。今回のカスタマイズについては現在のところ
- OS:Windows2000 SP4
- ブラウザ:IE6.0/Netscape7.1/Sleipnir1.66/Firefox1.0/Opera7.23
で動作の正常性を確認しております。なお、前回のサンプルでは selected 属性の設定を
nodes[i].setAttribute("selected","selected");
としておりましたが、Mozilla系のブラウザで正常に動作しないことが判明したため、
nodes[i].selected = true;
に変更致しました。
この場をお借りしてお詫びと訂正に代えさせていただきます。
2005.03.04 追記
メインページの設定について追加しました。
2006.04.04 追記
リストから language 属性を削除しました(HTML4.01/XHTMLで非推奨あるいは廃止されているため)。
Movable Type 3.15リリース
またしても出遅れた感がありますが、Movable Type 3.15がリリースされました。
Movable Type 3.15の提供を開始
Movable Type 3.15日本語版の提供を開始いたしました。Movable Type 3.15日本語版は、1月25日に発見されたセキュリティ脆弱性や、大量のスパムを受信したときのサーバー負荷を軽減するための変更などを実施しました。詳しい変更点・修正点は、更新履歴 をご参照ください。
先月のエントリーでは23:59頃リリースと予測していましたがやや前倒しの23:50でした。
2005.02.01 追記
テンプレート正常性(というかアップグレード)を報告くださっているサイトは現在のところ下記の通りです(もれてたらご連絡ください)。ありがとうございました。
- Magic White:Movable Type 3.15になりました
- existence Uhheri Edition:Movable Type 3.15 ぼくたび BLOG:Movable Type 3.15の提供を開始
- 時は流れても・・・:Movable Type 3.15が提供開始
- kazunoblog:MT3.15アップグレード ぼけぼけどっとこむ:Movable Type 3.15になりました
- 洒落のひとり言:Movable Type 3.15の提供を開始
- a n i
- KH Weblog:Movable Type 3.15へアップデート