PHPの最近のブログ記事

前回に引き続きphpBB(phpBB2)ネタ。

当然ながら日本語でphpBBを運用する場合は、普通、MySQLのマルチバイト文字セットはEUCかUTF8になっている。

しかし、デフォルトのまだと、システムから送られてくるメールの、DBのマルチバイトを参照した部分の文字列が化ける。

以下対策

・language/language_japanese/email の中のファイル全てを、MySQLの文字コードに合わせてエンコードを修正する。
(SJISなどでアップされていたらEUCかUTF8で保存して上書き)

・各ファイルの「Charset: iso-2022-jp」と書かれているところを、全て
「Charset: EUC-JP」 か、
「Charset: UTF8」
に書き換える。

以上
久々の投稿。しかもネタが今更感のあるこれ。
でも今までphpBBを使ったことが無かったので、まあまあ勉強になった。

伝統的なスパム対策は下記らしい。
http://support.hiikun.net/bbs/topic-299.html

ちなみにmodの使い方などはこちら。
http://all.netgamers.jp/adcat5.html

でも、今時のphpBBスパムシステムは、画像認証やMDハッシュを突破したりしてかなり賢い。
上記の対策をしても相変わらず1日100件くらいは登録スパムがやってくる。

まあ、ユーザ登録されるだけならまだいいが、トピックを荒らされるのだけは困るので、
以下の対策を実施。
http://garnote.com/2010/01/spam.html

これはかなり有効だったようで、スパム投稿がピタリと止まった。
システム開発上、ユーザがブラウザからメールマガジンを作成した時に、同時にエラーメール処理用のアドレスも作成されるようにする、逆にメルマガを削除したらそのアドレスも削除される必要があったためメモ。

今回のMTAはqmailを使うとのことで、アカウントの管理は必然的にvpopmailとなる。

しかし、qmailadminを使わないで新規アカウント作成(vadduser)・削除(vdeluser)を行うためには、基本的にrootでの操作となる。

単純にスクリプト内で

system("/home/vpopmail/bin/vadduser hoge@hoge.jp hogepass");

とやっただけでは、もちろんうまくいくはずがない。

というわけで、Cと連携して上手いことやってくれるモジュール様がないかと、CPANを探してみたらありました。
その名も「vpopmail.pm」。

呼び出す関数名もまさにvpopmailコマンドとほぼ同じ。

しかし、最終リリースは2001年・・・やばいんじゃないの?

かろうじてCPAN.pmをからインストールできたものの、説明も短すぎて、当然
use vpopmail;
vadduser(引数いろいろ);
とかやれば新規にアカウントを作ってくれると思いきや全然ダメ。

vpopmailのバージョンを見てきてくれる関数だけはなぜか動いた(笑)
まあ、関数名も最近のvpopmailのコマンドといまいち合ってないし。

というわけでさんざん悩んだ結果、sudoを使うことで決定。

以下手順。

1.新規バーチャルアカウントを作成する簡単なスクリプト(vadduser.cgi)を作成しCGIの動くディレクトリに置く。

vadduser.cgi
-----------------------------------------------------------------------------------------
#!/usr/bin/perl

use strict;

# コマンド発行
`sudo -u root /home/vpopmail/bin/vadduser hoge@hoge.jp hogepass`;
exit;
1
-----------------------------------------------------------------------------------------

2.sudoの設定ファイルに許可コマンドを追記

# visudo

(以下を追記)
apache ALL=(root) NOPASSWD: /home/vpopmail/bin/vadduser,/home/vpopmail/bin/vdeluser

同時に、以下の行をコメント化

Defaults requiretty
   ↓
#Defaults requiretty

※これをコメント化しないと、最近のLinuxでは、
sudo: apache : sorry, you must have a tty to run sudo ; TTY=unknown ;......
と怒られる。

このエラーは、/var/log/secure を見ればわかる。

保存して終了
:wq


3.vadduser.cgiをブラウザから実行してみる。

4.確認

popアカウント一覧に、「hoge」が追加されているのを確認

同時に、/home/vpopmail/domains/hoge@hoge.jp 内に、ディレクトリ「hoge」が作成されているのでOK!!



ああ疲れた今回も。


実務的には、このvadduser.cgiをAPIとしてドキュメントルート外に置いて、第三者からは直接アクセスされないようにし、他のCGIからシステムコールで呼んだりした方がセキュアかなと。


参考URL:
http://hibari.2ch.net/test/read.cgi/php/1024741312/l50
http://d.hatena.ne.jp/kakurasan/20100512/p1
http://old.ikoinoba.net/index.php?UID=1188143501
http://search.cpan.org/~sscanlon/vpopmail-0.08/
2回目のMT設置が完了。
現在の最新バージョンはMT4.22。

なぜ2回目かというと、前回は2週間前に設置したが、設定ファイルを特に気にしてなかったので、mysqlに格納するときに、文字コードがおかしくなっていた。

これはmysql4になってから、クエリ発行時のデフォルトキャラクタセットが強制的にUTF-8になったことに起因する昔からの不具合らしく、MTだけを使っているのなら格納時に文字化けしても、取り出し時にエンコードされるので表面上は正常に見えるが、phpmyadminでDBを見てみると、見事に文字化けしている。
また、デフォルトでの文字セットと照合順序がlatin1_swedish_ci(スウェーデン?)になっちゃってる。

MTで使うmysqlサーバは、他の自分のスクリプトからも参照されるので、これはさすがに統一しなきゃならんってことで、いろいろ解決方法を検索して調べまくり今に至る。

結果的に/etc/my.confを以下のように変更し、文字化けは解消された。

[client]
default-character-set = utf8

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set = utf8
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
default-character-set = utf8

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

skip-character-set-client-handshake


最後のskip-character-set-client-handshakeオプションが有効になる環境であれば、
他のdefault-character-set = utf8とかは記述しなくても問題ないとは思われるが、念のためのおまじないってことで・・・


phpmyadminから再び確認すると、ちゃんと2バイト文字も文字化けなし。
いーねいーね。

上の設定をしておけばmt-config.cgiの内容もほぼデフォルトでOKみたい。


ただ、今まで書きためたMTの記事(10件ほど)は、すでに文字化けした状態でmysqlに格納されていたため、残念ながらリセット。
また一から記事の書き直しだ・・・