bbs.cgi開発【WebProg板】
http://qb.2ch.net/test/read.cgi/jikken/1017071166/l50 2ちゃんねるの、bbs.cgiが、現在住民の手により作られているようです。 WebProg板でも、改良に役立つように、協力しませんか? 【bbs.cgiのメインフロー】 1、システム関連設定(タイムゾーン&日付・時刻&連想配列) 2、POST入力情報を取得($FORM{}に格納) 3、入力要素の体裁(コントロールコードや<>を除く) 4、各種ファイルPATH生成(詳細は下記参照) 5、設定ファイルから規制などを設定(詳細は下記) 6、ホスト情報($HOST・$PROXY・$IP) 7、クッキー発行 8、書きこみ状態のチェック&補完(monazilla&携帯) 9、書き込み情報のチェック&補完(トリップ&キャップ&節穴&名無し) 10、エラーレスポンス(ポスト情報の判定) 11、要素ごとのサイズや入力の判定(長さや入力無し) 12、ポートチェック 13、新規スレッドと普通書き込みの分岐 14、レス書き込みまたはスレッド立て規制 15、書き込み情報設定(レスポンスアンカー・ID) 16、DATファイルへ書き込み(.dat) 17、関連ファイルの更新(.html・subject・subback・iモード) 18、index.htmlの更新(圧縮) 【変数の指定】 use vars qw(%FORM);入力情報 use vars qw(%SETTING);設定情報 use vars qw($NOWTIME);現在の時間 use vars qw($DATE);表示日付 use vars qw($IP);ホスト情報(生?) use vars qw($PROXY);ホスト情報(プロクシ) use vars qw($HOST);ホスト情報($IP<$PROXY>) use vars qw($PATH);$PATH = "../" . $FORM{'bbs'} . "/";(板アドレス) use vars qw($DATPATH);$DATPATH = $PATH . "dat/";(データディレクトリ) use vars qw($TEMPPATH);$TEMPPATH = $PATH . "html/";(テンポディレクトリ) use vars qw($INDEXFILE);$INDEXFILE = $PATH . "index.html"; use vars qw($INDEXGZFILE);$INDEXGZFILE = $PATH . "index.html.gz"; use vars qw($SUBFILE);$SUBFILE = $PATH . "subback.html"; use vars qw($SUBGZFILE);$SUBGZFILE = $PATH . "subback.html.gz"; use vars qw($IMODEFILE);$IMODEFILE = $PATH . "i/index.html"; use vars qw($DATAFILE);データファイル なお、これらについては、変数自体を使わないという選択もありです。 #!/usr/local/bin/perl use strict 'vars'; # とりあえずな感じ。 # last modified 2002年 3月 17日 by トオル use vars qw($version); $version ="2002年"; #==================================================== # システム関連設定(タイムゾーン) #==================================================== use vars qw(%FORM); use vars qw(%SETTING); use vars qw($NOWTIME); $NOWTIME = time; # タイムゾーンをセットする { $ENV{'TZ'} = "JST-9"; } # シグナル対処関数 sub SigExit { exit(0); } { $SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "SigExit"; } use vars qw($IP); use vars qw($HOST); use vars qw($PROXY); $IP = $ENV{'REMOTE_ADDR'}; $IP = gethostbyaddr(pack('c4',split(/\./, $IP)), 2) || $IP; if ($ENV{'HTTP_VIA'} =~ s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/) { $PROXY = $ENV{'HTTP_VIA'}; } if ($ENV{'HTTP_X_FORWARDED_FOR'} =~ s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/) { $PROXY = $ENV{'HTTP_X_FORWARDED_FOR'}; } if ($ENV{'HTTP_FORWARDED'} =~ s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/) { $PROXY = $ENV{'HTTP_FORWARDED'}; } $PROXY = gethostbyaddr(pack('c4', split(/\./, $PROXY)), 2); $HOST = $IP; $HOST .= "<$PROXY>" if ($PROXY); 一回聞いてみたかったんだけど、こういうスクリプトで CGI.pmをわざわざ使わないようにする理由ってなに? どうせならCGI.pmとか色々モジュール使いーの、perl5.6.1使いーの したほうがよろしいような気がするのですが。 利用者の多いところでCGI.pmは得策ではないだろう。(mod_perlなら話は別だが) ただ大量のvarsはいただけないな。 Perl5.6なら"our $var = initvalue"で済むものが見苦しすぎる。 2chのbbs.cgiってPerlで書かれてるの? C言語で作られてるって聞いたんだけど・・・・ CGI::Simple なんてどうだろう。作者によると同機能でCGI.pmの2倍は速い との事だけど。 そうそう、それよりもう少しあたらしいのがこっち http://search.cpan.org/search?dist=Cgi-Simple (↑ただしドキュメンテーションがない模様・・・) he.netで使ってるPerlのバージョンは全部5.004_01な模様なので そこらへんも考慮しなきゃ、、 CGI::Simple見てみた。 が、バグが多すぎてまだ実用レベルではないね。 例えば、パラメタのキーに".globals"などのメタデータのキーが入ってるとクラッシュする。 (場合によってはクラッシュせずに予想外の動作をするものもある) これじゃCGI.pm v3.xの方がまだマシだね。 速いにこしたことはないけどCGI.pmを使いたくないほど過酷な環境 ならPerlCGIをやめたほうがいいと思うのだが。 CGI.pmを使っても全く影響が感じられないような素晴らしい環境なんてそうは無いだろ。 http://www8.ocn.ne.jp/ ~hoehoe/bbscgi.txt bbs.cgiのソースです。 (´-`).oO(なんか、実験板方面が閉鎖的なんだよなぁ……。) 実験場とは別に、この板で作ってみるとか。 2ちゃんねるで使われるかどうかは別にして。 >>24 賛成。 とりあえずおおざっぱな方針かな? 個人的には、もはや軽量化はどうでもよくて、 「使いやすい」2ch互換スクリプトにしたいところ。 もちろん、無駄は省かれるべきだけど。 >>26 じゃあ、このbbs.cgiを参考にしつつ、 17氏スクリプトを作りつつ、使いやすい2ch掲示板クローンを作るって方向でどうですか? 17氏が引退して、「2chスクリプトくれくれ君」が増えてうざいし。。 というか、どう考えても17氏スクリプトと2ch互換は、転送量とか考えたら設計が古くてだめでしょ。 アハンと12chくらいじゃないかな? 完全なクローンなんて作っても仕方ない。 プロトコル互換の「もっとずっと使いやすい」BBSを設計してみてはどうだろう。 . . . . . . でも専用ブラウザで見るなら同じことなんだよな。 >>30-31 bbs.cgi開発【WebProg板】 1 :nobodyさん :02/04/19 08:10 ID:20PTEIcN http://qb.2ch.net/test/read.cgi/jikken/1017071166/l50 2ちゃんねるの、bbs.cgiが、現在住民の手により作られているようです。 WebProg板でも、改良に役立つように、協力しませんか? ちょっと話は違うけど、PHPとDBを利用して作ったほうが 負荷も少なく、早くて、しかもログが壊れにくいと思うんだけど、 どうなんでしょうか。 漏れはperlがなんとなく好きなんだが、 速さとかを突き詰めていけばphpとかそういう方向に行くんだろうな >>35 phpって速いの?Perlより遅い気がするんだけど。 もしかして4.2xは速いの? >>36 mod_perlを使えばperl早いけど、 夜勤さんが使わないっていってるからなぁ。 ここでいいのかな トリップをメール欄に書くとおかしくなるの既出? 例えば、 名前[#hogehoge]メール欄[sage] →名前[ ◆/Re6aTC.]メール欄[sage] 名前[#hogehoge]メール欄[sage #hogehoge] →名前[ ◆jG/Re6aTC.]メール欄[sage] >>51 昨日からトリップ10桁になったんだよ メール欄とは無関係、メール欄の#以降が削除されるのは以前からの仕様 843 名前:夜勤 ★ 投稿日:02/11/14 15:22 ID:??? ??? ex , ex2 うまくいっているのかなぁ。 結局は、極端にいえば「もう一行も bbs.cgi にはコード追加できません」 ってことのような感じ、もちろんコードの内容にもよりますけど。 人が増えすぎて、コードを削らなきゃならない段階のようです。 解決策は (1) コードを削る。 (2) サーバを増設する。 ということでしょうが、どっちにしろ なんともかんとも さーおまいら出番ですよ。 >>55 夜勤が本気でそんなこと言ってるなら夜勤は真性のアフォ。 廃れてるなぁ。 誰かまじめにbbs.cgi開発する人いないの? >>61 真面目に開発している人はここには来ない罠。 お前らも暇な奴だなぁ(オレモナー っていうのは置いておいて、真面目にやっている人がいるなら ソースコードを提供してもいいよ。ただし再配布は禁止。 どうよ? あー、書き忘れたけれど興味あるならメールください。 フリーメールはNGです。 kigaru2@kigaru2.net (正体ばればれだなぁ。) >>65 hu8up@ww2.personal.ne.jp このメアドでよろしいでしょうか。 反応なしかyo! というか、面倒くなったのであと誰かよろ。 17氏の手に入った。 PATHINFO対応に改造するにはどうすればいいでつか? >>80 PATHINFO対応の他のBBSのソースを参考にしたら? 誰も突っ込みいれてない(´・ω・`) 一応動くんだけどなー。 誰か試してくれないかなー。 >>82 これはbbs.cgiをCで書いたやつとかですか? >>84 ダウンロードとコンパイル出来ました。 RedHat8です。 2ch初心者で申し訳無いんですけど、起動の方法がわかりません。 「ERROR:POSTしてください!」とか出ました。 コンパイルは適当に gcc -O2 -Wall -o bbs.cgi bbs.c とやればいいと思ふ。 >85 コンソールじゃなくて、CGIで起動しているんだよね? 環境変数がセットされてないのかなぁ? ごめん、よくわからないや^^; =""とかけばよいものを、="\0"と書くのがわからない。つーか静的なんだから自動的に0に初期化されるね。 staticのついていない関数の宣言はヘッダーファイルでした方がいいよ。 getenvがNULLを返さないかどうか監視しないと、strcmp等で悲惨な結果を生むことがあるだろう。例え(環境変数が)定義されていないはずがないと思っても。 もしもデコード対象の文字列が%で終わっていたらhex_packでまずいことになるかもね。hex_packでもきちんと文字列をチェックするか、decodeで2バイトstrncpyしてstrtolするといいよ。 mallocの戻り値をチェックしているところもあればしていないところも・・・ ところで、なんで*.hファイル(ヘッダーファイルだよね?)で関数の定義をしているの?(^_^;) >>85 書き込み用のフォームを用意していないからでしょ。直接bbs.cgiにアクセスすればそりゃあそのエラーが出るよ。 あとはPOSTじゃなくて小文字でpostだったりすると(そこは非標準関数のstrcasecmpを使えばうまくゆくね)。 >>87 コンソールから起動すれば多分Segmentation Faultが出るよ(理由は上述)。 >>87 SETTING.TXTが2chとは違うようだけど。 >88 突っ込み多謝ですm(_ _)m >ところで、なんで*.hファイル(ヘッダーファイルだよね?)で関数の定義をしているの?(^_^;) 他のコードを書くのに便利そうな関数は別ファイルにしようかなぁと。 それなら*.cにしる!ってことなんですけれども^^; >89 実験室仕様です。 2chに合わせるにはbbs.hを書き換えればいいと思います。 若干(でもないけど)テンポラリファイルの仕様も違うけど、 多分大丈夫^^; >>91 書き換えるのがめんどいのでSETTING.TXTもアップしてけろ SETTINT.TXTをパースする仕組みがないのでは。 更新したー。 88さんの指摘と、ID生成部分の修正、DATファイルの書き込み判定を追加。 >92 http://www90.sakura.ne.jp/ ~hoehoe/temp/kigaru/SETTING.TXT bbs.hの書き換えは俺も面倒い^^; >93 文字列を分割する処理だよね?<パース これのことではない? value = split( key, '=' ); split( value, '\n' ); 男爵Cも書けるのか… まぁそれはいいとしておいらはCはほとんど書けないから出番なしかなー。 ━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━― ∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉 今だ!100ゲットォォォォ!!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∧∧ ) (´⌒(´ ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡  ̄ ̄ (´⌒(´⌒;; >>61 ワラタ ところで話変わるけど、携帯ゲーム機"プレイステーションポータブル(PSP) このPSPは、新規格UMD(ユニバーサルメディアディスク)というディスクを利用しており、そのサイズは直径6cmととても小さい(CDの半分程度)。 容量は1.8GBとなっている。 画面は4.5インチのTFT液晶で、480px x 272px(16:9)。MPEG4の再生やポリゴンも表示可能。外部端子として、USB2.0とメモリースティックコネクタが用意されているという。 この際、スク・エニもGBAからPSPに乗り換えたらどうでしょう。スク・エニの場合、PSPの方が実力を出しやすいような気がするんですが。 任天堂が携帯ゲーム機で圧倒的なシェアをもってるなら、スク・エニがそれを崩してみるのもおもしろいですし。かつて、PS人気の引き金となったFF7のように。 突然こんな事いいだしてすまそ・・ GBAと比べてみてどうなんでしょうか?(シェアのことは抜きで) __∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄ ∧_∧ ∧_∧ ピュ.ー ( ・3・) ( ^^ ) <これからも僕たちを応援して下さいね(^^)。 =〔~∪ ̄ ̄ ̄∪ ̄ ̄〕 = ◎――――――◎ 山崎渉&ぼるじょあ (⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン 10月過ぎて暇だったら続きを頑張ってみようと思う。 Makefileも作らないと。 初めてPerl、CGIの勉強をしようと思うのですが、 皆様がこの本は良いと思ったのを、教えては 頂けないでしょうか。お願いします。 PHP使って、bzip2圧縮で転送量削減とかできないの? >>109 ガンバレ。 ところで、bzip2ってブラウザ対応してたっけ…? しんどいわぁ。 http://www.h4.dion.ne.jp/ ~sizzy99m/toybox/ch031107.tar.gz 一つ提案 ・広告対策/スクリプト荒らし対策もbbs.cgiに組み込んで欲しい ブラックリストを作って該当する物は排除といった感じで こんなもんで… http://www.h4.dion.ne.jp/ ~sizzy99m/toybox/ch031116.tar.gz おみとろんのばか・・・・ ttp://www111.sakura.ne.jp/~as/box/bbs.zip がんがって書き直してみた。 といっても、最小限の機能な上、限りなく怪しいソースだけど・・・。 限りなく怪しいソース第二弾。 ttp://www111.sakura.ne.jp/~as/src/bbs.zip ・トリップ、fusianasan、名無しさん に対応 ・デコード処理のバグ修正 ・Makefileのバグ修正 あいかわらずきれいなソースだね。 ただ、ヘッダに変数を置くのは止めたほうがいいと思われ。 >>124 言い方がキツイかもしれんがもう少しちゃんと組まないと利用者がとんでも ない被害をこうむるぞ。このままではたぶんコア吐きまくりになる。 バッファ・オーバーに対する緊張感が感じられない。 差し出がましいようだが製作中をチラっと紹介。 http://org.s38.xrea.com/bbs-mod.zip Apacheモジュール化を前提にしてるから回りくどい動作をしてるが 実用性を重視して設計してる。 現状はただのCGIでファイルでデータ保持してるがこれをApacheのメモリ 空間に置き換える。 そこそこの形にまとまれば軽くPerl版の100倍とかの速度になるんじゃないかな? >>124 くだらない煽りだと思われるかもしれないけど、もう少しCを勉強した方がいいよ。 >>129 つっこみナイス >>126 をApacheAPIに置き換える前に一応素のCGIとしても仕上げておこうと 思うが何か問題点があったら遠慮無しに叩いてもらえないだろうか。 >>126 結構うまく設計されてると思うけど。。 脆弱性があるなら、その部分を指摘してもらえるとありがたいと思うよ。 (ついでに私のもよろー。) ソース見たよ。 1Mのmallocって今時は普通? >>130 エンティティヘッダの区切りは \n じゃなくて \r\n にしろよ。 つかまだ完成度数%くらい?のものを叩けと言われてもなぁ… 細かい部分で自分で調べてもらうとして、 ・確保したメモリが確実に初期化されているという保証はあるのか? ・散在したリソースが整理して管理できてるか? ・冗長性の無い関数(strlenとかstrcat等)にそのままデータを入れていないか? っていう部分のポリシーが私の考え方と相違している。 危険性を多分に含んでいることは間違いない。 というより皆バラバラで作ってないで統合して分担できればいいんだが。 PM出現きのん >>132 改行コードは処理系が吸収してくれるはずなんだが。 ちなみに私の環境はWin2k3+Cygwin+GCC3.3とLinux2.4+GCC3.3 >>133 メモリの初期化はmemsetではだめなの? バッファオーバーフローを考えるなら、sprintfも危険ですよ。 strlenがだめなのは、ポインタにNULLが入っているかもしれないから? でもそれを言ったら、文字列操作系が全部だめって事になりそう。 >>135 データ型も保証されていた方がいいよね? stringまわりは手前できちんと例外処理しておけば済む事じゃない? サイニタイジングまわりをどうするかで思案中、、 regexでゴリっと正規表現使うかリクエスト・ボディの全バイトで ポインタ回してチェックするかどっちがいいだろう。 >>136 の後半は撤回。 トークン後にサニタイジングね。 >>136 C++ですか? だとしたら、ちょっと期待してます。 # C++のApacheモジュールについて、よく知らないので。 >>138 素のApacheAPIのつもりだが、、 C++でApacheモジュール使う利点ってあるの? サニタイジング云々はとりあえずCGIとして機能する為に必要なだけで、、 ApacheモジュールにするならApacheAPIバリバリでお手軽に行くつもりだが。 CGIならSTLは重宝するが。 >>139 string、例外処理というところでC++だと思ったのですが、違いましたか。 C++の標準stringあるだけでも、結構便利だと思いますけど。 それと、ap_escape_htmlは文字参照に対応していないので、 注意した方がいいですよ。 >>140 C++は楽な反面でコードがキモいしなぁ、、 必要に応じて自前で作るべき処理もあるかもしれないね。 それより基本構造に着目しないと作り直す意味があまりないような。 目的は軽量でメンテしやすい物に置き換える事だよね? read.cgiで消費メモリを抑えたいんだが、 datを全部バッファせずに逐次でHTML出力しようとてる。 この時上部の100レス単位のリンクを入れるにはどうすればいいだろう。 やはり一度datを全部読んでその行数で調べるしかないのだろうか。 問題点はデータを全て読む前に何レスか分からないとリンクが作れない事。 なんかいい方法ないだろうか。 >>145 subject.txtを見に行くって事? それもいいかもしれないなぁ。 負荷とのトレードオフかもしれないけど。 パフォーマンスがテーマになるといろいろ難しいね >125-127 突っ込み多謝。 1から出直してきます。 datファイルの各行の頭のファイル位置を 別のインデクスファイルに記録しておき、 必要に応じてそれを参照して、アクセスするって事でせう。 欠点はインデクスファイルが増える所と、 レス削除した時にそのファイルも操作が必要という所。 >>150 なるほど。貴重な意見ありがとうね。 >>150 のアイディアとフルバッファとの違いを比較して最終仕様を決めたいと思う。 今のところread.cgiの読み出し〜表示に関しては動いてるので今日はbbs.cgiの再現 に着手します。 とにかくバカっ早いです。 >>150 みたいに本7にマジレスしてるやつって一体・・・? >>153 みたいに煽ることしかしないやつって一体・・・? お前もポンシチのサイト行ってあっちで仲良くやれや マジ質問だが。 本7とそうじゃないのってどうやって見分けてるわけ? >>157 お前はプログラムの中で名乗っているだろうが。 動いた気がする ttp://www111.sakura.ne.jp/~as/src/test-1.zip 記念かきこ。 sevletで書いて、配置名をbbs.cgiにしてみるとか?(^_^; 0xFFを-127で表現したくないからというのはダメ? 日本語コードを処理するのにごにょごにょなのでついでに統一してみると。 ちょっと修正 ttp://www111.sakura.ne.jp/~as/src/test-2.zip >>160 HTMLテンポラリをXMLで保持/操作すると楽そう。 >>161-162 やっぱり負値の文字コードは使いたくないよね。 忘れて0x80以上の整定数と比較しちゃったり。 (文字なんだから本来は数値拡張文字('\x80')で比較しないといけないんだけど。。) # is何とか系の関数に負値の文字コードを渡すとおかしくなるライブラリがあったとか。 0x80 以上の数値拡張文字は警告が出るのでいやん。 いつになったら完成するのやら。 ttp://www111.sakura.ne.jp/~as/src/test-4.zip おまえらwebprog住民はUNIX板に負けてて悔しくないのかあげ >>169 ていうか、両方見てる奴も多いんじゃね? >>169 この板はとてもレベルが高いとは思えない っていうかUNIX板も年々ひどいことになってるけど bbs.cgiの開発に携わりたいのだが、もう今からだと身内でしかやってないのかな 最初から身内でしかやってない。 たまにソースが漏れたり、断片的に提示されてるが。 Unix板大活躍のころは誰でも入れたとかじゃなかったっけ? あ、そのときいた人たちが身内か。 それはread.cgiの方だね。 有志で開発されていたから、一時期ソースが公開されていた。 ネタを引っ提げて、ょぅι゙ょに来ると良いかも♪ bbs.cgi再開発プロジェクト6 ttp://qb5.2ch.net/test/read.cgi/operate/1176295715/l50 あと、こんな事が進んでいたり♪ 幸せサーバープロジェクト 「アイデア・技術のある人募集中」★3 ttp://qb5.2ch.net/test/read.cgi/operate/1241361889/l50 >>178 そこのスレに参加しても話すら聞いてくれな referer1が http:/ホスト名/ だとOKなのに http:/ホスト名/test/bbs.cgi だと ERROR:ブラウザ変ですよん。になるのはどうしてですか <a href="http://sumerki3.net/ ">ム褞?? 3</a> ∧_∧ ( ・∀・) | | ガガッ と ) | | Y /ノ .人 / ) .人 < >_∧∩ _/し' < >_∧∩`Д´)/ (_フ彡 V`Д´)/ / ←>>103 / ←>>78 IPアドレス共有サービスが出てきたからID作成にソースポートを入れないとだな Webサーバでもソースポートのログ取ってる? 誰でも簡単にネットで稼げる方法など 参考までに、 ⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。 グーグル検索⇒『半藤のブブイウイウレレ』 FJ8W76CFIB read.cgi ver 07.4.7 2024/03/31 Walang Kapalit ★ | Donguri System Team 5ちゃんねる