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 あたりに
0425nobodyさん
03/09/17 20:33ID:???同じ動作をするcgiが、全く同じ条件でpostメソッドでcgiにアクセスしても、
Internal Server Errorがでるときと正常動作するときがあります。
Internal Server Errorがでても、リロードすると、正常動作してしまうので、
不可思議なのですが・・・。
これは、どんな原因が考えられるのでしょうか?
0426nobodyさん
03/09/18 04:23ID:???(ちなみにスクリプト自体の文字コードはEUC)
それを、&jcode::convert(\$in{$key}, "jis");
みたくして、JISに変換して(正確にいうと、変換しようとして)、
それをメール本文(もちろんJIS)中に変数として入れたら、
文字化けする可能性ありますか?
もしあるとしたら、
&jcode::euc2jis(\$in{$key});
と明示的に文字コード変換したら、
文字化けがなおる可能性はありますか?
実は文字化けではまってるものの、
文字化けが再現できなくなってしまっていて・・・。
0428425
03/09/20 03:11ID:???でも、リロードしてら正常動作するもんで、手がかりがつかめません。
同じことをしてるのに、違う結果がでるなんで・・・と。わけわからん状態です。
どっから疑っていけばいいんでしょうか?
0430425
03/09/21 16:58ID:???>タイムアウト
いや、タイムアウトの可能性はないかと。
すぐにInternal Server Errorになったので。。。
>負荷ぎりぎりで動いてるとか
でも、これが可能性高そうです。ちょっと調べてみます。
0431nobodyさん
03/09/21 17:01ID:???ソースを公開するなり、そちらが情報を提供する気がないのならこれ以上質問するなよ。
こういう掲示板はGive&Takeによって成り立っているって理解している?
0432430
03/09/21 21:55ID:???>ソースの公開は、仕事の都合上、できないので、すみません。
あと、いちお、名無しでですが、Giveはこのスレでも他のスレや板でも、してます。いちお。
0433nobodyさん
03/09/21 23:31ID:???その現象が起きる20行程度のソースを晒せば?
それでも仕事の都合上無理ってんなら>>431の言う通り。会社の人に聞けば?
y=x+1が与えられてyの値はいくつでしょう?と聞かれても誰もわからんのでは?
0435nobodyさん
03/10/17 10:28ID:M5vTMTcpページが正常に表示されず、ファイルのDLを始めようとするようです。
同じサーバーの他のプログラムは正常に表示するようで、吐き出す
ヘッダも同じにしてるはずなんですが。
本来相手の環境を調べるべきなのですが、素人なので聞かれてる内容も
理解できないらしく、上手く情報が伝わって来ません。
なにか考えられる原因、思い当たる方いませんか?
0437nobodyさん
03/10/17 11:26ID:5bzSqekM後は、Webサービスのマッピングをチェックしてみるってのはどうでしょう?
さすがにそれぐらいしか答えようがないですね。
0438nobodyさん
03/10/17 12:05ID:???>>437
まあ、そうですよね。
ただ同じサーバーの他のスクリプトでは問題ないようなのです。
もちろん当方からのアクセスではそのスクリプトも含めて全て正常に表示されます。
なんとも再現しないのでわからないのですが、
状況からすると、ある特定の環境で問題を起こすCGIの記述の可能性、
と予想したのですが。
0441nobodyさん
03/10/17 15:28ID:???あと、アドレス欄の最後のパラメタを拡張子と誤解して
誤動作するブラウザがある
0442nobodyさん
03/10/17 16:40ID:???http://www.hoge.net/huga.cgi
のようにCGIを直接呼ぶ事で単純に表示するルーチンに飛ばしてます。
で、当人が言うにはブラウザから、
「このファイルは開けません。ファイル huga.cgi」とか、
「検索の結果、以下のソフトウェアが見つかりました。
このソフトウェアを利用するとファイルを開くこと
ができます。
ファイルの種類: Common Gateway Interface」
とか言われるらしいのです。
ただ、それもこの特定のCGIだけなんですよね。
wget試してみます。
0443nobodyさん
03/10/17 16:50ID:???Length: unspecified [text/plain]
なんてなってます。
他のCGIは、
Length: unspecified [text/html]
になってるんですが。。。
ヘッダは以下のようにtext/htmlで送出してるはずなんですが。
--
Content-type: text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
--
0444nobodyさん
03/10/17 17:00ID:???0445435
03/10/17 17:06ID:???で、Content-type: text/html の送出をスクリプトのなるべく前の
方に持ってきたら
Length: unspecified [text/html]
と表示されました。
これで問題ないかアクセスしてみてもらいます。
しかし、これはどういうわけでしょうか?
後学のためどなたかお分かりの方お教え下さい。
0447nobodyさん
03/10/17 17:32ID:???0448435
03/10/17 17:35ID:???検索していませんでした。
検索しましたが、どこにもありませんでした。
実はこのスクリプト、個別の設定情報を書いた複数の違うhoge.cgiから、
共通ライブラリであるcommon.plをrequireする仕様で、
それぞれのhoge.cgiにはユニークな固有の設定情報のみ記述し、
スクリプトのほとんどはcommon.plにあります。
当初送出するヘッダはcommon.plに書いてあったのですが、
Content-type: text/html のみhoge.cgiに持ってきたら
wgetでhtmlが確認できました。
text/plainはhoge.cgiにもcommon.plにもどこにもありませんでした。
0449nobodyさん
03/10/17 21:16ID:???大事な内容をCGIで送信するのにベストな方法ってありまつか?
0450nobodyさん
03/10/17 21:34ID:???何が何だかわからないのでご存知の方いたらご教授願います。
「○○サーチ」というある検索エンジンに自分のサイトを登録しようとしたら、
何度やっても「コマンドが不正です」と出る。
新規登録は動いているからサーチ自体には問題ないようだ。
てことは自分のパソコンに何か原因があるのでしょうか?
0453450
03/10/17 21:59ID:???まだサイトは登録してないから拒否とかはないはず、
登録画面に入るボタンを押すと「コマンド〜」が出たんですよ。
なんなんだほんと。
0455nobodyさん
03/10/18 00:04ID:???だから検索エンジンってのがあるように、
登録しようとした君のサイトを自動的に見に行って
登録するにふさわしくないと拒否られたんだって
0456nobodyさん
03/10/18 04:12ID:???使うだけの人間はここで質問するな。
0457nobodyさん
03/10/18 04:15ID:???どうやらその検索サイトはHTMLの文法をチェックしているみたいですね。
HTML-lintで90点以上取らないとダメみたいです。
0458450
03/10/18 21:13ID:???レスサンキュ。登録あきらめることにしたよ…_| ̄|○
さっきいったらサーチがダウソしていてめんどくなりますた
スレ違いすまんな。さらば!
0459nobodyさん
03/10/18 23:12ID:???ベストっていったら、
(SSLは必ず使うとして・・・)
●メールは、もし流すなら、
ウェブサーバ、送信メールサーバ、それを受信するメールサーバとも、
セキュリティ的に安全なネットワーク内部で完結させること。
とかいいつつ、自分もよく分かってない。
・・・詳しい人フォローきぼんぬ、、、
0460nobodyさん
03/10/19 00:13ID:???0462nobodyさん
03/10/27 00:03ID:???0463nobodyさん
03/10/27 10:59ID:???0464nobodyさん
03/10/27 16:10ID:???0465nobodyさん
03/10/27 20:46ID:???0466nobodyさん
03/10/29 12:37ID:aayFZnQswindowsでは\r\nContent-Type:となっているけどmacだと\rContent-Type:ってなるんですか?
0467nobodyさん
03/10/29 12:41ID:???仕様上は改行コードに依存せず
常に\r\nじゃないといけなかったかな?忘れた
0468nobodyさん
03/10/29 12:52ID:???0469nobodyさん
03/10/30 17:06ID:???CGIで、設置ユーザのドキュメントルートを絶対パスで取得することってできますか?
例えば、test というユーザが、
http://server/~test/cgi-bin/test.cgi
という名前でCGIをアップしたときに、test.cgi で
http://server/~test/
と同じ場所の絶対パス(ex: /home/test/public_html )を取得したいのです。
設置ユーザがサイトの管理者であれば、
$ENV{'DOCUMENT_ROOT'} で、
/var/www/html なんかが取れるんですが、
ユーザ毎にサイトを作れる設定にした場合、
$ENV{'DOCUMENT_ROOT'} では取れませんよね…
0470nobodyさん
03/10/30 19:58ID:???$path = 'http://' . $ENV{'HTTP_HOST'} . $1;
}else{
$path = 'http://' . $ENV{'HTTP_HOST'} . '/';
}
こんなところかな?
スマートではないけど。
tu-ka,Perlの話はPerlスレ逝け。
0471nobodyさん
03/10/30 20:47ID:???スマン。
取得したいのは絶対パスの方っす。
/home/test/public_html ね。
説明がわかりにくかったかも
一応 %ENV 絡むんで CGIスレで妥当かと思いマスタ
0472nobodyさん
03/10/31 01:12ID:???_,..,_ ノ´//⌒ ミヾヽ、_
_____ ,r'´ ``'' - 、ーニ三彡´〃 ! ゙ゞヾ、_`ヽ
[|<|____├{ /´ { l | // ヽ`ーr' }
″ ! `、 ' ノ l. ||l i l / l ああっ、つ、つらいです...
', | ̄``''''ー―- ,'´l l |!` ‐--| l l l
', | l l | リ,! l
', | | | ,! ' リ
,.r''ヽ、 _ ', | |. |
,' ` ' ' ' ' ' ' ´ `ヽ ! | |
/ ,.r'´ ̄ '''''' ─−-........__ ,.r' | '''"''‐-、
~´  ̄ ̄ ̄
0474nobodyさん
03/10/31 06:04ID:???そんなのとって何するんだ?
0475nobodyさん
03/10/31 11:40ID:???目的としては、
http://server/~user/cgi-bin/query.cgi?file=/index.html
のようなクエリーで、
/home/user/public_html/index.html
のファイルを取得したいって感じかな?
単純にperlに /index.html を渡すと、
本当にルートからの /index.html になってしまうので、
それをどうにかしようと /home/user/public_html を調べて
/home/user/public_html/index.html としたいってことでつ…
0476nobodyさん
03/10/31 13:30ID:???こんなのでできないか?
$path = $ENV{'SCRIPT_FILENAME'};
$path =~ s/$ENV{'SCRIPT_NAME'}//;
あとは$pathにクエリーストリングのファイル名をくっつけてやれば
0478nobodyさん
03/10/31 23:37ID:NZRYtOAF0480nobodyさん
03/11/01 02:11ID:???0481nobodyさん
03/11/01 03:03ID:???あぁ、欲しいのはユーザディレクトリなのね。
「ドキュメントルートを絶対パスで」しか見てなかったよ。
なら、プログラム内や設定ファイルで陽に指定するしか
確実な方法は無いだろうね。 cgi-bin ディレクトリと
ユーザのドキュメントルートの位置関係は設定次第で
いくらでも変わるからね。
cgi-bin ディレクトリがユーザのドキュメントルートの下に
存在するなら >>476 でOK。
0482475
03/11/01 10:32ID:???そうっす。ユーザディレクトリ。
やっぱりCGIスクリプト内に直書きするしかないかな…
一応配布CGIとして考えてるんだけど、
CGIをDLするユーザって、
その鯖内の自分のユーザディレクトリパスなんて知らんしね。
下手すりゃ file=/etc/passwd とかってやられそうだ(ガクガクブルブル
(↑これを /home/user/public_html/etc/passwd にできればええんやけど)
0484nobodyさん
03/11/01 18:41ID:???それに関して詳しく書いてあるサイトなどはありませんでしょうか?
googleなどで探してみたのですが、検索ワードが悪いのかいいサイトが見つかりませんでした。
対策なども含めてかかれているサイトがありましたら、どなたかお教えください。
0485nobodyさん
03/11/01 19:33ID:???ISO-8859-1 なら %A0 は no-break space ( ) なので
どっちゃでもいい気もするが。
情報を小出しにせず再現できる条件を全部書いてくれんか。
0486nobodyさん
03/11/02 00:02ID:???レスありがとうございます。
再現条件は自分ではよくわからないのです。
自分の投稿では普通に%20になっているようで、誰がどの状況になった時に
%A0になるかがはっきりとわからないので。
条件絞りきる力がなく申し訳ありません。
%A0についてですが、どっちゃでもいいとおっしゃられますが、我が家のマシンで
%A0の文字をブラウザで見ると半角の「・」みたいに表示されます。
気にしなければ気にならないのかもしれませんが、できれば解決したいと思っていまして。
Perlの正規表現で置き換えようともしたのですが、%A0は「あ」の2バイト目であったりと
なかなか上手くいきません。
それで資料を探していたのです。
0487nobodyさん
03/11/02 02:10ID:???だからぁ、小出しにしないでって言ってるでしょ。(w
「あ」の 2 byte 目が %A0 なのは Shift_JIS 。
Shift_JIS では 1 byte 文字としての A0 は未定義だから
(特定の環境では) 半角の「・」みたいに表示される。
言語は Perl らしいし置換で事が済むのならこの辺。
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0488nobodyさん
03/11/02 12:11ID:???・環境
Web上のPerlCGIにてデータを取得している。
送信者はどのような環境かわからない。(条件の限定ができない)
フォームから送信された取得はPerlで行なっているが、その後
取得データをCプログラムで処理することもある。
また、今後Perlで送信データの取得を続けるとは限らない。
スクリプトの文字コードはS-Jisで行ない、結果作成もS-Jisで行なっており、
CプログラミングはVCで行なっている(S-Jis以外使えない)ので、文字コードの変更は困難。
送信フォームもMETAタグにてS-Jis指定を行なっている。
データ取得で使うサーバーはRedHat、Cプログラムを走らせるのはWindows。
S-Jisの状態で%A0を%20に置き換えようとすると「あ」などの文字が化けてしまう。
・目的
%A0が送信されない環境が作れればベスト。
もしくは%A0を%20に上手く置き換える手法を知りたい。
正解のみをここで聞くのではなく、できれば自分できちんと理解し、応用できるようにしたい。
思いつくだけの情報を羅列してみました。
他に足りない情報があればご指摘ください。
紹介されたページはこれからじっくりと読んでみようと思います。
ありがとうございます。
0489nobodyさん
03/11/02 12:29ID:???お前自分で何言ってるか分かってる???
Shift-JISなら「あ」=「%82%A0」だから
>%A0を%20に置き換えようとすると「あ」などの文字が化けてしまう。
当たり前
0490nobodyさん
03/11/02 12:31ID:???それはわかっています。
だからこそ、「上手く置き換える手法」を知りたいのです。
0491nobodyさん
03/11/02 12:33ID:???S-Jisの半角スペースである%20に置き換えたいと。
0492nobodyさん
03/11/02 12:48ID:???ってことは
>Macからのフォーム送信だと、半角スペースが%20ではなく%A0になる事があるのですが、
これは本当のことなのか?
てっきりShift-JISの文字列見て%A0を空白と勘違いしただけなんだと思ってた。
先頭から1文字ずつ見ていくしかないだろう。
別の文字コードでどうなるか試してみたら?
0493nobodyさん
03/11/02 13:13ID:???<FORM accept-charset="Shift_JIS">
を試してみるとか。macのブラウザが対応してるのかどうかは知らん。
あるいは
<FORM enctype="multipart/form-data">
で常にバイナリ送信させるとか。
0494nobodyさん
03/11/02 14:21ID:???>492
アクセスログを見たところ、%A0になってしまっていたのはいずれもUAがMac_PowerPCの方でした。
確認できた件数が6件と少ない為に断言はできませんが、Macからの送信で化ける可能性が高いと判断したのですがいかがでしょう?
自分ではMacマシンを所有していないので、正確な調査が行なえず申し訳ありません。
試行錯誤の末、>487のリンク先や、Perlメモの記述を参考に、1文字ずつ見ていくような処理が行なえるようになりました。
これでしばらく様子を見ようかと思います。
別の文字コードで試すというのは、「別文字コードでの送信」という意味でしょうか?
後程、やり方を調べた上で試してみたいと思います。
>493
accept-charasetは知りませんでした。
早速試してみたいと思います。
0495nobodyさん
03/11/02 14:22ID:???ttp://www.att.or.jp/perl/cgi-tech-tips.html
ここに掲載されていた、CGI出力ヘッダでの文字コード指定と.htaccessによるADDType指定も
同時に行なった事を報告させていただきます。
0497nobodyさん
03/11/02 14:53ID:???自分がこの属性に着目したのは、Operaから文字を投稿するとき
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
と指定していても、送信フォームの内容をShift_JISと判別してくれなかったから。
全部Shift_JISの半角カナで投稿すると、OperaはそれをEUC-JP全角と自動判別して
それをShift_JISに変換してから送信するので、CGI側で受け取った段階で既に文字が化ける。
最初はjcode.plの問題かと思ったけど、jcode.plを外しても同じだったのでほぼ間違いない。
0498nobodyさん
03/11/02 15:33ID:???0499nobodyさん
03/11/02 16:57ID:???0500nobodyさん
03/11/02 22:32ID:???自分で確認できないのは厳しいですね。
後から気付いた事とわかった事を少しだけ載せます。
文字化けした6件ともMacのMSIEだった。(MSIE5.16〜5.22)
一部の人の証言ではS-Jisのページで出ていた文字をコピペしたとの事。(全員がそうであるかは不明)
>497
ご指摘ありがとうございます。
危うく間違えるところでした。
0501nobodyさん
03/11/04 01:41ID:ZhxpP0UW教えてはもらえませんか?
0503501
03/11/04 13:37ID:???CGI::Carp素晴らしいですね。
use CGI::Carp qw(fatalsToBrowser);
とやるだけでdieや文法エラーに対してブラウザに
エラー内容を表示してくれなんて。
CGIの開発がかなり楽になりますね。
しかも標準モジュールなので別途インストールの必要は
ないみたい。今まで知らなかったよ。
本来の機能はHTTPDのログにエラー内容を書き込んでくれる
ということでよろしいですか?
0504nobodyさん
03/11/04 13:45ID:???0505nobodyさん
03/11/04 21:05ID:Ljvqwop4Redirect ^/hoge/abc([0-9]{4})\.html$ http://example.com/index.cgi?a=1&b=$1
で動作させると、
?が%3f &が%26になり、&のところで、ループしているようなURLを吐き出します。
ここで、解決できたのでしょうか?
0506nobodyさん
03/11/04 21:33ID:???Apache 限定の話題は Apache スレへ。
http://pc2.2ch.net/test/read.cgi/php/1043851302/
Redirect (mod_alias) じゃなく Rewrite (mod_rewrite) 使えば可能。
0507nobodyさん
03/11/04 21:56ID:xEdoNAPc0508nobodyさん
03/11/04 22:14ID:???ていうか、そもそも「普通の掲示板」って何だ。2ch型は普通じゃないのか。
0509nobodyさん
03/11/04 22:27ID:???それとも駅構内の掲示板が「普通」なのか
0510nobodyさん
03/11/05 07:59ID:???0511nobodyさん
03/11/05 08:29ID:???0512nobodyさん
03/11/13 01:19ID:???クッキーにログインパスワードを暗号化したものを食わせて、
画面が遷移するたびにその暗号化パスワードと本当のパスワードを認証させるとか。
Apacheのセッション管理モジュールとかは虫で、
Perlだけでできるようなの他にあったらきぼんぬ
0513nobodyさん
03/11/13 08:34ID:???例え暗号化していても、クッキーにパスワードを持たせるべきではない。
ログインしたときにセッションIDを持たせて、それで認証するのがセオリー。
セオリーだから細かい部分は調べれば資料はすぐに見つかるはず。
0514512
03/11/13 13:22ID:???セッションIDを発行して、それをクッキーに持たせてSSL通信にすれば
今のところPerl-CGIでできる最善の方法かもしれないすね。
セッションIDは、普通、発行時刻とプロセス番号をくっつけてcryptするのが主流なんでしょうか?
まあユニークで、盗聴に耐えうるものであればなんでもいいような気がしますが。
で、セッションはサーバー上に生成するファイルで管理すると。。
本当にこれでセキュリティ上安全なのか不安になったのでみんなに聞いてみたまででつ。。
他にこういうことしてるとかあったら教えてくさい
0515nobodyさん
03/11/14 10:39ID:???セッションIDにtimeとプロセスIDでユニークにしつつセッション開始時刻をとって、
セッション開始時に発行したセッションIDのファイル名のファイルを作って、
次にセッションIDでアクセスしたときに、毎回セッションファイルリストをチェックして、
存在すれば、そのセッションの開始時刻を見て、制限時間を切れてたら削除。
問題なければセッション継続。
でよろしいか?
てかこれしか思い浮かばん。
0516nobodyさん
03/11/14 11:12ID:???0517nobodyさん
03/11/14 14:55ID:???0518nobodyさん
03/11/17 14:42ID:WakYOncEさらに次のcgiに同じパラメータを渡す事ってできる?
0519nobodyさん
03/11/17 15:20ID:???0520518
03/11/18 11:25ID:2RvczggN環境はVinelinux2.2+CGI.PM+Perl4です
0522nobodyさん
03/11/18 11:51ID:???0523nobodyさん
03/11/18 14:44ID:???0524518
03/11/18 19:41ID:???POSTで渡す方法はありますか?
■ このスレッドは過去ログ倉庫に格納されています