bbs.cgi再開発プロジェクト 3

このエントリーをはてなブックマークに追加
907 ◆cZfSunOs.U
read.cgi はともかく bbs.cgi で mod_cgidso を使うとなると,
普通の実行可能バイナリじゃなくて共有オブジェクトにしなきゃいけないとか,
自前でリソース解放してくれないとどんどんリークしていっちゃうとかで,
perlcc で直接バイナリ作るんじゃなくて,生成された C コードを
手作業で直さなきゃならないんでしょうけど......

まぁ bbs.cgi に関しては,fork() させないようにするなら
mod_perl の方が現実的かなとは思います.

あとは,suExec の代替措置も必要なんでしょうけど,
perchild MPM よりも安定して動くと言われているのがこれ.
    Metux MPM http://nibiru.borg.metux.de:7000/wiki.mpm/

**********************************************************************

個人的に bbs.cgi 関連で気になっているのは,まずは ftp のリンク URL が
おかしくなること (ex. ftp://core.ring.gr.jp/pub/ ).これは ime.nu で
ftp リンクを扱えるようになっていなければ,ime.nu を入れず直リンに
した方がいいのかも知れませんけど.

あとは,NAME/MAIL の Cookie の問題ですね.設定がサーバサイド,
読み出しがクライアントサイドという不整合のため,Mozilla 等では
文字化けしてしまうと.現状では Set-Cookie ヘッダで設定していますが,
これを JavaScript の方で設定すればいいのではないかな,と.
とはいえ,bbs.cgi 出力に Cookie 設定用 JavaScript コードを入れると,
" や \ を \ でエスケープさせる必要がありますが,Shift JIS だと
漢字等の2バイト目が \ になることもあるんで,この判定をきっちりやるのも
結構大変か......むしろ bbs.cgi 出力では行わず,投稿フォーム側の
onsubmit() でこの処理をやらせた方が安全ですかね.
908 ◆cZfSunOs.U :04/11/15 22:43:05 ID:ZCkDk6ko
その場合の各板トップ及び read.cgi 出力の JavaScript コード変更案.
----------------------------------------------------------------------
onload = function(e) {
    var N = getCookie("NAME"), M = getCookie("MAIL"), i;
    with (document)
        for (i = 0; i < forms.length; i++)
            if (forms[i].FROM && forms[i].mail) {
                forms[i].FROM.value = N;
                forms[i].mail.value = M;
                if (forms[i].addEventListener)
                    forms[i].addEventListener("submit", setCookie, false);
                else
                    forms[i].onsubmit = setCookie;
            }
};

if (!Date.prototype.toUTCString)
    Date.prototype.toUTCString = Date.prototype.toGMTString;

function setCookie(e) {
    var exp = new Date();
    exp.setMonth(exp.getMonth() + 1);
    document.cookie = "NAME=" + escape(this.FROM.value) + "; path=/; expires=" + exp.toUTCString();
    document.cookie = "MAIL=" + escape(this.mail.value) + "; path=/; expires=" + exp.toUTCString();
}

function getCookie(key, tmp1, tmp2, xx1, xx2, xx3, len) {
    tmp1 = " " + document.cookie + ";";
    xx1 = xx2 = 0;
    len = tmp1.length;
    while (xx1 < len) {
        xx2 = tmp1.indexOf(";", xx1);
        tmp2 = tmp1.substring(xx1 + 1, xx2);
        xx3 = tmp2.indexOf("=");
        if (tmp2.substring(0, xx3) == key)
            return unescape(tmp2.substring(xx3 + 1, xx2 - xx1 - 1));
        xx1 = xx2 + 1;
    }
    return "";
}