☆ショッピングカートのCGIを作りたい!Perlで☆
■ このスレッドは過去ログ倉庫に格納されています
0001無謀者
02/01/10 19:53ID:XY4TxmilフリーのショッピングカートCGIは設置は簡単でも、商品の登録
とかが手作業だったりで使い勝手が悪いです。
で、短絡的に「自分で作ってみようか」と思っているのですが・・・・
Perlも、いやプログラミングさえ未経験。「必ずわかるCGI」と
その他の入門書で何とか「掲示板」の仕組みがようやく理解できました。
やっぱ、無謀ですかねぇ・・・・・・
0242名無しさん@お腹いっぱい。
02/01/26 01:28ID:???0243名無しさん@お腹いっぱい。
02/01/26 10:31ID:8XQYuO1Bマチクタビレタ〜
☆ チン 〃 Λ_Λ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヽ ___\(\・∀・) < >>1 ねぇねぇまだなの?早く早く〜
\_/⊂ ⊂_ ) \_____________
/ ̄ ̄ ̄ ̄ ̄ ̄ /|
| ̄ ̄ ̄ ̄ ̄ ̄ ̄| |
| 長野りんご. |/
0244
02/01/26 13:29ID:cJzc6DfBちゃんとサブルーチンに分けてあるし。
見やすいし。
別に汚いソースじゃないじゃん。いいんじゃないの?
0245244
02/01/26 13:49ID:8S+CJ+jU> $ctime=time();#クッキーID作成用要素(時間)
> $cid=$$+$ctime;#クッキー用ID
厳密には、クッキー用のIDが足し算だとイカンと思うが・・。
プロセスIDは一回転して戻ってくるから。
Windows だと、プロセスIDはランダムに割り当てられるし。
0246無謀者
02/01/26 15:20ID:???で、文字コードなんですが・・・
一般的にはスクリプト自体はEUCで書けとものの本には書いてありますよね?
ただ、HTML表示はS-JISが一般的(だと思うのですが)
たとえばスクリプトをeucで書いて(保存して)フォームからのデータは
jcode.pl使ってEUCにコンバートで、スクリプト内のHTML表示部だけMETAタグでs-jis
指定してやればブラウザはちゃんと解釈してくれるんでしょうか?
CGIというよりWEB作成の基礎の気もするんですが、今まではDW使ってて
文字コードって意識した事無かったもので・・・・・
前に書いた通り全てS-JISで統一すれば楽なんですけど、スクリプトがeucじゃないと
動かない鯖にいきなりあたっちゃったもんで・・・・・
あと、この鯖、(てかeucでスクリプト書くと)sendmailで送られたメールが
どうしようもなく文字化けするんですよね・・・・ちゃんとコンバートはかけてる
はずなんですが。
>>245
$$で得られるIDが3桁みたいだったので重複する可能性も考えtime()とあわせてみたんですが
ダメですかね?1秒以内に$$が重複する可能性は無いと思いまして・・・
アクセス数の極端に多い(同時に買物をスタートする可能性が高い)場合は問題になりそうですが・・・・
0247名無しさん@お腹いっぱい。
02/01/26 15:43ID:???内部でEUC処理するなら、出力もEUCで良いんじゃないの。
METAタグと、出力ヘッダの両方でEUCに指定した方がいいよ。
あと、メール本文はJIS出力でいいけど
subjectはそれだけじゃダメでちゅ。バケまちゅ。
0248244
02/01/26 15:50ID:8S+CJ+jU+ って、文字列くっつけるんだっけ? 忘れちゃった。
$cid = "$ctime$$"; とかにしとく方がいいかと思ったんだけど。
あとcgi なら、同時アクセスでも、別のプロセスを立ち上げるから、
同時に買い物をスタートされても平気。
0249名無しさん@お腹いっぱい。
02/01/26 16:10ID:???俺のスクリプトよりもキレイだぞ;
しかしCGI.pm使ってないの見るの久しぶりなんでなんとも懐かしいにおいがする
のう。。。
0250無謀者
02/01/26 16:12ID:???修正させてもらいます。
で、やっぱりメールの本文の文字化けが解消しない・・・・
スクリプトとHTML出力はEUCで統一したんですが。
@sendml=メールの本文;
&jcode'convert(*sendml, 'jis');
じゃダメなんですかね?
@sendmlはファイルから読み出して格納してます。
ファイル自体は開いて見るとeucになってるみたいなんですが。
0251名無しさん@お腹いっぱい。
02/01/26 16:22ID:???@sendmlってことは、配列なんでしょ。
jcodeなら各要素ごとにやらなだめでしょ。
0252無謀者
02/01/26 16:31ID:???をjisでコンバートして最後に一気に読み込んで送信すれば良いんですかね?
0253名無しさん@お腹いっぱい。
02/01/26 16:35ID:???たとえばcookieに予想していない文字列突っ込まれたときとか
0254無謀者
02/01/26 16:44ID:???>>253
ReadParseってフォームからのデータの取得にしか使ってないんですが、
他にも何か使い方があるんでしょうか?なんやら重要そうな内容みたいですが・・・
0255名無しさん@お腹いっぱい。
02/01/26 17:06ID:???フォーム要素のハッシュに対してもjcodeで一括変換しようとしてるでしょ。
テストしてうまく行ってるのかもしれないけど、
jcodeは効いてないんじゃないかな。
0256名無しさん@お腹いっぱい。
02/01/26 17:07ID:???cartファイルが../xxxxになってしまう。
ブラウザから渡されたデータは全て信用できないものと仮定して汚染チェックを行わなければいけない。
それをReadParseの中でやっているのなら問題はないが、汎用ルーチンのようなのでやっていない可能性大。
0257241
02/01/26 22:45ID:???まだ余計な<center>が<body>の前にひとつついてくるが。
EUC統一ついでにHTMLファイルもEUCに統一しちゃうと、フォームから入力される
文字コードはEUCと決め打ちできるから、入力段(&ReadParseのあと)でのコード
変換は要らなくなるぞ。
いま化けるのは>>255さんの言うとおり、商品ページがSJISで、jcode.plが
SJIS->EUCを変換し切れてないからだろう。
(ひょっとするとメールの件もここの変換ミスが一枚絡んでいるかもね)
&ReadParse( *form);
foreach $key(keys %form){
jcode::convert(\$form{$key}, 'euc'); #現在内部処理をEUC統一したそうなんで
}
とかのほうがベターだろう。(生書きだから検証してないけど)
0258無謀者
02/01/26 23:14ID:???さて、これを始めるきっかけにもなった商品用ページ作成用CGIの作成に取り掛かろうと
思ってるのですが、その方法についてお知恵拝借いたしたく。
作りたい商品ページの形式としては今ウプしてあるようなかたちです。
画像ファイルのアップロード等勉強しなくちゃいけないことは山ほどあるのですが、手順として
どういうものがあるのか。
今考えてるのは、テーブル一個分の項目(1商品分)を一行としたdatファイルに保存しておいて
それにタグを挿入してHTMLファイルを作るというものです。新規商品を追加する時や削除
する時はそのdatファイルを呼び出して編集・削除・追加を行いHTMLファイルを丸々上書きという
方法です。HTMLファイルを直接いじるのはタグなどが邪魔して非常にめんどくさそうなので、
HTMLファイルをいじるのではなく、datファイルを編集してそのたびにHTMLを書き直すほうが
楽かなぁと思ったので・・・・
HTMLを作らずにdatファイルからcgiで表示も考えたのですが、鯖の負荷等考えるとHTML生成しちゃった
方が良い気もしたので。
あとページごとのデザイン等の一括変更とかの機能にはCSS使うしかないですかね・・
0259名無しさん@お腹いっぱい。
02/01/27 00:03ID:???画像は専用ディレクトリを作って、ファイルリストをgetして、
BBSの書き込みフォームのページかなんかにWidth/height指定してfilenameと
画像をサムネイル表示。
書き込みフォーム自体にはプルダウンメニュー(select/option)か何かを動的に
生成して、書き込み情報に加えるとかすればOK
画像ウプは説明が長くなるから、まあ「form multipart」あたりでグーグル逝け。
デザイン一括変更は雛型式(デザインを外部ファイルで指定)のBBSを
(拾ってく|作)ればいいんでないかい?
0260無謀者
02/01/27 01:50ID:???・多板作成が可能
・板毎のデザイン変更が可能
・書き込み内容編集が可能
・画像アップロード可
って掲示板探してそれを参考にしてみよう。
・・・・って思って、画像以外は2ch型改造のAhhanBBSがよさそう
なんでソース見てみたら複雑すぎてわけわかめ(鬱
もうちょっと簡単そうなの探してみよう。
というわけでCGI INDEXとCGI ZOOで旅してきます。
0261sage
02/01/28 15:00ID:???これみれなくなってるぞ?!
けした?
おれもソースみてみたいからみせてくれ>>1
なんかだいぶできてきたみたいだね!
0263sage
02/01/29 11:00ID:???0264名無しさん@お腹いっぱい。
02/01/30 16:55ID:???0266名無しさん@お腹いっぱい。
02/02/02 18:51ID:???0267無謀者
02/02/02 20:06ID:???尻取りスレにでも使っといてください
0268うぇw
02/02/03 01:02ID:RmsIRY/Lhttp://www.kgy999.net/e.html
女子小学6年生レイプ画像
http://www.kgy999.net/imc/434233455231.jpg
女子小学6年生レイプ動画
http://www.kgy999.net/imc/94324.mpeg
ertret
r r
et rt
0269名無しさん@お腹いっぱい。
02/02/03 13:52ID:???0270傍観者
02/02/03 16:59ID:???近しいので、実用的な読み物としてヲチしてます
…ま、目先の仕事優先は仕方なし…かな?
0271名無しさん@お腹いっぱい。
02/02/03 20:00ID:???あんたさ、折角なんとかマトナなスレになりつつあったのに、
尻取りスレにでも、は無いだろう。
一体どういう神経してるんだよ。
それじゃ、始めるぞ。
「パール」
0272名無しさん@お腹いっぱい。
02/02/03 20:58ID:???まったくだプンプン。
早く帰ってくるのみんな待ってるのに。
「ルビー」
0273名無しさん@お腹いっぱい。
02/02/03 21:01ID:???「ビール」
0274名無しさん@お腹いっぱい。
02/02/03 22:54ID:???0275名無しさん@お腹いっぱい。
02/02/03 23:07ID:???しりとり侍かよ!
フォッフォ
「ビール」
0276名無しさん@お腹いっぱい。
02/02/04 08:31ID:???ttp://cgitest.s7.xrea.com/cart.txt
これの再アップだけでもして欲しい・・・
0277名無しさん@お腹いっぱい。
02/02/04 16:55ID:???俺も君と同じようにPerl馬鹿だった。
でもさっきPHPの本を軽く読んでみた。
馬鹿にならんくらい簡単だぞ、これくらいできるようになった君ならあっという間に
完成できるかもしれない。
PHP4をお勧めするよ、マジで。
こんなにセッション管理が楽だとは思わなかったよ。
0278無謀者
02/02/04 18:52ID:???お待たせしました。ウプ完了です。
最初のに送料計算用のスクリプトを加えようとしてるんですが、今のところ機能
してません。しばらくいじってなかったらすっかり忘れてるし(w
>>271-275
ご協力ありがとうございます。てか、一瞬で終わってるな・・・・
>277
PHPは最初の方でも勧めてくれた方がいたような・・・・
とりあえず現状最もデファクトスタンダードに近いと思われるという事で
Perlから始めて見ました。まぁ、こんなタラタラやってるうちにPHP全盛って事に
なったりは・・・・しませんよね?
というわけでまたボチボチ続きを始めますのでよろしくお願いします・・・(何をだ?)
0279無謀者
02/02/04 22:26ID:???未だに微妙に文字化けするのがチョイ鬱・・・・
文字コードをフォームのHTMLも含めて見直してみます。
0280名無しさん@お腹いっぱい。
02/02/04 23:06ID:???0281名無しさん@お腹いっぱい。
02/02/04 23:44ID:???HTTPヘッダのところでも指定した方が良いよ
0282名無しさん@お腹いっぱい。
02/02/05 13:50ID:???そうだね、現状ではサーバを製作者側で指定できない限りはPHPはまだ使えないね。
シカーシPHPも4になってほぼ機能的に出尽くした感があるし、ぼつぼつ標準設置の
レン鯖増えてきたし、WebアプリののRADとして、Perlとはすみわけしながら普及
しそうな勢いがあるな。
ところで設置URIは、上記と同じ
ttp://cgitest.s7.xrea.com/cgi-bin/shop4.htm
でいいのかえ?最終確認画面で文字化けしちょるようだが
0283名無しさん@お腹いっぱい。
02/02/05 15:21ID:???はよ完成して動くことを祈る。
0284名無しさん@お腹いっぱい。
02/02/05 17:43ID:???0285無謀者
02/02/05 22:33ID:???"content-type: text/html;charset=EUC-JP\n\n";
で良いんでしょうか?ここで言われたので、ぐぐるで検索掛けてみたら
上のような書き方がちらほらあったので。ただ「文字コード、charset」とかで検索すると
ほとんどが<META>タグの記述方法になってるので、いまいちこれでいいのが自信が無い・・・
いまさらながら気が付いたんですが、どの本読んでもhtmlヘッダ
に関しては
"content-type: text/html\n\n"
を書けとしか書いてないんですよね。散々文字コードの事は書いてあってjcode使って
コンバートしろとかは書いてあるのに・・・・
0286無謀者
02/02/05 22:34ID:???間に合いませんでした。
0287名無しさん@お腹いっぱい。
02/02/05 23:04ID:???あってる。
ただ、;のあとに半角スペース入れた方がいいのかな
意味あるのかは知らないけど、みんなやってるということで
print "Content-type: text/html; charset=euc-jp\n\n";
でもmetaにも書いてくれると親切だ。
0288無謀者
02/02/05 23:15ID:???しかし、なんで入門書にこれが書いて無いんですかね?
文字コードの自動判定なんてまともに出来ないヴァカブラウザがゴロゴロしていて
純粋なHTMLはS-JISで書くのが一般的(?)なのに・・・
いくらフォームデータエンコードしても、CGI内のHTML表示部分で
ちゃんと指定しとかなきゃ行ったり来たりしてる間にブラウザも迷うっちゅねん!
と思うのですが・・・・
ところで、皆さんはCGI内のHTML部にMETAとか<HTML></HTML>書くときに
何処に書いたらいいかわからなくなる事無いですか?
一箇所で完結すれば良いんですがHTML出力を前半と後半をサブルーチンで
分けたり、使いまわしたりする時に、</html>は何処に入れるんだ?
とかここは<html>はいるのか?みたいに
0289名無しさん@お腹いっぱい。
02/02/06 00:26ID:???そうだよ両方書くんでちゅ。
それが当たり前でちゅ。
ていうかここで2回も書いたんでちゅ。
ヘッダ出力とフッタ(は要らんかもしれんが)を
サブルーチンとかモジュール化したら?
CGI.pmでもヘッダ出力できるけど、
日本語の場合、文字コードの指定が必要だから
ジブソで用意しました。
0290名無しさん@お腹いっぱい。
02/02/06 00:33ID:???うろ覚えだけど、最近の CGI.pmなら
文字コードやContent-Typeとかも
指定できた気がする
0291sage
02/02/06 10:33ID:???後は289のいうとうりモジュール化することを進めるよ!
あとでつかいまわしができるよ!
0292名無しさん@お腹いっぱい。
02/02/06 10:48ID:???#!/usr/bin/perl
use CGI;
$query = new CGI;
print $query->header(-charset=>'Shift_JIS');
おいらは最初にヘッダを出力しちゃってそれぞれの出力終了時にフッダの
サブルーチンに飛ばしてる。
0293無謀者
02/02/06 16:55ID:???>ていうかここで2回も書いたんでちゅ。
そうでしたね。いや、読んではいたんですが、どうしても>>285の方法が
はっきり自信持てなかったもんで・・・・
>CGI.pm
その辺の事は今後順次勉強していきたいと思います。とりあえずはできるだけ
自分で書くというのも勉強になりますので・・・
>モジュール化
プログラム経験が無いのでモジュールと言うものの概念がいまいちワカランのですが
「良く使うものをサブルーチンにして、それを別ファイルに纏めておく」と言うことで
良いんでしょうか?
>>291
ほんとにここでスレ立ててよかったです。本とかWEB情報だけじゃこの短期間ではとてもじゃ
無いけどここまで出来なかったと思います。
調子に乗って「ド素人のド素人のためのCGI入門」のHPでも立ち上げようかな・・とか思ったりしてます(w
ここまでやってきて思ったのは「初心者用」とか「入門」といううたい文句の本やWEBの説明も
所詮(失礼ですが)プログラマーの方が書いてるので、「ド素人が如何に無知か」という事がいまいち
理解されて無いようなので・・・
0294名無しさん@お腹いっぱい。
02/02/06 17:06ID:???print $query->end_html
これで終れる
0295259
02/02/06 20:31ID:???>と言うことで良いんでしょうか?
サブルーチンをファイルにしてメインからrequireするあたりがモジュール化の第一歩。
そこから名前空間の概念覚えて、別ファイルのほうpackage宣言してみて、って
少しづつ覚えていけばいいと思うよ。(その先がまだ長いんだけれど‥‥)
いきなり.pmモジュールなんていうとワケわかんなくなるからね。
で、商品ページの方はどうよ?
0296無謀者
02/02/06 21:21ID:???なるほど、そんな単純なものではなさそうですね>モジュール
>商品ページ
いかんせん仕事の都合で間があいちゃったんで全然出来てません。設計書を作ってる
最中だったんですが、今読み返してみるとようワカラン(w
もう一度1からやり直しです。最初はフォームからHTML生成しちゃおうと思ったんですが、
在庫数をカウントしたいので、cgiからdatファイルから読み出してHTML表示させるしか無さそう・・・
HTMLにHiddenで入れようとも思ったのですが、商品が減る度にHTML書き直させなきゃならなそうだし。
ただ、全てをCGIにやらせると鯖の負荷も高くなりますよね?どうしたものか・・・・
0297259
02/02/07 15:02ID:???open (READ,$filename);
@data = <READ>;
close (READ);
#@dataに対して必要な処理
open (WRITE,">$filename");
print WRITE @data;
close (WRITE);
式でやると、.datの件数が増えると負荷もかかるしメモリも喰う。
これは鯖屋さんに嫌われる。(警告が来たり、いきなり垢止められたりする)
open (READ,$filename);
open (WRITE,">$tempfile");
while($line = <READ>){
#$lineに対して必要な処理
print WRITE $line;
};
close (WRITE);
close (READ);
rename ($tempfile, filename);
式でやるなら、1セッション中に(検索と在庫デクリメント程度であれば)
複数回処理かけても大した負荷(プロセス時間)にはならないし、メモリも
喰わない。この方式で数百〜1万件(行)程度の処理しつつHTMLを吐かせる
CGIを一般の複数件のレン鯖に置いているけれど、苦情は来たことがないぞ。
この場合、.datはTABまたはSPACE区切りテキストがいいな。
一般配布のCGIにはカンマ区切りが多いけど、UNIX育ちのPerlのsplitは/\t/
や/\s+/に対し最適化されているから、行数が大きくなったときの処理時間の
差は結構馬鹿にならない。
カンマ区切りだと例外処理がウザい(書き込み時にデータにカンマがないか
チェックするか、Excelなcsvにすべくクオート処理せねばならん。後者の場
合、単純にsplit出来なくなる)しね。
プチECとしてはデータ内に半角スペースも含まれるだろうから、TAB区切りが
一番いいだろう。
0298無謀者
02/02/08 21:13ID:VrHm3ZfYフォームが
<input type="password" name="pass" size="10">
<input type="hidden" name="mode" value="login" >
になっていて、
&ReadParse(*form);
$pass=abc;
$fpass=$form{'pass'};
if ($fpass eq $pass){
#−−−メニュ画面ーーーーー#
}
ってなってるんですが、後の(他の)処理の中でその処理終了後
メニューに飛ばしたいんです。hogehoge.cgiになんかくっつけて呼び出す(?pass=とか?)
ような感じになるんじゃないか?というところまではたどり着いたんですが・・・・・
0299名無しさん@お腹いっぱい。
02/02/09 09:04ID:???メニューに飛ばす?
なんか意味わかんねぇ
0300無謀者
02/02/09 11:30ID:???フォーム(HTML)からパスワード入力>menu画面(menu.cgi)>データ入力
>データ入力後refreshでもう一度menu画面に戻る。
てのをやりたいんですが、戻り先をmenu.cgiにするのにパスワード
を渡す方法をがわからないんです。そもそもFORMのinputで渡すような項目を
Formを使わずに渡す方法ってどんなのがあるんでしょう?
0301名無しさん@お腹いっぱい。
02/02/09 13:35ID:???方法としてアドレスに埋め込む(リフレッシュ先のアドレスに仕込む)
hoge.com/menu.cgi?id=hoge&pass=hoge
HIDDENを使う
データ入力の度に
<INPUT HIDDEN NAME=id VALUE=hoge><INPUT HIDDEN NAME=pass VALUE=hoge>
これを必ず仕込んでおく
なお、どちらの方法でもmenu画面で逐次パラメータを取得して次に渡す必要がある
的外れの返答かな?
0302名無しさん@お腹いっぱい。
02/02/09 13:36ID:???当然ながらHIDDENを使うときはFORMタグを必要としますからね。
0303無謀者
02/02/09 13:50ID:???つまり、通常フォームから
<input type="password" name="pass" size="10">
<input type="hidden" name="mode" value="login" >
と言う内容をsubmitボタンを押すことにより送信するんですが、
その内容をフォームを使わずに渡す方法を知りたかったんです。
>>301の説明だと
menu.cgi?mode=login?pass=123
とかで良いんですかね?
でスクリプト中で$loginpass=123とか指定しておけば、cgi内から上記のように
リンクかける場合は
menu.cgi?mode=login?pass=$loginpass
としておけば大丈夫って事ですよね?
とりあえずやってみます。
0304名無しさん@お腹いっぱい。
02/02/09 14:13ID:???0305名無しさん@お腹いっぱい。
02/02/09 14:14ID:2AUefyPUそのとおり。
あと老婆心ながらHTMLのタグを書くときに""(クオーテーション)はいらない。
""がいるのはスペースが含まれる場合のみ。
""を省略するだけで結構処理スピードがあがるよ。
0306無謀者
02/02/09 14:26ID:???うまくいきました。
ちなみにこれと同じ方法を使ってFORM内の
Submitボタンを画像とかに置き換える事は可能なんでしょうか?
ボタンの変わりに画像貼ってそれのリンク先をmenu.cgi?neme=submit
ってやるとsubmitボタンとして動作します?
0307名無しさん@お腹いっぱい。
02/02/09 14:58ID:???<input>タグでできる。
0308名無しさん@お腹いっぱい。
02/02/09 18:56ID:???0309無謀者
02/02/09 19:23ID:???商品ページ作成部分が若干出来たのでウプしました。
ttp://cgitest.s7.xrea.com/cgi-bin/admin.htm
から入れます。パスワードは「123」です。
今のところ、商品カテゴリーの作成と商品の追加しか動きません。
カテゴリーを追加した後に商品を追加する事になります。既存のカテゴリーは
「商品群1」と「商品群2」です。
商品群1の内容は
ttp://cgitest.s7.xrea.com/cgi-bin/main.cgi?mode=show&fname=test
で
商品群2の内容は
ttp://cgitest.s7.xrea.com/cgi-bin/main.cgi?mode=show&fname=test2
で見られます。
カテゴリーを新規作成の際のファイル名は拡張子無しで。新しく作ったカテゴリーの
内容を見るときは
ttp://cgitest.s7.xrea.com/cgi-bin/main.cgi?mode=show&fname=”作成時につけたファイル名”
できるはずです。
0310無謀者
02/02/09 20:31ID:???「,」で区切って入力してもらって、そこからセレクトボックス生成させる
のを今作ってます。
0311名無しさん@お腹いっぱい。
02/02/10 16:31ID:???URIでパスワード指定やっちゃうと、認証もクソもないぜ。
URIがバレた時点でソッコーで改ざんされっぞ。
googleツールバーの高機能版では閲覧中のURI自動通知されちまうしな。
「登録しました」のページに「メニューに戻る」ボタンをつけて、
hidden渡しじゃだめなんかい?
どうしてもrefreshでやりたいなら、refererとってCGIと認証ページからの
アクセスのみ許可するとかやってやんねーと。
0312無謀者
02/02/10 20:00ID:???確かにそれは思ったんですけど、一応pass入れたあとの管理者用画面だから
大丈夫かな・・・と考えてたんですが・・・・・
hiddenで入れてもソース見ればそのままpassが見えちゃうわけですし・・・・
0313311
02/02/10 23:43ID:???postで(formから)passが入ってこないときadmin.cgiがエラーメッセージ吐いて
終了するようにすりゃいいんだよ。したら、URIがバレても簡単にはアクセスでき
ないだろ?
#!/usr/bin/perl
require 'cgi-lib.pl';
my $method=$ENV{REQUEST_METHOD};
$pass='123';
&ReadParse(*form);
if ($form{'pass'} ne $pass or $method ne 'post'){ #passミスマッチとGET拒否
print "Content-type: text/plain\n\nForbidden.";
exit;
}
#──以下処理。formを吐く場合は必ず
#<input type=hidden name=pass value=$pass>を仕込む
GET全拒否しちまってるけど、たとえば、こうよ。
>hiddenで入れてもソース見ればそのままpassが見えちゃうわけですし・・・・
上みたいな処置しときゃadmin.cgiにマトモにソースを吐かせるのに絶対にpostで
pass渡さなきゃいけねーから、過信は禁物だがpassを知らない限りソースも見れん
ワケよ。admin.htmにはpass書くわけじゃねーんだしさ。
#漏れはCGI.pm詳しくないんだが、CGI.pmでpostとgetの読み分けは出来んのかなあ。
#詳しい奴フォロータノム
後、>>311でも書いたがrefererとって
ttp://cgitest.s7.xrea.com/cgi-bin/admin.cgi
ttp://cgitest.s7.xrea.com/cgi-bin/admin.htm
以外からのアクセスは弾いちまえばいいんだよ。
0314無謀者
02/02/11 02:03ID:???登録済み商品の修正が出来るようになりました。
>商品登録テストしてくれて人
今のところ、文字置換やエラー処理全然いれて無いので、コメントのところで
改行入れるたり、新規ページ作成時に、ファイル名入れないと、データボロボロになります(汗
明日(今日か・・)必要フォーム項目未記入時のエラー処理と、改行その他、文字列の
置換処理を出来るようにします。
>>311=313
なるほど・・・・と入っても、いまいち管理用画面でのその辺のセキュリティの必要性が
理解できて無いんですが・・・・・
どっちにrefererとって弾く事だけはやっておいた方がよさそうですね。
0315無謀者
02/02/11 02:16ID:???@data=($no,$hoge,$mona,$gik)
$line=join("\t",@data);
open(FH,$file);
@logdata=<FH>;
close(FH);
open(WRITE,">$file");
print WRITE $line;
print WRITE @logdata;
close(WRITE);
として、新しいものが上に来るようにしました。
で商品修正時にココの前で教えてもらった方法2の応用で
@newdata=($no,$hoge,$mona,$gik);
$line=join("\t",@data);
open(IN,"$file");
open(TMP,">$temp");
print TMP "$line;
while(<IN>){
my @cell = split/\t/;
if($cell[0] ne "$no"){
print TMP;
}
}
rename($temp,$file)
ってやってるんですが、この方法だと、修正したファイルがデータの一番上(一行目)に
来ちゃうんですよね(そういう風にしてるんですが)
これって、たとえば4行目のデータだったら、また同じ所にかき戻す方法ってどうやれば良いんですか?
if($cell[0] ne "$no"){
print TMP;
の後に
if($cell[0] eq "$no"){
printTMP $line;
でうまくいかなかったです。書く位置がまずかったんでしょうか?
0316297(=259)
02/02/11 03:41ID:???なら、
while(<IN>){
my @cell = split/\t/;
$_ = $line if $cell[0] == $no;
print TMP;
}
で数値評価したらどうかな?
なんとなくだけど、$cell[0]か$noに空白とか含まれてそうだったんで。
0317無謀者
02/02/11 18:26ID:???うまくいきました。ありがとうございます<IN>
で変数が$_に入ってるってのがすっかり頭から飛んでました・・
ところで、正規表現なんですが、たとえば$priceに半角数字以外(「,」とか)が入ってた場合に
エラーを表示させるのって
if ($price eq ~/\D/){
print "価格はカンマ無しの半角数字で入力してください";
}
で良いんですよね?
0318名無しさん@お腹いっぱい。
02/02/11 22:44ID:+mlK3wYT全然違う。検索は $scalor =~ /$hoge/; だぞ。
if ($price =~ /\D/) {
print "価格はカンマ無しの半角数字で入力してください";
}
まあがんばれ。
0319無謀者
02/02/11 23:18ID:???0320名無しさん@お腹いっぱい。
02/02/11 23:24ID:???\Dは数字以外じゃない?
http://tohoho.wakusei.ne.jp/wwwperl1.htm#Expr
0321無謀者
02/02/11 23:28ID:???だから
$price=~/\D/;
だと「$priceに数字以外のものが含まれていれば」
って事になりますよね?
0322名無しさん@お腹いっぱい。
02/02/11 23:32ID:???0323無謀者
02/02/11 23:34ID:???もう一度ソース見直してみます。
0324名無しさん@お腹いっぱい。
02/02/11 23:35ID:???そっちの方がユーザーライクだと思うが。
$price =~ tr/0-9//cd;
0325名無しさん@お腹いっぱい。
02/02/11 23:38ID:???スペースも渡されてるとか
0326無謀者
02/02/11 23:40ID:???やっちゃおうと思ったので。
0327無謀者
02/02/11 23:44ID:???そう思って
[\D\s\t]とかもやってみたんですが・・・ダメ
0328名無しさん@お腹いっぱい。
02/02/11 23:48ID:???CGI::Carpとかでハンドルしてるなら warnや dieで見てもいいけど。
0329名無しさん@お腹いっぱい。
02/02/11 23:52ID:pHWWFybw0330297
02/02/11 23:52ID:???書いてるから、ちょっと心配してるんだな。
> で変数が$_に入ってるってのがすっかり頭から飛んでました・・
慣れると便利なんだよ、デフォルト変数$_。
はまると怖いけどね。
で、正規表現検索は相手が文字列でも
if ($price =~ /\D/)・・・
だよ。
0331無謀者
02/02/11 23:52ID:???if ($price eq ""){
print"error"
}
・
・
#その他変数の未記入チェック
・
・
ってやってから上の処理やってるんですけど、その辺は関係あります?
一応、未記入のエラーはちゃんと表示されます。
で、上記の検索を書くと、数値だろうがなんだろうが弾かれちゃう・・・
0332無謀者
02/02/11 23:59ID:???if ($price =~ /\D/){
print "$price";
}
ってやったら、入力したのと違う数字が出てきた・・・・・
この数字どっから来たんだろ???
198000って入力したのに429467294って・・・たかどんな数字入れても
おんなじ数字が吐き出されてる????何でだ?
ちなみに置換処理を無くして実行すると、ファイルにはちゃんと入力した
数字が書き込まれてます。
0333297
02/02/12 00:02ID:???うわ、とっくに話題が過ぎ去ってやがる。リフレ忘れた。鬱打
&jcode::tr(\$price, '0-9', '0-9'); #全角数字を半角に変換
if ($price !~ /0-9/){
print "価格はカンマ無しの半角数字で入力してください";
}
あたりではどうかな?
0334名無しさん@お腹いっぱい。
02/02/12 00:06ID:r54lTbCXという事は、その処理以前にどこかで$priceに値が代入されてるんだよ。
探しなさい。
0335無謀者
02/02/12 00:07ID:???解決したっぽいです・・・
どうやら、使ってるエディタにバグがあるらしく、上書き保存するとなぜか
s-jisで保存されてたっぽい、のが原因みたいです。(設定はEUCにしてるのですが)
お騒がせして本当に申し訳ありませんでした・・・・m(__)m
エディタ変えようかな・・・・・
0336名無しさん@お腹いっぱい。
02/02/12 00:09ID:r54lTbCX俺はいまだにメモ帳使ってるぞ。メモ帳最強。
0337無謀者
02/02/12 00:12ID:???>&jcode::tr(\$price, '0-9', '0-9'); #全角数字を半角に変換
jcodeでこんな事も出来るんですね。フォームデータ受け取り時に
h2zでカタカナは全部置換させてるんですが、そこで数値にしなければならない
変数も全部変換掛けといた方がよさそうですね。
とりあえずご迷惑したお詫びに町内10周走ってきます。
0338無謀者
02/02/12 01:01ID:???新規ページの追加、商品の登録、編集、削除
までできるようになりました。また
「簡易商品ページメニュー」を作り、そこから商品ページにアクセス
出来るようにしました。(管理画面の中)
ココに表示されるURLをコピペすれば、使う人は、メニューページを
自由に作れるのでは無いかと・・・・
ttp://cgitest.s7.xrea.com/cgi-bin/admin.htm
パスワードは123です。
ある程度のエラー処理と文字列置換は入れたつもりなのですが・・・・
0339名無しさん@お腹いっぱい。
02/02/12 02:46ID:???適当に弄ってれば誰でも使えそうなカンジですね。
って、弄ってみました。
感想:
どのページからでも管理画面に戻れると良いかなあ。
(ページ作る時に何回も戻ったので…)
0340311
02/02/12 05:58ID:???>いまいち管理用画面でのその辺のセキュリティの必要性が理解できて無いんですが・・・・・
だーかーらー、http://うんちゃらかんちゃら/admin.cgi?mode=login&pass=xxxって
URIがばれちまったらイッパツで商品ページ改ざんされちゃうだろっていってんの。
PasswordをGETに含めるのはヤバいんだって。直リンオッケーだしな。
知り合いとはいえ金絡んでやってんだろ?しっかりしろよ。
商品価格書き換えられたところに注文とか去れちまったら大損害だろ?
URIバレた瞬間にPasswordもってかれちまうんだから、ほんとはPOSTがいいんだけどな、
せめてリファラチェック(GETメソッドはCGI自身からのアクセスみ許可)と、
本稼動のときは変な名前のディレクトリ作って、cgi本体の名前からは予想も出来ねー
よーな名前でrobotよけのMETAつけた認証ページ設置するぐらいの対策はぐらいはしとけよ。
0341名無しさん@お腹いっぱい。
02/02/12 06:25ID:???robotよけのメタは、誰も見ていないです。きっと。
0342無謀者
02/02/12 13:16ID:???詳しい説明ありがとうございます。リフレッシュを止めて、フォームボタンで
hiddenを渡し、リファラチェックも入れるようにします。
ところで、一つのサブミットボタンで二つ以上のアクションを指定する事って
出来るんでしょうか?たとえば
<form method=post action=hoge.cgi>
<form method=post action=hage.cgi>
<input ...
<input....
<input type=submit value=OK>
</form>
</form>
とかやっておけば、submit押した時に、両方にフォームの内容が送られるんでしょうか?
■ このスレッドは過去ログ倉庫に格納されています