お世話になっております。
ただいまperlを学習書を用いて勉強しているのですが、学習書のサンプルコードはレンタルサーバーにアップロードして動くのですが、僕が入力して作成したperlの実行ファイルはレンタルサーバーにアップロードして、ページを表示させると、多分途中まで動いているのではないかと思いますが、HTMLを吐く部分でソースがそのまま表示されてしまいます。ちなみにこの僕が自分で作成した実行ファイルですが、レンタルサーバーではなく、自分のパソコンのLinux上ではきちんとHTMLが表示されます。
改行コードの問題かとも思いましたので、一応エディタで改行コードをLF(UNIX)で保存して、バイナリモードでアップロードしました。しかし相変わらず、ソースが表示されてしまいます。
このソースが表示されてしまうファイル名が「6-4.cgi」という名前ですが、レンタルサーバー上でこのファイルと同一ディレクトリにある「6-3.cgi」という6-4.cgiより少し、コードが少ないcgiファイルは実行できます。
パーミッションの問題かと思いましたのでパーミッションをレンタルサーバーが推奨している値に変更しても駄目でした。
以下にコードの内容を載せます。
perl
1#!/usr/bin/perl 2# 僕が本を見ながら手で入力したコードでファイル名は6-4.cgi 3 4# ===================== ユーザー設定 ============== 5$CHARSET = 'UTF-8'; #文字コード 6$USERFILE = './users.dat'; #ユーザファイル 7$ADMINPASS = 'goma'; # 管理パスワード 8 9# ===================== メインプログラム ========== 10loadFormdata(); 11 12if(not exists $FORM{'adminpass'}){ 13printGatePage(); 14} 15elsif($FORM{'adminpass'} eq $ADMINPASS){ 16 17loadUserfile(); 18 19if($FORM{"mode"} eq "adduser"){ 20addUser(); 21} 22elsif($FORM{'mode'} eq "deluser") { 23deleteUser(); 24} 25printAdminPage(); 26} 27else{ 28printErrorPage("管理パスワードが違います。"); 29} 30exit; 31 32#======================= ユーザー追加 ============== 33sub addUser 34{ 35 my ($name, $pass) = ($FORM{'user'}, $FORM{'pass'}); 36 my ($salt, $saltset, $n1, $n2); 37 38 if(exists $USERS{$name}) { 39 printErrorPage("そのユーザ名はすでに存在しています。1"); 40 } 41 $USERS{$name} = $pass; 42 43 # パスワードの暗号化 44 $saltset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./"; 45 $n1 = int(rand 64); 46 $n2 = ($n1 + time) % 64; 47 $salt = substr($saltset, $n1, 1) . substr($saltset, $n2, 1); 48 $pass = crypt($pass, $salt); 49 50 # ユーザーファイル書き込み 51 open(FILE, ">>$USERFILE") 52 or printErrorPage("ユーザーファイルが開けません。1"); 53 print FILE "$name:$pass\n"; 54 close(FILE); 55} 56 57#=========================== ユーザー削除 ============== 58sub deleteUser 59{ 60 my ($key, $name); 61 foreach $key (keys %FORM) { 62 if($key =~ /del_(.+)/) { 63 delete $USERS{$1}; 64 } 65 } 66 67 # ユーザーファイル書き込み 68 open(FILE, ">$USERFILE") 69 or printErrorPage("ユーザーファイルが開けません。2"); 70 foreach $name (keys %USERS) { 71 print FILE "$name:$USERS{$name}\n"; 72 } 73 close(FILE); 74} 75 76# ===================== ユーザーファイル読み込み == 77sub loadUserfile 78{ 79 my ($ln, $name, $pass); 80 81 open(FILE, "<$USERFILE") 82 or printErrorPage("ユーザーファイルが開けません。3"); 83 while($ln = <FILE>) { 84 chomp $ln; 85 ($name, $pass) = split(/:/, $ln); 86 $USERS{$name} = $pass; 87 } 88 close(FILE); 89} 90#======================= 管理パスワードページ出力 == 91sub printGatePage 92{ 93# print "aaa"; 94 print <<END; 95 96Content-type: text/html; 97 98<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 99<html> 100<head><title>ゆーざかんり</title></head> 101<body> 102<h1>ユーザ管理</h1> 103<form acction="aaa" method="POST"> 104管理パスワード:<input type="password" name="adminpass"><br> 105<input type="submit" value="決定"> 106</form> 107</body> 108</html> 109END 110} 111 112#======================= ユーザ管理ページ出力 ====== 113sub printAdminPage 114{ 115 my $name; 116 117 print <<END; 118Content-type: text/html; charset=$CHARSET 119 120<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 121<html> 122<head><title>ゆーざかんり</title></head> 123<body> 124<h1>ユーザ管理</h1> 125<h2>新規ユーザ登録</h2> 126<form action="$ENV{'SCRIPT_NAME'}" method="POST"> 127ユーザ名:<input type="text" name="user"><br> 128パスワード:<input type="password" name="pass"><br> 129<input type="hidden" name="mode" value="adduser"> 130<input type="hidden" name="adminpass" value="$ADMINPASS"> 131<input type="submit" value="登録する"> 132</form> 133<hr> 134<h2>ユーザ削除</h2> 135<form action="$ENV{'SCRIPT_NAME'}" method="POST"> 136<table border="1"> 137<tr><th>削除チェック</th><th>ユーザ名</th></tr> 138END 139 140foreach $name (sort keys %USERS) { 141 print "<tr><td><input type=\"checkbox\" name=\"del_$name\"></td><td>$name</td></tr>\n"; 142} 143 144print <<END; 145</table> 146<input type="hidden" name="mode" value="deluser"> 147<input type="hidden" name="adminpass" value="$ADMINPASS"> 148<input type="submit" value="削除する"> 149</form> 150</body> 151</html> 152END 153} 154 155#============================エラーページ出力======== 156sub printErrorPage 157{ 158 print <<END; 159Content-type: text/html; charset=$CHARSET 160 161<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 162<html> 163<head><title>ゆーざかんり</title></head> 164<body> 165<h1>エラー</h1> 166<p>$_[0]</p> 167</body> 168</html> 169END 170 171 exit; 172} 173 174#========================= フォームデータ取り込み ===== 175sub loadFormdata 176{ 177 my ($query, $pair); 178 179 if($ENV{'REQUEST_METHOD'} eq 'POST') { 180 read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); 181 } 182 else { 183 $query = $ENV{'QUERY_STRING'}; 184 } 185 186 foreach $pair (split(/&/, $query)) { 187 my ($key, $value) = split(/=/, $pair); 188 189 $value =~ tr/+/ /; 190 $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; 191 192 $FORM{$key} = $value; 193 } 194} 195 196コード
次は学習書についてた(実行できた)サンプルコード
perl
1#!/usr/bin/perl 2 3 4#============================ ユーザー設定 ==== 5$CHARSET = 'Shift_JIS'; # 文字コード 6$USERFILE = './users.dat'; # ユーザーファイル 7$ADMINPASS = 'goma'; # 管理パスワード 8 9 10#======================== メインプログラム ==== 11loadFormdata(); 12 13if(not exists $FORM{'adminpass'}) { 14 printGatePage(); 15} 16elsif($FORM{'adminpass'} eq $ADMINPASS) { 17 loadUserfile(); 18 19 if($FORM{"mode"} eq "adduser") { 20 addUser(); 21 } 22 elsif($FORM{'mode'} eq "deluser") { 23 deleteUser(); 24 } 25 printAdminPage(); 26} 27else { 28 printErrorPage("管理パスワードが違います。"); 29} 30exit; 31 32 33#============================ ユーザー追加 ==== 34sub addUser 35{ 36 my ($name, $pass) = ($FORM{'user'}, $FORM{'pass'}); 37 my ($salt, $saltset, $n1, $n2); 38 39 if(exists $USERS{$name}) { 40 printErrorPage("そのユーザー名はすでに存在しています。"); 41 } 42 $USERS{$name} = $pass; 43 44 # パスワードの暗号化 45 $saltset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./"; 46 $n1 = int(rand 64); 47 $n2 = ($n1 + time) % 64; 48 $salt = substr($saltset, $n1, 1) . substr($saltset, $n2, 1); 49# $pass = crypt($pass, $salt); 50 51 # ユーザーファイル書き込み 52 open(FILE, ">>$USERFILE") 53 or printErrorPage("ユーザーファイルが開けません。"); 54 print FILE "$name:$pass\n"; 55 close(FILE); 56} 57 58 59#============================ ユーザー削除 ==== 60sub deleteUser 61{ 62 my ($key, $name); 63 64 foreach $key (keys %FORM) { 65 if($key =~ /del_(.+)/) { 66 delete $USERS{$1}; 67 } 68 } 69 70 # ユーザーファイル書き込み 71 open(FILE, ">$USERFILE") 72 or printErrorPage("ユーザーファイルが開けません。"); 73 foreach $name (keys %USERS) { 74 print FILE "$name:$USERS{$name}\n"; 75 } 76 close(FILE); 77} 78 79 80#================ ユーザーファイル読み込み ==== 81sub loadUserfile 82{ 83 my ($ln, $name, $pass); 84 85 open(FILE, "<$USERFILE") 86 or printErrorPage("ユーザーファイルが開けません。"); 87 while($ln = <FILE>) { 88 chomp $ln; 89 ($name, $pass) = split(/:/, $ln); 90 $USERS{$name} = $pass; 91 } 92 close(FILE); 93} 94 95 96#================ 管理パスワードページ出力 ==== 97sub printGatePage 98{ 99 print <<END; 100Content-type: text/html; charset=$CHARSET 101 102<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 103<html> 104<head><title>ゆーざーかんり</title></head> 105<body> 106<h1>ユーザー管理</h1> 107<form action="$ENV{'SCRIPT_NAME'}" method="POST"> 108管理パスワード:<input type="password" name="adminpass"><br> 109<input type="submit" value="決定"> 110</form> 111</body> 112</html> 113END 114} 115 116 117#================== ユーザー管理ページ出力 ==== 118sub printAdminPage 119{ 120 my $name; 121 122 print <<END; 123Content-type: text/html; charset=$CHARSET 124 125<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 126<html> 127<head><title>ゆーざーかんり</title></head> 128<body> 129<h1>ユーザー管理</h1> 130<h2>新規ユーザー登録</h2> 131<form action="$ENV{'SCRIPT_NAME'}" method="POST"> 132ユーザー名:<input type="text" name="user"><br> 133パスワード:<input type="password" name="pass"><br> 134<input type="hidden" name="mode" value="adduser"> 135<input type="hidden" name="adminpass" value="$ADMINPASS"> 136<input type="submit" value="登録する"> 137</form> 138<hr> 139<h2>ユーザー削除</h2> 140<form action="$ENV{'SCRIPT_NAME'}" method="POST"> 141<table border="1"> 142<tr><th>削除チェック</th><th>ユーザー名</th></tr> 143END 144 145 foreach $name (sort keys %USERS) { 146 print "<tr><td><input type=\"checkbox\" name=\"del_$name\"></td><td>$name</td></tr>\n"; 147 } 148 149 print <<END; 150</table> 151<input type="hidden" name="mode" value="deluser"> 152<input type="hidden" name="adminpass" value="$ADMINPASS"> 153<input type="submit" value="削除する"> 154</form> 155</body> 156</html> 157END 158} 159 160 161#======================== エラーページ出力 ==== 162sub printErrorPage 163{ 164 print <<END; 165Content-type: text/html; charset=$CHARSET 166 167<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 168<html> 169<head><title>ゆーざーかんり</title></head> 170<body> 171<h1>エラー</h1> 172<p>$_[0]</p> 173</body> 174</html> 175END 176 177 exit; 178} 179 180 181#================== フォームデータ取り込み ==== 182sub loadFormdata 183{ 184 my ($query, $pair); 185 186 if($ENV{'REQUEST_METHOD'} eq 'POST') { 187 read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); 188 } 189 else { 190 $query = $ENV{'QUERY_STRING'}; 191 } 192 193 foreach $pair (split(/&/, $query)) { 194 my ($key, $value) = split(/=/, $pair); 195 196 $value =~ tr/+/ /; 197 $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; 198 199 $FORM{$key} = $value; 200 } 201} 202 203コード
具体的に何が違って自分の実行ファイルが実行できないのか(ソースが表示されてしまうのか)に興味があります。
ちなみにソースが表示されたときの画面をキャプチャしました。
ほかにも関連がありそうなこととして同一ディレクトリ内に.htaccessファイルがあります。.htaccessの内容は
Options -Indexes
<Files users.dat>
deny from all
</Files>
です。
やはり改行コードが原因かもしれないですが、ちょっと僕のほうではエディタでLFで保存してバイナリモードでアップするくらいしか対処が思い浮かばないです。
どなたか原因を思い当たる方がいれば教えていただければと思います。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/27 17:13 編集