CGI: Common Gateway Interface part 11
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/06/14 22:26ID:F9qlqHNx※CGIは特定の言語に依存するものではありません。
Perlのコーディングに関する質問は、専用スレでお願いします:
[Perl 初心者コーナー Part24]
http://pc2.2ch.net/test/read.cgi/php/1054992610/
CGIとPerlの区別がわからない、という人はとりあえずこちらへ:
[WebProg 初心者の質問 Part3]
http://pc2.2ch.net/test/read.cgi/php/1045091733/
過去ログ・関連スレッドは >>2-5 あたりに
0583nobodyさん
04/01/23 11:09ID:???<!--b_start-->bbbbb<!--b_finish-->
<!--a_start-->aaaaa<!--a_finish-->
<!--b_start-->bbbbb<!--b_finish-->
ってかかれてるHTMLがあって
CGIで、flagが1だったら<!--b_start-->〜<!--b_finish-->までを隠して
<!--a_start-->〜<!--a_finish-->を表示。flagが0の場合はbを表示してaを非表示をしたいです。
パターンマッチで置換するのはなんとなくわかるのですけど、
具体的にどうすればいいのかがサパーリです。
すみませんがご教授願います。
0584583
04/01/23 11:51ID:???$html =~ s/<!--b_start-->.*?<!--b_finish-->//sg if ( $flag );
すいませんいけました。
0586nobodyさん
04/01/24 00:26ID:sB1NzHfUから誘導されてきましたー。
現在ログをHTMLファイルとして吐き出す掲示板を作っています。
動作自体は問題ないのですが、HTMLをファイルとして吐き出して上書きする
性質上、 パーミッションが606にならざるを得ません。 suExecはナシってことで。
こうしたHTMLファイルをサーバー上に置いた場合、外部から書き換えられる
危険性があるでしょうか。
まあ、普通の掲示板のログファイルが勝手に書き換えられるというのも聞かない
ので大丈夫だと思うのですが。
スクリプトでも埋め込まれると目も当てられないので。
過去ログ全部たどったら、「ダメだ」と「いや大丈夫だ」となってて、どっちでしょう?
0588586
04/01/24 00:40ID:sB1NzHfUCGI上からのchmodのできないサーバーです。
情報小出しで申し訳ない。
0589nobodyさん
04/01/24 00:49ID:???外部から書き換えられる危険性はほとんど無いが、
内部から書き換えられる危険性は結構高い。
例えば、君がそのCGIをどっかのプロバイダの共用サーバ上で動かしているとして、
その共用サーバは suExec 使っていない、つまり全ユーザのCGIが同じ実効uidで動いているわけだが、
そのプロバイダに俺も入会して、同じ共用サーバにアカウントもらったとする。
そしたら俺は、速攻で「そのサーバ上の全ディレクトリを回って606のファイルを見つけるCGI」を組んで
次に「606ファイルを好きに書き換えるCGI」を組んで
俺が将来何か素晴らしいことを思いついた時に踏み台にできるよう準備しておく。
何の役に立つかはよくわからないが、何をやったとしてもまず足が付かないので、理想的な環境だ。
もちろん、俺のようなやつは世の中にそうそういないので、
そんなやつと同じサーバで出会う確率は無視できるほど小さい、と言うこともできる。
0590586
04/01/24 01:10ID:sB1NzHfU> その共用サーバは suExec 使っていない、つまり全ユーザのCGIが同じ実効uidで動いているわけだが、
> そのプロバイダに俺も入会して、同じ共用サーバにアカウントもらったとする。
> そしたら俺は、速攻で「そのサーバ上の全ディレクトリを回って606のファイルを見つけるCGI」を組んで
> 次に「606ファイルを好きに書き換えるCGI」を組んで
なるほど。つまり書き込み権限のあるフォルダにHTMLがあればどうにでもなる、と。
707などというパーミッションはとんでもない、ということでいいですか?
サーバー側でホームディレクトリ以下のファイルしか変更できないような対策があれ
ば安心?
サーバーがAppachだとして、管理者がsuExecを導入しない理由ってなに?
とまで聞いたらスレ違いでしょうか。
0591nobodyさん
04/01/24 01:23ID:???予想
a. 昔 suexec を入れてなくて そのまま入れる機会を逸している。
b. suexecを知らない
c. suexecはプロセスの起動数が倍になるので、負荷を避けるために導入していない。
(httpd → CGIなプロセス が httpd → suexec → CGIなプロセスになる)
0592nobodyさん
04/01/24 01:47ID:???bは論外として(笑)。
一応いまのところは問い合わせたときに「当面予定はありません」だったのでcかな。
いちおうもう一度、上記のようなケースに対策をとっているのか問い詰めて、
導入を薦めてみます。
とはいっても配布を視野にいれているので、そこそこいろんなサーバーで動かない
となぁ。
選択制でchmodの機能は入れるとして、セキュリティ上は堅いとはいい難い、と・・・。
今日はこれで寝ますが、対策・絶対ダメなど、何か他に情報ありましたらよろしくお願い
します。
>>587>>589>>591 ありがとうございました。
0593nobodyさん
04/01/24 09:51ID:???0594nobodyさん
04/01/24 16:31ID:PL//gjDgありますか?
0595nobodyさん
04/01/24 16:42ID:???use CGI; 行の先頭を # でコメントにすることぐらいかな
0596nobodyさん
04/01/25 12:38ID:???CGI.pmは使うなと?
フォームデータのデコード、Cookieの生成、ヘッダの出力にしか
使ってないので自前で作っちゃった方がいいかなぁ。
0598nobodyさん
04/01/25 21:00ID:???HTML::Template や LWP, DBI みたいにもっと重いモジュールをがんがん使う俺様から見ると、
もはや誤差のうち
0599nobodyさん
04/01/25 22:33ID:???CGI
HTML::Template
DBI
を同時に使うことはよくある。
0600nobodyさん
04/01/25 22:54ID:???0601nobodyさん
04/01/25 23:47ID:???俺の自宅鯖 (Pen4/3G) だと、たいていの CGI は 5〜10msec で実行が終わるが
use CGI と書くだけで 50msec に跳ね上がる。
しかし use HTML::Template は 60msec 食うし
use DBI に至っては 80msec 以上かかる (しかもこれにはDBDのコンパイル時間は入っていない)。
mod_perl でこの辺のモジュールを全部キャッシュしておけば
何も問題なくなるのだが。
0603594
04/01/26 00:27ID:???CGI.pm部分だけ自作しても焼け石に水ってことですか。
0604nobodyさん
04/01/26 01:01ID:???0605nobodyさん
04/01/26 09:45ID:???楽がしたいから使うんだけどな。
Perl使いが一番重要視する効率はコーディングの効率だと思うんだけどどうよ。
感覚的なものだけどさ。
0606nobodyさん
04/01/26 10:01ID:???0607nobodyさん
04/01/26 13:17ID:???以下のようにしました。
ただ追加書き込みしているだけですがflockはした方がよいでしょうか?
また、その場合どのようにすればよいでしょうか?
open(FH,">>index.log");
print FH $date_time . "\t" . $host . "\t" . $user_agent . "\t" . $http_referer . "\r\n";
close(FH);
0608nobodyさん
04/01/26 13:52ID:???禿しくスレ違い
Perl コーディング初心者質問コーナー Part31
http://pc2.2ch.net/test/read.cgi/php/1072896288/l50
逝ってよし
0609607
04/01/26 13:57ID:???0612nobodyさん
04/01/26 22:16ID:???0613nobodyさん
04/01/26 22:42ID:???HTML::Template を見つけたよ
ループのネストとか「おお俺って賢いじゃん」と思ってたんだがなあ…
0615613
04/01/27 02:13ID:???Template クラスと Tag クラスがあって、
Template オブジェクトに Tag オブジェクトを「貼り付け」る。
Template オブジェクトは HTML::Parser 使ってテンプレートファイルをパースしてって、
それらしいタグにぶつかると、対応する Tag オブジェクトの print メソッドを呼び出して、
戻り値をタグの代わりに挿入する。
Tag クラスは Tag::Base クラスを基底として継承したものをいくつか作ったんだが、
ループするタグだとか、if/unless タグだとか。ネストするときは Tag に Tag を貼り付ける。
将来他に新しいタグを思いついたときにも、同様に Tag::Base を継承したクラスさえ作れば、
Template クラスには一切手を加えずに機能拡張できる、つー。
しかし完成直後に HTML::Template を見つけ、
ほとんど全ての機能が既に実現されていたと知り、
新しいタグを作る気も失せてしまった…
0616nobodyさん
04/01/27 02:18ID:???ちりもつもればなんとやらで、
HTML::Templateの作法を頭にいれちゃえば、使い回しきくので便利。
(まぁ、自作のモジュールをすでにそーいうのを作っているならいいけど)
でも、複数人がコーディングしたり引き継ぎとかの場合、
ドキュメントがちゃんとあるから、HTML::Template のほうがいいかなと。
⇒http://member.nifty.ne.jp/hippo2000/perltips/html/template.htm
あと、HTML::Templateってそのまんま置けばつかえる(SSH接続不要)というのも好き。
0617nobodyさん
04/01/27 11:03ID:???俺も最初自作のモジュールを使ってたんだけど、やっぱ事実上Perlの
標準であるHTML::Templateの方が引継ぎの時等に便利なんだよね。
ちなみに俺の場合、<TMPL_VAR NAME="hoge">というのがどうしても
嫌だったから、勝手に%hoge%という書式に変更して、newするときに
filterオプションで置換して使ってます。
TMPL_LOOPやTMPL_IFは<!--#tmpl_loop name="hoge" -->みたいに
SSI風書式にしてます。
0618す
04/01/28 14:22ID:i/cjCs6gCGI 起動するときに環境変数 DOCUMENT_ROOT がなかったらダメですか?
apache 自体にはまったく問題ないんですけど、CGI 開発者としてのご意見きぼん。
0619nobodyさん
04/01/28 14:36ID:???ttp://www.palcom.ne.jp/hosting/support/server_independent.html
みたいな書き方をしているサイトが結構あるらしい
0622nobodyさん
04/01/28 14:45ID:???DOCUMENT_ROOT はApacheが独自につけてくれる環境変数みたいなので
なくても、公式のCGIとしてはOKなのでは。
ただし、Apacheにどっぷり遣ったようなCGIプログラムは必要としてるかも。
参考
http://hoohoo.ncsa.uiuc.edu/cgi/env.html
http://cgi-spec.golux.com/draft-coar-cgi-v11-03-clean.html
0623622
04/01/28 14:55ID:???0624nobodyさん
04/01/29 15:43ID:pGuQUw/Wブラウザの戻るボタンで戻る場合、先ほどの書き込み内容が
フォームの中に残っている時と残ってない時があるのですが、
これを確実に残して置く方法ってあるのでしょうか?
0625nobodyさん
04/01/29 16:03ID:???俺もそういう方法があれば是非知りたいと個人的には思っているのだが
たぶんブラウザの側の実装や設定の問題なので
CGIからは手出しできないんじゃないかと見ている
0628nobodyさん
04/01/29 18:01ID:???0629nobodyさん
04/01/29 19:26ID:???どうもIEだとvalueの値が優先されて表示される模様。
経験則なので嘘かもしれないw
0630nobodyさん
04/01/29 20:44ID:???わかりません。
パールを変えただけでは駄目ですよね?
0631nobodyさん
04/01/29 23:34ID:???新語キター
0632nobodyさん
04/01/29 23:55ID:???0633nobodyさん
04/01/30 00:04ID:HPifPmukUP板です。
ファイルとかの。
0634nobodyさん
04/01/30 02:51ID:???配 布 元 で 聞 け
0635nobodyさん
04/01/30 04:10ID:???0636nobodyさん
04/01/30 04:22ID:???0637 ◆LLLLLLLLL.
04/01/30 10:45ID:r6WYD04Xhoge.shtmlのなかに上下に2つfoo.cgiをexec cgiで呼び出す記述をし、
foo.cgiの方で、UserAgentを見て携帯電話の時とPCの時に処理を分け、
それぞれ表示させてるんですが、
携帯ユーザーの時は、上下2つあるうちの下の方は、
何も表示させないようにしたいんです。
cgiからの戻り値をssiに渡すことができるなら、
cgiから、表示させる文字列に加えて、携帯の時はフラグとして1を返し、
フラグが立ってたら下のexec cgiは実行しないような書き方をすると
出来るのではないかと思うのですが、、
何処を探してもそういうことが出来ると書かれたところを見つけられませんでした。
ssiスレを探しましたが無いようで、こちらに書かせていただきました。
何かいい方法無いでしょうか?
#ssi側でUAを判定することで下のexecをさせなくすることはできるのですが、
#cgi内でも表示させる文字列を分けるためUA判定する必要があるので、2度でまなんです
つまりssiとcgiで、変数を共有、若しくは戻り値、引数として値を渡せないかということです。
0638637
04/01/30 10:47ID:???間違ってperlスレに書き込みしてしまいましたんで↑はコピペです。
よろしくお願いします。
0642637
04/01/30 14:22ID:???それがexec cgiは引数渡せないみたいなんです(とほほさん調べ)
>>640
最悪それでいこうかと考えてたんですけど・・
大きいスクリプトなんで、主な処理を別ファイルにして、
ssiから呼ばれる上用CGIと下用CGI、
それぞれからメインのCGIをrequireしようかと・・
どうやらどうしても変数などを渡すことは出来ないようなんで、
負荷など若干気になりますがそれでいこうかと思います。
有難うございました。
0643nobodyさん
04/01/30 14:34ID:???exec cmd なら渡せる(ARGV渡し)
0644nobodyさん
04/01/30 14:37ID:???0645nobodyさん
04/01/30 14:41ID:???うちのApache2.0.39だとexec cgiで引数渡せたんだがな・・・
バージョンによって違うのかな?
んで、
SSIで<!--#set var="TYPE" value="TOP">とかやると
$ENV{'TYPE'}でとってこれるみたい
0646ありが�dです
04/01/30 14:49ID:???ごめんなさい。exec cmd使えない鯖なもんでexec cgiなんです。
>>645
なんか環境によって使えたり使えなかったりらしいです。
うちのローカルでは使えなかったんですけど、
鯖で一回試してみます。
>>644
includeって読み込んで実行してくれるんですか。
ちょっとこっちも試してみます
0647訂正
04/01/30 14:50ID:???調べてきます
0648nobodyさん
04/01/30 14:54ID:???SSIで判定して呼ばないとかは、CGIの範疇を超えてると思うですが。
0649nobodyさん
04/01/30 14:56ID:???俺もすっかり見落としてたが、
ttp://tohoho.wakusei.ne.jp/wwwssi.htm#If
ここらへん使えばいけそう?
0651nobodyさん
04/01/30 15:40ID:???やはり、exec.cgiで引数は渡せなかったんですが、
(ローカル5.8.0、鯖5.6かな?)
騙されたと思って下のほうの
>SSIで<!--#set var="TYPE" value="TOP">とかやると
>$ENV{'TYPE'}でとってこれるみたい
これをやってみると、ちゃんと変数渡せてました。
これは私が、「引数」などで検索してたため、見つからなかっただけで、
実は当たり前のことなのかもしれませんね。
有難うございました。これで期待通りのことが出来そうです。
0652nobodyさん
04/01/30 15:44ID:???apacheは1.3.29だと思います。
0653nobodyさん
04/01/30 16:13ID:???HTTP_USER_AGENTじゃあかんの?>判断材料
まぁ とりあえずSSIでCGIから返り値をとってくるのはムリポ
CGI中でENV書き換えてみたけど普通の方法じゃやっぱり保存できないみたいだし
>>651
思惑どおりにいきそうらしいので何よりです。 カンパレ
0655nobodyさん
04/01/30 18:42ID:???君の質問が意味不明だから相手にされないんだよ
CGI設置について質問
http://pc2.2ch.net/test/read.cgi/php/1054216089/
過去ログを読んでテンプレに従って質問してみ
0656nobodyさん
04/01/30 20:30ID:???こんなにcgi使ってサーバーに怒られないんですか??
0658nobodyさん
04/01/31 00:27ID:???自分の掲示板に組み込もうと思って。
0661nobodyさん
04/01/31 06:20ID:???0662658
04/01/31 10:32ID:???普通に気づかなかった。
投稿者の記事削除機能で使ってたのに。
テンキュー。
0665nobodyさん
04/02/03 00:14ID:???どうも安いレンタルサーバーで動かすと激烈に重い。
今、上位100スレの全ログから抽出するのに成功したけど、全部で700以上のスレがあるんだよね。
どうにか軽くする方法ないですかねー。
0666nobodyさん
04/02/03 00:27ID:???こうゆうこと言ったら元も子もないがCGIでやることではないような。
クライアント側でやるべきでは?
例えばそのようなIEツールバーを作るとか。
0667nobodyさん
04/02/03 01:49ID:???1.定時に巡回してログを収集する(cronか何かで)
2.ログを解析し、DBにぶちこむなり、IDでindexを張るなり(これもcronか何かで)
3.CGIは、DBないしindexを検索するだけ
0668nobodyさん
04/02/03 07:01ID:???0669nobodyさん
04/02/03 09:57ID:???0670nobodyさん
04/02/03 20:53ID:???利用する技術はopen文、CGIモジュール、param関数、ファイル読み込み、ファイル書き込み、です。
これがwrite.htmlのソースです。
↓
<html>
<body>
<body background=star-k2.gif>
<center>
<font size="7"color="#FF00FF">掲示板のプログラム</font><br>
</center>
<font size="4"color="#00FFFF">氏名</font><br>
<center>
<font size="5"color="#FFFF00">書き込みの内容を指定してください ;</font><br>
</center>
<center>
<form action="write. cgi">
<input type="text" name="contents">
<input type="submit">
</center>
</form>
</body>
</html>
0671つづき
04/02/03 20:55ID:???↓
#!/usr/bin/perl
print "Content-type:text/html\n\n";
use CGI qw(:standard);
$value = param("contents") ;
???????????????????
?ここに何を入力するかわかりません。?
???????????????????
print "<html><body>";
print "書き込みが終了しました";
print "</body></html>";
これがresd.cgiのソースです。
↓
#!/usr/bin/perl
print "Content-type: text/html\n\n";
??????????
ここに何を入れるか???
?????????????
print ???????
print ???????
print ??????
print ???????
以上です。わっけがわかりません。友達みんなこうゆうの弱いんで今みんなパソコン詳しい人に頼み込み中なんです…
誰か教えてください!
0673nobodyさん
04/02/03 21:58ID:???レスありがとうございます!
でも…馬鹿ですいませんが、自由にソースコードを書くことすら出来ない
のが現状です…大学の講義で、情報処理関係の講義を選択したのですが、
もうなにがなんだかさっぱりわからなくて…HTMLの基礎をかじったぐらい
の知識しかないので…
もしよろしければ、もう少し教えていただけませんか?
「勝手にしろ」とおっしゃられるかもしれませんが、ホントお願いします!
0675nobodyさん
04/02/03 22:39ID:???0676nobodyさん
04/02/04 04:15ID:???0677nobodyさん
04/02/04 13:07ID:???痛い香具師なのは十分わかってるんですが…
右も左もわからない状態でして…
やっぱり自分でとことん調べるべきですよね。。
なんとか頑張ります。
ありがとうございましたm(_ _)m
0678nobodyさん
04/02/08 23:32ID:???現在mod_perlを使ってるのですが、
時間のかかるスクリプトの場合、途中でブラウザ側が読み込み中止をしても
最後までスクリプトは実行されるものなんでしょうか?
15秒程度のスクリプトで実験したところ、中止した後も最後まで実行されているようでした。
更新作業をするスクリプトで、一旦更新するブロックに入ったら
何があっても最後まで実行させたいのですが、まれに途中で止まってしまっているようで
原因がよくわかりません。
タイムアウト以内に終わるのであれば、ブラウザで読み込みの中止をしても最後まで実行される
ものなんでしょうか?
それとも、fork,execなりsystemなりして別プロセスとして動かしたほうがいいんでしょうか?
0679678
04/02/08 23:34ID:2J+W47Q/どういうタイミングで、実行中のスクリプトが終了するのかが分からないんです。
0680nobodyさん
04/02/08 23:49ID:???symlinkやmkdirを使って自前でロックしてるみたいなんだけど
flockじゃやっぱりロックしきれないのかな?
■ このスレッドは過去ログ倉庫に格納されています