これは、 ANSI C です

CGI で、掲示板をする、プログラムです
CGI での、データのやり取りについては、free11.htm を参照
free11.htm よりは、少しだけセキュリティーを考えています
このプログラムは、掲示板のフォームから送られてくるデータを、その人の名前と、コメントに分割して、デコードと、セキュリティーの為の処理をして、ファイルに格納しています。
同時に、入力された件数をチェックして、古い順から削除します
保存される件数は、プログラム中 21 行めの numbermax という変数です
そうしないと、ファイルサイズは、増える一方だもんね(^_^)
どんな、プログラムかは、僕の掲示板を見てくれ

第一版
(忘却のかなた...) 最初のバージョン
第二版
(2005/11/19) 第二版、Win32版バイナリ添付。著作保持するようにした。XSS 対策
プログラムが古いので、ちょっと書き直し



利用上の注意




一応、著作権は保持します。プログラムの実行・改変においては、各自自分の責任でしてください。

利用対象者
  1. プログラミングの経験が少しある。
  2. C のソースをコンパイルできる。
  3. C を少し知っている。

download
source file & Win32 Binary
keizi.lzh text file (33,342byte) (keizi.lzh.base64)
リターン・コードは、UNIX 系です

使い方

このままでは、使えないでしょう(^_^)
自分のシステムにあわせて、ソースコードを書き換えてください
? 行目は、自分のシステムにあわせて、書き換えてください
ソースをデコードして、
keizi kazu IP-add Bouser
kazu : 入力する文字の数(単位 byte)
IP-add : 入力を要求してきたコンピュータの IP アドレス
Bouser : 入力を要求してきたブラウザー
で、o.k.

MS-DOS の バッチファイルなら、
keizi %CONTENT_LENGTH% %REMOTE_ADDR% %HTTP_USER_AGENT%
で、このファイルを、keizi.bat とすると

<FORM ACTION="keizi.bat" METHOD="POST">
君の名前(Your Name is) : <INPUT TYPE="text" NAME="name" VALUE="No_name_person" SIZE="15" MAXLENGTH="20">
<CENTER>主張(Comment is) :</CENTER>
<CENTER>
<TEXTAREA NAME="cmmnt" ROWS="7" COLS="40"></TEXTAREA>
</CENTER>
<CENTER><INPUT TYPE="submit" VALUE="掲示板へ転送"><INPUT TYPE="reset" VALUE="中止"></CENTER>
</FORM>

でいいでしょう
ちなみに、このプログラムは、変数の数は、2つですから
それ以上の書き込み欄を作りたければ、ソースコードを拡張すればよいわけです
タグの意味とかは、省略するぞ(^_^)

ソースコードの説明

4 - 15 行目は、 include 文やプリプロセッサの宣言です
18 - 40 行目までが、変数の宣言です
42 - 45 行目は、引数の数が、正しいかチェック
47 - 51 行目は、第一引数が、 ( 環境変数 CONTENT_LENGTH {標準入力からやってくるバイト数}) が、数字かどうかチェック
52 - 56 行目は、標準入力からやってくる文字数が、ある数 ( 変数 kazu : 25 行目に宣言) より多いと困るので、そのチェック
58 - 72 行目は、メモリを取得します (ポインタ str,str2,str3)
74 - 93 行目は、ロック処理です ( 同時にアクセスされないための処理 )
94 - 130 行目は、入力を保存しているファイルから、作業ファイルへと move しています ( 作業ファイルは同時にロックファイルの役目も担う )
この移動が、 1 行単位 ( リターンコードからリターンコード ) で行っているため、無難に処理させるため、標準入力されるバイト数の制限を設けた ( それで、106 - 121 行目は、必要ないが念のための安全策 )
130 行目は、今までの入力を保存しているファイルを削除することにより、これから入力されるデータを、ファイルの先頭にもってこれる
140 - 146 行目は、標準入力から、ポインタ str に、データが格納される
154 - 198 行目は、name= を探して、&cmmnt= までを、ポインタ str2 に格納する
200 - 204 行目は、残りを、ポインタ str3 に格納する
これにて、データの分割は終了する
212 - 237 行目は、ポインタ str2 を、ポインタ str にコピーしながら、デコードしている
242 - 267 行目は、ポインタ str を、ポインタ str2 へコピーしながら、コメント文を削除している ( ちょっとしたセキュリティー )
269 - 272 行目は、ポインタ str2 が、空のときの処理
274 - 287 行目は、ポインタ str2 を、加工しながら、ファイルに出力
同様のことを、ポインタ str3 に対しても実行 ( 290 - 381 )
375 行目で、時刻を取得、 376 行目で、それをファイルに出力
383 - 420 行目は、待避したデータを、書き込むが、件数が、オーバーしていたら、古いものから、削除 ( というより、戻さないと言うほうが正しい )
421 行目で、作業ファイルを削除
423 - 433 行目が、結果 ( 成功したか、エラーがでたとか ) を標準出力に出力
435 - 行目以降は、 main 関数から、呼ぶ関数で、free11.htm とあまり変わらない
435 - 477 行は、エラーが出たら、呼ばれる関数
479 - 491 行は、ヘッダ ( の一部 ) を出力する関数
493 - 591 行目は、デコードする関数

mail to active@window.goukaku.com