初心者がソースを貼って上級者が採点するスレッド
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/12/29 19:11ID:???それを上級者が採点、手直しをし、初心者のスキルアップを手助けするという趣旨のスレです。
ソースはコピペでもいいですが、長い場合は、あぷろだを使ったほうがいいかも。
あぷろだ:http://www.patipati.com/upload/upload.cgi
※必ず採点してもらえるわけではありません。気長に待ちましょう。
※採点してくれる人への感謝の気持ちをもちましょう。
0002nobodyさん
02/12/29 19:19ID:T68uzibZ日記サイト更新のためのスクリプトを書いてみたのですが、
パスワードのセキュリティなどがかなりヘタレだと自覚しています。
以下のスクリプトでファイルに書き込み、
read.cgiというファイルを読み込むCGIでdatを読み込んでいます。
#!/usr/local/bin/perl
require "./cgi-lib.pl";
require "./jcode.pl";
ReadParse();
#変数に入れる
$comment = $in{"comment"};
$pass = $in{"pass"};
jcode::convert(\$name,"euc");
jcode::convert(\$comment,"euc");
$datefile = "./date/visitor.dat";
$tempfile = "./date/temp";
umask 0;
0003nobodyさん
02/12/29 19:20ID:T68uzibZif ( $pass eq "012345" ){
#ファイルをオープン
open(TMP,">> $tempfile");
print TMP "<table border=\"1\" width=\"555\" bordercolor=\"#E9EAFE\" bordercolorlight=\"#FFFFFF\" bgcolor=\"#FFFFFF\"><tr><td>$comment</td></tr></table><br>\n";
open(DATE, "< $datefile");
while( <DATE> ){
print TMP $_;
}
close(DATE);
close(TMP);
rename($tempfile,$datefile);
print "Content-type: text/html\n\n";
print "<HTML>\n<HEAD>\n<TITLE>更新</TITLE>\n</HEAD>\n";
print "<BODY>\n<a href=\"./read.cgi\">更新されました</a>\n";
}
else{
print "Content-type: text/html\n\n";
print "<HTML>\n<HEAD>\n<TITLE>エラー</TITLE>\n</HEAD>\n";
print "<BODY>\n<a href=\"./list.html\">パスワードが違います!</a>\n";
}
print "</BODY>\n</HTML>";
__END__
0004nobodyさん
02/12/29 19:43ID:???システムコールの戻り値は必ずチェックせよ
システムコールの戻り値は必ずチェックせよ
00072 ◆j0Oon93KwY
02/12/29 20:00ID:???調べてやってみます・・・。
open (TMP , "$tempfile") or print "can't open tempfile $!";
みたいな感じですか?
>>6
$crypted = crypt("012345" ,"sa");
if (crypted($pass,$crypted) ne $crypted{
print "パスワードが違います!";
}
__
こんな感じでよろしいでしょうか?
0008nobodyさん
02/12/29 20:05ID:???いや 別CGI等でcryptしたやつと一致するかどうか
生パスワードは一切CGIに記述しない
例えば sa でハッシュ化したやつがsaj0Oon93KwY だったら
&error("パスワードおかしくない?") if crypt($pass,sa) ne "saj0Oon93KwY")
こんな感じかな?
とりあえずソース見られてもパスワードは知られない
書き換えられたら元も子もないけどね
0009nobodyさん
02/12/29 20:09ID:???&error("パスワードおかしくない?") if (crypt($pass,sa) ne "saj0Oon93KwY");
未だにCGIがnobody権限で動いてる鯖あるからそういうのには有効かと
0010nobodyさん
02/12/29 20:39ID:???そのパスワードがログを編集するためだけにあるのなら、あまり効果がなさそうだけどね。
パスワードがわからなくてもログファイルを直接書き換えればよいだけだから。
00132 ◆j0Oon93KwY
02/12/29 21:18ID:???お返事ありがとうございます。
少し本題からは離れるのですが、nobody権限で動いているサーバ以外では、
(ソースをのぞくことができないサーバ?)
パスワードを暗号化しないでもパスを知られる危険は少ない、
ということでしょうか?(^_^;)
0014Not 8
02/12/29 21:25ID:???>>8のいうnobody権限で動いていないサーバとはsuEXECが有効なサーバだと思う。
プログラムの所有者の権限で動かすのなら、otherへ与える権限はそのプログラムのおかれているディレクトリへの実行権限だけでよいので管理者以外に読まれる心配はない。
ということかな(^_^;)
00152 ◆j0Oon93KwY
02/12/29 22:08ID:???なるほどです(^_^;)
(suEXECについて全然わからないのでいろいろ検索してみたけど
今だ理解にはいたらず・・・。)
管理者以外にソースを読まれる可能性がないサーバだったら
暗号化をしなくても読まれないってことですね。
あえてやるんだったら
#passwordの設定
$crypted = crypt("012345" , "sa");
if ( crypt($pass , "sa" ) eq $crypted ){
・・・とするとちゃんと動作したようです。
ありがとうございました!
00182 ◆j0Oon93KwY
02/12/29 23:06ID:???crypt関数の練習だと思ってやってみました(^_^;)
00192 ◆j0Oon93KwY
02/12/29 23:28ID:T68uzibZとりあえずdatを読めるだけ、ということで書いてみました。
これからは最新10件だけ表示される、とかやりたいのですが、
まだまだ勉強不足です。(^_^;)
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "<HTML>\n<HEAD>\n";
print "<TITLE>read.cgi</TITLE>\n";
print "</HEAD>\n<BODY><body bgcolor=\"#E9EAFE\">\n";
print "<DL>\n";
$file = "./date/visitor.dat";
open ( OUT,"< $file");
@date = <OUT>;
foreach (@date){
print "$_<br>";
}
close(OUT);
print "</DL>\n";
print "</div>\n</BODY>\n</HTML>\n";
__END__
0020nobodyさん
02/12/29 23:31ID:???PERL初心者スレのほうがいいんじゃない?
00211
02/12/29 23:40ID:???初心者スレで長ったらしいソースを貼って「みてください!」
というのもうざいから、ここはソース貼って
「ここ違うよ」「ここはこうしたほうがいい」というスレのつもりです。
別に質問がなくても、貼ってみてアドバイスがもらえるという。
完璧だ!と思ってる自分のソースでも初心者がおかしやすい間違えとか、
不適切なものとか、自分では気づかないのもあるだろうし、
そういうのを見つけたり見つけられたりしてスキルアップを目指すスレというか・・・。
0022nobodyさん
02/12/29 23:49ID:???002422
02/12/29 23:59ID:???2ばかりに目が逝ってきづかんかったわ(藁
0025nobodyさん
02/12/30 00:21ID:???0026山崎渉
03/01/15 13:39ID:???■ このスレッドは過去ログ倉庫に格納されています