記事No | : 13164 |
投稿日 | : 2014/08/21(Thu) 16:04:06 |
タイトル | : エラー内容 name値に不正な文字が含まれています につい |
ID情報 | : highbic |
投稿者 | : yuichi |
URL | : http://www.high-bic.com/contact.html |
postmail のCGIを使用させて頂いております。
質問なのですが、このフォームにpostmail.cgiを設置し
入力するとどうしても、name値に不正なエラーが含まれています。
と表示されます。
どうしたら解決するのか教えて頂きたく掲示板に書き込み致しました。
・chekc.cgiではすべてOKがでております。
postmail.cgiにパスを変更し、フォームに記入しsubmitすると、
name値に不正な〜と表示されます。
パーミッションも問題ありません。
色々試しましたが成功しませんので
ご教授宜しくお願い致します。
皆様お忙しいとは思いますが宜しくお願い致します。
記事No | : 13170 |
投稿日 | : 2014/08/22(Fri) 08:02:29 |
タイトル | : Re:POSTMAIL の使用について 追加情報 |
ID情報 | : highbic |
投稿者 | : yuichi |
URL | : http://www.high-bic.com/contact.html |
> postmail のCGIを使用させて頂いております。
> 質問なのですが、このフォームにpostmail.cgiを設置し
> 入力するとどうしても、name値に不正なエラーが含まれています。
> と表示されます。
>
> どうしたら解決するのか教えて頂きたく掲示板に書き込み致しました。
>
>
> ・chekc.cgiではすべてOKがでております。
> postmail.cgiにパスを変更し、フォームに記入しsubmitすると、
> name値に不正な〜と表示されます。
>
> パーミッションも問題ありません。
>
> 色々試しましたが成功しませんので
> ご教授宜しくお願い致します。
>
> 皆様お忙しいとは思いますが宜しくお願い致します。
>
>
htmlは下記の通りです。
<form action="postmail/postmail.cgi" method="post">
<table class="ta1 mb1em">
<tr>
<th colspan="2" class="tamidashi"><strong class="color1">※</strong>マークは入力必須です</th>
</tr>
<th>お問い合わせ項目 <br>複数回答可<strong class="color1">※</strong></th>
<td>
<input type="checkbox" name="" value="新規ホームページ立ち上げについて" />新規ホームページ立ち上げについて<br>
<label><input type="checkbox" name="" value="既存ホームページリニューアルについて" />既存ホームページリニューアルについて</label><br>
<label><input type="checkbox" name="" value="SEO対策(検索エンジン最適化)について" />SEO対策(検索エンジン最適化)について</label><br>
<label><input type="checkbox" name="" value="iPhoneアプリ作成について" />iPhoneアプリ作成について</label><br>
<label><input type="checkbox" name="" value="Lineスタンプ作成について" />Lineスタンプ作成について</label><br>
<label><input type="checkbox" name="" value="流木.comについて" />流木.comについて</label><br>
<label><input type="checkbox" name="" value="アフィリエイトセミナーについて" />アフィリエイトセミナーについて</label><br>
<label><input type="checkbox" name="" value="その他" />その他</label><br>
</td>
</tr>
<th>新規立ち上げのお客さまへ</th>
<td>ホームページ作成のきっかけ、目的をお聞かせください。<textarea name="" cols="50" rows="5" maxlength="500" class="wl"></textarea></td>
</tr>
<th>「既存ホームページ<br>リニューアル」<br>のお客さまへ</th>
<td>現在のホームページでの問題点、改善点をお教えください。<textarea name="" cols="50" rows="5" maxlength="500" class="wl"></textarea></td>
</tr>
<tr>
<th>SEO対策<br>(検索エンジン最適化)<br>のお客さまへ </th>
<td>上位表示を目標とされています検索キーワードをお教えください。<input type="text" name="" size="30" maxlength="50" class="ws" /><input type="text" name="" size="30" class="ws" /><input type="text" name="" size="30" class="ws" /></td>
</tr>
<tr>
<th>参考サイト(内容、デザイン)</th>
<td>こんなホームページにしたい等ございましたらURLをご記入下さい。http://<input type="text" name="" size="30" class="ws" /><br>http://<input type="text" name="" size="30" class="ws" /><br>http://<input type="text" name="" size="30" class="ws" /></td>
</tr>
<tr>
<th>ライバルサイト </th>
<td>「ライバル的(ここには負けたくない)なホームページ」<br>のURLをご記入ください。<br>http://<input type="text" name="Rivalsite1" size="30" class="ws" /><br>http://<input type="text" name="Rivalsite2" size="30" class="ws" /><br>http://<input type="text" name="" size="30" class="ws" /></td>
</tr>
<tr>
<th>納期(公開時期)がお決まりでしたらご選択ください。</th>
<td>
<select name="">
<option value="" selected="selected">ご選択下さい。</option>
<option value="とにかく急ぎ">とにかく急ぎ</option>
<option value="1ヶ月以内">1ヶ月以内</option>
<option value="2ヶ月以内">2ヵ月以内</option>
<option value="3ヶ月以内">3か月以内</option>
</select></td>
</tr>
<th>具体的なお問い合わせ<br>内容をご記入下さい。<strong class="color1">※</strong></th>
<td><textarea name="" cols="50" rows="5" maxlength="1000" class="wl"></textarea></td>
</tr>
<tr>
<th colspan="2" class="tamidashi">お客様の情報をご記入お願い致します。</th>
</tr>
<tr>
<th>お名前<strong class="color1">※</strong></th>
<td><input type="text" name="" size="30" class="ws" /></td>
</tr>
<tr>
<th>メールアドレス<strong class="color1">※</strong></th>
<td><input type="text" name="" size="30" class="ws" /></td>
</tr>
<tr>
<th>電話番号<strong class="color1">※</strong></th>
<td><input type="text" name="" size="30" class="ws" /></td>
</tr>
<tr>
<th>ご住所(都道府県)</th>
<td>
<select name="">
<option value="" selected="selected">都道府県選択</option>
<option value="北海道">北海道</option>
<option value="青森県">青森県</option>
<option value="岩手県">岩手県</option>
<option value="宮城県">宮城県</option>
<option value="秋田県">秋田県</option>
<option value="山形県">山形県</option>
<option value="福島県">福島県</option>
<option value="茨城県">茨城県</option>
<option value="栃木県">栃木県</option>
<option value="群馬県">群馬県</option>
<option value="埼玉県">埼玉県</option>
<option value="千葉県">千葉県</option>
<option value="東京都">東京都</option>
<option value="神奈川県">神奈川県</option>
<option value="新潟県">新潟県</option>
<option value="富山県">富山県</option>
<option value="石川県">石川県</option>
<option value="福井県">福井県</option>
<option value="山梨県">山梨県</option>
<option value="長野県">長野県</option>
<option value="岐阜県">岐阜県</option>
<option value="静岡県">静岡県</option>
<option value="愛知県">愛知県</option>
<option value="三重県">三重県</option>
<option value="滋賀県">滋賀県</option>
<option value="京都府">京都府</option>
<option value="大阪府">大阪府</option>
<option value="兵庫県">兵庫県</option>
<option value="奈良県">奈良県</option>
<option value="和歌山県">和歌山県</option>
<option value="鳥取県">鳥取県</option>
<option value="島根県">島根県</option>
<option value="岡山県">岡山県</option>
<option value="広島県">広島県</option>
<option value="山口県">山口県</option>
<option value="徳島県">徳島県</option>
<option value="香川県">香川県</option>
<option value="愛媛県">愛媛県</option>
<option value="高知県">高知県</option>
<option value="福岡県">福岡県</option>
<option value="佐賀県">佐賀県</option>
<option value="長崎県">長崎県</option>
<option value="熊本県">熊本県</option>
<option value="大分県">大分県</option>
<option value="宮崎県">宮崎県</option>
<option value="鹿児島県">鹿児島県</option>
<option value="沖縄県">沖縄県</option>
</select></td>
</tr>
<tr>
<th>ご住所(市区町村以下)</th>
<td><input type="text" name="" size="30" class="wl" /></td>
</tr>
</table>
<div class="c">
<input type="submit" value="内容を確認する" class="btn" />
</div>
</form>
-------postmail.cgiは下記の通りです。--------------
#!/usr/local/bin/perl
#┌─────────────────────────────────
#│ POST-MAIL : postmail.cgi - 2014/01/19
#│ copyright (c) KentWeb
#│ http://www.kent-web.com/
#└─────────────────────────────────
# モジュール実行
use strict;
use CGI::Carp qw(fatalsToBrowser);
use lib './lib';
use CGI::Minimal;
use Jcode;
# 設定ファイル認識
require "./init.cgi";
my %cf = init();
# コード変換フィルタ
my $j = new Jcode;
require Unicode::Japanese if ($cf{conv_pm} == 2);
# データ受理
CGI::Minimal::max_read_size($cf{maxdata});
my $cgi = CGI::Minimal->new;
error('容量オーバー') if ($cgi->truncated);
my ($key,$need,$in) = parse_form();
# 禁止ワードチェック
if ($cf{no_wd}) { check_word(); }
# ホスト取得&チェック
my ($host,$addr) = get_host();
# 必須入力チェック
my ($check,@err);
if ($$in{need} || @$need > 0) {
# needフィールドの値を必須配列に加える
my @tmp = split(/\s+/,$$in{need});
push(@$need,@tmp);
# 必須配列の重複要素を排除
my %count;
@$need = grep {!$count{$_}++} @$need;
# 必須項目の入力値をチェックする
foreach (@$need) {
# フィールドの値が投げられてこないもの(ラジオボタン等)
if (!defined($$in{$_})) {
$check++;
push(@$key,$_);
push(@err,$_);
# 入力なしの場合
} elsif ($$in{$_} eq "") {
$check++;
push(@err,$_);
}
}
}
# 入力内容マッチ
my ($match1,$match2);
if ($$in{match}) {
($match1,$match2) = split(/\s+/, $$in{match}, 2);
if ($$in{$match1} ne $$in{$match2}) {
error("$match1と$match2の再入力内容が異なります");
}
}
# 入力チェック確認画面
if ($check) { err_input($match2); }
# --- プレビュー
if ($$in{mode} ne "send") {
# 連続送信チェック
check_post('view');
# 確認画面
prev_form();
# --- 送信実行
} else {
# sendmail送信
send_mail();
}
#-----------------------------------------------------------
# プレビュー
#-----------------------------------------------------------
sub prev_form {
# 送信内容チェック
error("データを取得できません") if (@$key == 0);
# メール書式チェック
check_email($$in{email}) if ($$in{email});
# 時間取得
my $time = time;
# セッション生成
my $ses = make_ses($time);
# 順番
if ($$in{sort}) {
my (@tmp,%tmp);
for ( split(/\s+/,$$in{sort}) ) {
push(@tmp,$_);
$tmp{$_}++;
}
for (@$key) {
if (!defined($tmp{$_})) { push(@tmp,$_); }
}
@$key = @tmp;
}
# テンプレート読込
open(IN,"$cf{tmpldir}/conf.html") or error("open err: conf.html");
my $tmpl = join('', <IN>);
close(IN);
# 置き換え
$tmpl =~ s/!mail_cgi!/$cf{mail_cgi}/g;
# テンプレート分割
my ($head,$loop,$foot) = $tmpl =~ /(.+)<!-- cell_begin -->(.+)<!-- cell_end -->(.+)/s
? ($1,$2,$3) : error("テンプレート不正");
# 引数
my $hidden;
$hidden .= qq|<input type="hidden" name="mode" value="send" />\n|;
$hidden .= qq|<input type="hidden" name="ses_id" value="$ses" />\n|;
$hidden .= qq|<input type="hidden" name="sort" value="$$in{sort}" />\n|;
# 項目
my ($bef,$item);
foreach my $key (@$key) {
next if ($bef eq $key);
next if ($key eq "x");
next if ($key eq "y");
next if ($key eq "need");
next if ($key eq "match");
next if ($key eq "sort");
next if ($$in{match} && $key eq $match2);
if ($key eq 'subject') {
$hidden .= qq|<input type="hidden" name="$key" value="$$in{subject}" />\n|;
next;
}
# name値チェック
check_key($key) if ($cf{check_key});
my $val = hex_encode($$in{$key});
$hidden .= qq|<input type="hidden" name="$key" value="$val" />\n|;
# 改行変換
$$in{$key} =~ s|\t|<br />|g;
my $tmp = $loop;
if (defined($cf{replace}->{$key})) {
$tmp =~ s/!key!/$cf{replace}->{$key}/;
} else {
$tmp =~ s/!key!/$key/;
}
$tmp =~ s/!val!/$$in{$key}/;
$item .= $tmp;
$bef = $key;
}
for ($head,$foot) {
s/<!-- hidden -->/$hidden/g;
}
# 画面展開
print "Content-type: text/html; charset=$cf{charset}\n\n";
print $head,$item;
# フッタ表示
footer($foot);
}
#-----------------------------------------------------------
# 送信実行
#-----------------------------------------------------------
sub send_mail {
# 送信内容チェック
error("データを取得できません") if (@$key == 0);
# セッションチェック
check_ses();
# 連続送信チェック
check_post('send');
# メール書式チェック
check_email($$in{email},'send') if ($$in{email});
# 時間取得
my ($date1,$date2) = get_time();
# ブラウザ情報
my $agent = $ENV{HTTP_USER_AGENT};
$agent =~ s/[<>&"'()+;]//g;
# 順番
if ($$in{sort}) {
my (@tmp,%tmp);
for ( split(/\s+/,$$in{sort}) ) {
push(@tmp,$_);
$tmp{$_}++;
}
for (@$key) {
if (!defined($tmp{$_})) { push(@tmp,$_); }
}
@$key = @tmp;
}
# 本文テンプレ読み込み
open(IN,"$cf{tmpldir}/mail.txt") or error("open err: mail.txt");
my $mail = join('', <IN>);
close(IN);
# 改行
$mail =~ s/\r\n/\n/g;
$mail =~ s/\r/\n/g;
# テンプレ変数変換
$mail =~ s/!date!/$date1/g;
$mail =~ s/!agent!/$agent/g;
$mail =~ s/!host!/$host/g;
# コード変換
$mail = conv_jis($mail);
# 自動返信ありのとき
my $reply;
if ($cf{auto_res}) {
# テンプレ
open(IN,"$cf{tmpldir}/reply.txt") or error("open err: reply.txt");
$reply = join('', <IN>);
close(IN);
# 改行
$reply =~ s/\r\n/\n/g;
$reply =~ s/\r/\n/g;
# 変数変換
$reply =~ s/!date!/$date1/g;
# コード変換
$reply = conv_jis($reply);
}
# 本文キーを展開
my ($bef,$mbody,$log);
foreach (@$key) {
# 本文に含めない部分を排除
next if ($_ eq "mode");
next if ($_ eq "need");
next if ($_ eq "match");
next if ($_ eq "sort");
next if ($_ eq "ses_id");
next if ($_ eq "subject");
next if ($$in{match} && $_ eq $match2);
next if ($bef eq $_);
# hexデコード
$$in{$_} = hex_decode($$in{$_});
# name値の名前置換
my $key_name = defined($cf{replace}->{$_}) ? $cf{replace}->{$_} : $_;
# エスケープ
$$in{$_} =~ s/\.\n/\. \n/g;
# 添付ファイル風の文字列拒否
$$in{$_} =~ s/Content-Disposition:\s*attachment;.*//ig;
$$in{$_} =~ s/Content-Transfer-Encoding:.*//ig;
$$in{$_} =~ s/Content-Type:\s*multipart\/mixed;\s*boundary=.*//ig;
# 改行復元
$$in{$_} =~ s/\t/\n/g;
# HTMLタグ復元
$$in{$_} =~ s/</</g;
$$in{$_} =~ s/>/>/g;
$$in{$_} =~ s/"/"/g;
$$in{$_} =~ s/'/'/g;
$$in{$_} =~ s/&/&/g;
# 本文内容
my $tmp;
if ($$in{$_} =~ /\n/) {
$tmp = "$key_name = \n$$in{$_}\n";
} else {
$tmp = "$key_name = $$in{$_}\n";
}
$mbody .= $tmp;
$bef = $_;
}
# コード変換
$mbody = conv_jis($mbody);
# 本文テンプレ内の変数を置き換え
$mail =~ s/!message!/$mbody/;
# 返信テンプレ内の変数を置き換え
$reply =~ s/!message!/$mbody/ if ($cf{auto_res});
# メールアドレスがない場合は送信先に置き換え
my $email = $$in{email} eq '' ? $cf{mailto} : $$in{email};
# MIMEエンコード
my $sub_me = $$in{subject} ne '' && defined($cf{multi_sub}->{$$in{subject}}) ? $cf{multi_sub}->{$$in{subject}} : $cf{subject};
$sub_me = $j->set($sub_me,$cf{kcode})->mime_encode;
my $from;
if ($$in{name}) {
$$in{name} =~ s/[\r\n]//g;
$from = $j->set("\"$$in{name}\" <$email>",$cf{kcode})->mime_encode;
} else {
$from = $email;
}
# --- 送信内容フォーマット開始
# ヘッダー
my $body = "To: $cf{mailto}\n";
$body .= "From: $from\n";
$body .= "Subject: $sub_me\n";
$body .= "MIME-Version: 1.0\n";
$body .= "Date: $date2\n";
$body .= "Content-type: text/plain; charset=iso-2022-jp\n";
$body .= "Content-Transfer-Encoding: 7bit\n";
$body .= "X-Mailer: $cf{version}\n\n";
$body .= "$mail\n";
# 返信内容フォーマット
my $res_body;
if ($cf{auto_res}) {
# 件名MIMEエンコード
my $re_sub = Jcode->new($cf{sub_reply},$cf{kcode})->mime_encode;
$res_body .= "To: $email\n";
$res_body .= "From: $cf{mailto}\n";
$res_body .= "Subject: $re_sub\n";
$res_body .= "MIME-Version: 1.0\n";
$res_body .= "Content-type: text/plain; charset=iso-2022-jp\n";
$res_body .= "Content-Transfer-Encoding: 7bit\n";
$res_body .= "Date: $date2\n";
$res_body .= "X-Mailer: $cf{version}\n\n";
$res_body .= "$reply\n";
}
# senmdailコマンド
my $scmd = $cf{send_fcmd} ? "$cf{sendmail} -t -i -f $email" : "$cf{sendmail} -t -i";
# 本文送信
open(MAIL,"| $scmd") or error("メール送信失敗");
print MAIL "$body\n";
close(MAIL);
# 返信送信
if ($cf{auto_res}) {
my $scmd = $cf{send_fcmd} ? "$cf{sendmail} -t -i -f $cf{mailto}" : "$cf{sendmail} -t -i";
open(MAIL,"| $scmd") or error("メール送信失敗");
print MAIL "$res_body\n";
close(MAIL);
}
# リロード
if ($cf{reload}) {
if ($ENV{PERLXS} eq "PerlIS") {
print "HTTP/1.0 302 Temporary Redirection\r\n";
print "Content-type: text/html\n";
}
print "Location: $cf{back}\n\n";
exit;
# 完了メッセージ
} else {
open(IN,"$cf{tmpldir}/thanks.html") or error("open err: thanks.html");
my $tmpl = join('', <IN>);
close(IN);
# 表示
print "Content-type: text/html; charset=$cf{charset}\n\n";
$tmpl =~ s/!back!/$cf{back}/g;
footer($tmpl);
}
}
#-----------------------------------------------------------
# 入力エラー表示
#-----------------------------------------------------------
sub err_input {
my $match2 = shift;
# 順番
if ($$in{sort}) {
my (@tmp,%tmp);
for ( split(/\s+/,$$in{sort}) ) {
push(@tmp,$_);
$tmp{$_}++;
}
for (@$key) {
if (!defined($tmp{$_})) { push(@tmp,$_); }
}
@$key = @tmp;
}
# テンプレート読み込み
open(IN,"$cf{tmpldir}/error.html") or die;
my $tmpl = join('', <IN>);
close(IN);
# テンプレート分割
my ($head,$loop,$foot) = $tmpl =~ /(.+)<!-- cell_begin -->(.+)<!-- cell_end -->(.+)/s
? ($1,$2,$3) : error("テンプレート不正");
# ヘッダ
print "Content-type: text/html; charset=$cf{charset}\n\n";
print $head;
# 内容展開
my $bef;
foreach my $key (@$key) {
next if ($key eq "need");
next if ($key eq "match");
next if ($key eq "sort");
next if ($$in{match} && $key eq $match2);
next if ($bef eq $key);
next if ($key eq "x");
next if ($key eq "y");
next if ($key eq "subject");
my $key_name = defined($cf{replace}->{$key}) ? $cf{replace}->{$key} : $key;
my $tmp = $loop;
$tmp =~ s/!key!/$key_name/;
my $erflg;
foreach my $err (@err) {
if ($err eq $key) {
$erflg++;
last;
}
}
# 入力なし
if ($erflg) {
$tmp =~ s/!val!/<span class="msg">$key_nameは入力必須です.<\/span>/;
# 正常
} else {
$$in{$key} =~ s/\t/<br \/>/g;
$tmp =~ s/!val!/$$in{$key}/;
}
print $tmp;
$bef = $key;
}
# フッタ
print $foot;
exit;
}
#-----------------------------------------------------------
# フォームデコード
#-----------------------------------------------------------
sub parse_form {
my (@key,@need,%in);
foreach my $key ( $cgi->param() ) {
# 複数値の場合はスペースで区切る
my $val = join(" ", $cgi->param($key));
# 無害化/改行変換
$key =~ s/[<>&"'\r\n]//g;
$val =~ s/&/&/g;
$val =~ s/</</g;
$val =~ s/>/>/g;
$val =~ s/"/"/g;
$val =~ s/'/'/g;
$val =~ s/\r\n/\t/g;
$val =~ s/\r/\t/g;
$val =~ s/\n/\t/g;
# 文字コード変換
if ($cf{conv_code}) {
if ($cf{conv_pm} == 1) {
Jcode::convert($key,$cf{kcode});
Jcode::convert($val,$cf{kcode});
} else {
$key = Unicode::Japanese->new($key,'auto')->conv($cf{kcode});
$val = Unicode::Japanese->new($val,'auto')->conv($cf{kcode});
}
}
# 入力必須
if ($key =~ /^_(.+)/) {
$key = $1;
push(@need,$key);
}
# 受け取るキーの順番を覚えておく
push(@key,$key);
# %inハッシュに代入
$in{$key} = $val;
}
# post送信チェック
if ($cf{postonly} && $ENV{REQUEST_METHOD} ne 'POST') {
error("不正なアクセスです");
}
# リファレンスで返す
return (\@key,\@need,\%in);
}
#-----------------------------------------------------------
# フッター
#-----------------------------------------------------------
sub footer {
my $foot = shift;
# 著作権表記(削除・改変禁止)
my $copy = <<EOM;
<p style="margin-top:2em;text-align:center;font-family:Verdana,Helvetica,Arial;font-size:10px;">
- <a href="http://www.kent-web.com/" target="_top">POST MAIL</a> -
</p>
EOM
if ($foot =~ /(.+)(<\/body[^>]*>.*)/si) {
print "$1$copy$2\n";
} else {
print "$foot$copy\n";
print "<body></html>\n";
}
exit;
}
#-----------------------------------------------------------
# エラー処理
#-----------------------------------------------------------
sub error {
my $err = shift;
open(IN,"$cf{tmpldir}/error.html") or die;
my $tmpl = join('', <IN>);
close(IN);
# 文字置き換え
$tmpl =~ s/!key!/エラー内容/g;
$tmpl =~ s|!val!|<span class="msg">$err</span>|g;
print "Content-type: text/html; charset=$cf{charset}\n\n";
print $tmpl;
exit;
}
#-----------------------------------------------------------
# 時間取得
#-----------------------------------------------------------
sub get_time {
$ENV{TZ} = "JST-9";
my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
my @week = qw|Sun Mon Tue Wed Thu Fri Sat|;
my @month = qw|Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec|;
# 日時のフォーマット
my $date1 = sprintf("%04d/%02d/%02d(%s) %02d:%02d:%02d",
$year+1900,$mon+1,$mday,$week[$wday],$hour,$min,$sec);
my $date2 = sprintf("%s, %02d %s %04d %02d:%02d:%02d",
$week[$wday],$mday,$month[$mon],$year+1900,$hour,$min,$sec) . " +0900";
return ($date1,$date2);
}
#-----------------------------------------------------------
# ホスト名取得
#-----------------------------------------------------------
sub get_host {
# ホスト名取得
my $host = $ENV{REMOTE_HOST};
my $addr = $ENV{REMOTE_ADDR};
if ($cf{gethostbyaddr} && ($host eq "" || $host eq $addr)) {
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
}
$host ||= $addr;
# チェック
if ($cf{denyhost}) {
my $flg;
foreach ( split(/\s+/, $cf{denyhost}) ) {
s/\./\\\./g;
s/\*/\.\*/g;
if ($host =~ /$_/i) { $flg++; last; }
}
if ($flg) { error("アクセスを許可されていません"); }
}
return ($host,$addr);
}
#-----------------------------------------------------------
# 送信チェック
#-----------------------------------------------------------
sub check_post {
my $job = shift;
# 時間取得
my $now = time;
# ログオープン
open(DAT,"+< $cf{logfile}") or error("open err: $cf{logfile}");
eval "flock(DAT, 2);";
my $data = <DAT>;
# 分解
my ($ip,$time) = split(/<>/,$data);
# IP及び時間をチェック
if ($ip eq $addr && $now - $time <= $cf{block_post}) {
close(DAT);
error("連続送信は$cf{block_post}秒間お待ちください");
}
# 送信時は保存
if ($job eq "send") {
seek(DAT, 0, 0);
print DAT "$addr<>$now";
truncate(DAT, tell(DAT));
}
close(DAT);
}
#-----------------------------------------------------------
# セッション生成
#-----------------------------------------------------------
sub make_ses {
my $now = shift;
# セッション発行
my @wd = (0 .. 9, 'a' .. 'z', 'A' .. 'Z', '_');
my $ses;
srand;
for (1 .. 25) {$ses .= $wd[int(rand(@wd))]; }
# セッション情報をセット
my @log;
open(DAT,"+< $cf{sesfile}") or error("open err: $cf{sesfile}");
eval 'flock(DAT, 2);';
while(<DAT>) {
chomp;
my ($id,$time) = split(/\t/);
next if ($now - $time > $cf{sestime} * 60);
push(@log,"$_\n");
}
unshift(@log,"$ses\t$now\n");
seek(DAT, 0, 0);
print DAT @log;
truncate(DAT, tell(DAT));
close(DAT);
return $ses;
}
#-----------------------------------------------------------
# セッションチェック
#-----------------------------------------------------------
sub check_ses {
# 整合性チェック
if ($$in{ses_id} !~ /^\w{25}$/) { error('不正なアクセスです'); }
my $now = time;
my $flg;
open(DAT,"$cf{sesfile}") or error("open err: $cf{sesfile}");
while(<DAT>) {
chomp;
my ($id,$time) = split(/\t/);
next if ($now - $time > $cf{sestime} * 60);
if ($id eq $$in{ses_id}) {
$flg++;
last;
}
}
close(DAT);
# エラーのとき
if (!$flg) {
error('確認画面表示後一定時間が経過しました。最初からやり直してください');
}
}
#-----------------------------------------------------------
# hexエンコード
#-----------------------------------------------------------
sub hex_encode {
my $str = shift;
$str =~ s/(.)/unpack('H2', $1)/eg;
$str =~ s/\n/\t/g;
return $str;
}
#-----------------------------------------------------------
# hexデコード
#-----------------------------------------------------------
sub hex_decode {
my $str = shift;
$str =~ s/\t/\n/g;
$str =~ s/([0-9A-Fa-f]{2})/pack('H2', $1)/eg;
return $str;
}
#-----------------------------------------------------------
# 電子メール書式チェック
#-----------------------------------------------------------
sub check_email {
my ($eml,$job) = @_;
# 送信時はB64デコード
if ($job eq 'send') { $eml = hex_decode($eml); }
# E-mail書式チェック
if ($eml =~ /\,/) {
error("メールアドレスにコンマ ( , ) が含まれています");
}
if ($eml ne '' && $eml !~ /^[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,6}$/) {
error("メールアドレスの書式が不正です");
}
}
#-----------------------------------------------------------
# name値チェック
#-----------------------------------------------------------
sub check_key {
my $key = shift;
my $char = $cf{kcode} eq 'utf8'
? '[\xE0-\xEF][\x80-\xBF]{2}'
: '[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]';
if ($key !~ /^(?:[0-9a-zA-Z_-]|$char)+$/) {
error("name値に不正な文字が含まれています");
}
}
#-----------------------------------------------------------
# 禁止ワードチェック
#-----------------------------------------------------------
sub check_word {
my $flg;
foreach (@$key) {
foreach my $wd ( split(/,/, $cf{no_wd}) ) {
if (index($$in{$_},$wd) >= 0) {
$flg++;
last;
}
}
if ($flg) { error("禁止ワードが含まれています"); }
}
}
#-----------------------------------------------------------
# 文字コード変換
#-----------------------------------------------------------
sub conv_jis {
my $str = shift;
if ($cf{conv_pm} == 2) {
$str = Unicode::Japanese->new($str,$cf{kcode})->conv('jis');
} else {
# にょろ対策
if ($cf{kcode} eq 'utf8') {
$str =~ s/\xef\xbd\x9e/\xe3\x80\x9c/g;
$str =~ s/\xef\xbc\x8d/\xe2\x88\x92/g;
}
$str = $j->set($str,$cf{kcode})->jis;
}
return $str;
}
-------------------init.cgiは下記の通りです。-----------
# モジュール宣言/変数初期化
use strict;
my %cf;
#┌─────────────────────────────────
#│ POST-MAIL : postmail.cgi - 2014/02/08
#│ copyright (c) KentWeb
#│ http://www.kent-web.com/
#└─────────────────────────────────
$cf{version} = 'postmail v7.1';
#┌─────────────────────────────────
#│ [注意事項]
#│ 1. このプログラムはフリーソフトです。このプログラムを使用した
#│ いかなる損害に対して作者は一切の責任を負いません。
#│ 2. 送信フォームのHTMLページの作成に関しては、HTML文法の範疇
#│ となるため、サポート対象外となります。
#│ 3. 設置に関する質問はサポート掲示板にお願いいたします。
#│ 直接メールによる質問はお受けいたしておりません。
#└─────────────────────────────────
#
# [ 送信フォーム (HTML) の記述例 ]
#
# ・タグの記述例 (1)
# おなまえ <input type="text" name="name" />
# → このフォームに「山田太郎」と入力して送信すると、
# 「name} = 山田太郎」という形式で受信します
#
# ・タグの記述例 (2)
# お好きな色 <input type="radio" name="color" value="青" />
# → このラジオボックスにチェックして送信すると、
# 「color} = 青」という形式で受信します
#
# ・タグの記述例 (3)
# E-mail <input type="text" name="email" />
# → name値に「email」という文字を使うとこれはメールアドレス
# と認識し、アドレスの書式を簡易チェックします
# → (○) abc@xxx.co.jp
# → (×) abc.xxx.co.jp → 入力エラーとなります
#
# ・タグの記述例 (4)
# E-mail <input type="text" name="_email" />
# → name値の先頭に「アンダーバー 」を付けると、その入力値は
# 「入力必須」となります。
# 上記の例では、「メールアドレスは入力必須」となります。
#
# ・name値への「全角文字」の使用は可能です
# (例) <input type="radio" name="年齢" value="20歳代" />
# → 上記のラジオボックスにチェックを入れて送信すると、
# 「年齢} = 20歳代」という書式で受け取ることができます。
#
# ・name値を「name」とするとこれを「送信者名」と認識して送信元の
# メールアドレスを「送信者 <メールアドレス>」というフォーマットに
# 自動変換します。
# (フォーム記述例) <input type="text" name="name" />
# (送信元アドレス) 太郎 <taro@email.xx.jp>
#
# ・制御タグ-1
# → 入力必須項目を強制指定する(半角スペースで複数指定可)
# → ラジオボタン、チェックボックス対策
# → name値を「need」、value値を「必須項目1 + 半角スペース +必須項目2 + 半角スペース ...」
# (例) <input type="hidden" name="need" value="名前 メールアドレス 性別" />
#
# ・制御タグ-2
# → 2つの入力内容が同一かをチェックする
# → name値を「match」、value値を「項目1 + 半角スペース + 項目2」
# (例) <input type="hidden" name="match" value="email email2" />
#
# ・制御タグ-3
# → name値の並び順を指定する(半角スペースで複数指定)
# → 入力エラー画面及びメール本文の並びを指定します
# (例) <input type="hidden" name="sort" value="name email メッセージ" />
#===========================================================
# ▼基本設定
#===========================================================
# このプログラムの文字コード
# utf8 : UTF-8
# sjis : Shift-JIS
$cf{kcode} = 'sjis';
# 送信先メールアドレス
$cf{mailto} = 'info@high-bic.com';
# sendmailのパス【サーバパス】
# → プロバイダの指定を確認のこと
$cf{sendmail} = '/usr/lib/sendmail';
# sendmailへの-fコマンド(プロバイダの仕様確認)
# 0=no 1=yes
$cf{send_fcmd} = 0;
# 文字コード自動判別(0=no 1=yes)
# → フォームの文字コード自動判別を行う場合
# → フォームがUTF-8の場合は「0」で概ねOK
$cf{conv_code} = 0;
# 文字コード変換モジュール
# 1 : Jcode
# 2 : Unicode::Japanese
$cf{conv_pm} = 2;
# フォームのname値の置き換えをする場合
# → 英字のname値を日本語に自動的に置き換えます。
# 例: 「email = xx@xx.xx」→「メールアドレス = xx@xx.xx」
$cf{replace} = {
'name' => 'お名前',
'email' => 'メールアドレス',
};
# 最大受信サイズ(Byte)
# → 例 : 102400Bytes = 100KB
$cf{maxdata} = 102400;
# 送信者へのメール返信
# 0=no 1=yes
$cf{auto_res} = 1;
# メール件名(初期値)
$cf{subject} = 'お問い合わせフォーム';
# メール件名の外部指定
# → 複数のフォームメールで運用する場合、タグで件名指定する
$cf{multi_sub} = {
1 => '資料請求フォーム',
2 => 'お問い合わせフォーム',
3 => 'ご感想連絡フォーム',
};
# 返信向けメールタイトル
$cf{sub_reply} = 'お問い合わせありがとうございます';
# 本体プログラム【URLパス】
$cf{mail_cgi} = './postmail.cgi';
# ログファイル【サーバパス】
$cf{logfile} = './data/log.cgi';
# セッションファイル【サーバパス】
$cf{sesfile} = './data/ses.cgi';
# テンプレートディレクトリ【サーバパス】
$cf{tmpldir} = './tmpl';
# セッションの許容時間(分単位)
# → 確認画面表示後、送信ボタンを押すまでの時間
$cf{sestime} = 5;
# 送信後の形態
# 0 : 完了メッセージを出す.
# 1 : 戻り先 ($back) へ自動ジャンプさせる.
$cf{reload} = 0;
# 送信後の戻り先【URLパス】
$cf{back} = '../index.html';
# フォームのname値の正当性をチェックする
# → 半角文字は英数字、アンダーバー、ハイフンはOK。全角は全てOK
# 0=no 1=yes
$cf{check_key} = 1;
# 同一IPアドレスからの連続送信制御
# → 許可する間隔を秒数で指定(0にするとこの機能は無効)
$cf{block_post} = 0;
# 送信は method=POST 限定 (セキュリティ対策)
# 0=no 1=yes
$cf{postonly} = 1;
# ホスト名取得方法
# 0 : gethostbyaddr関数を使わない
# 1 : gethostbyaddr関数を使う
$cf{gethostbyaddr} = 0;
# アクセス制限(複数あれば半角スペースで区切る、アスタリスク可)
# → 拒否ホスト名又はIPアドレスの記述例
# (前方一致は先頭に ^ をつける)【例】^210.12.345.*
# (後方一致は末尾に $ をつける)【例】*.anonymizer.com$
$cf{denyhost} = '';
# 禁止ワード
# → 投稿時禁止するワードをコンマで区切る
$cf{no_wd} = '';
#===========================================================
# ▲設定完了
#===========================================================
# for content
$cf{charset} = $cf{kcode} eq 'utf8' ? 'utf-8' : 'shift_jis';
# 設定値を返す
sub init {
return %cf;
}
1;
----------------------------------------------------
追加情報は以上となります。
ご教授宜しくお願い致します。
記事No | : 13173 |
投稿日 | : 2014/08/22(Fri) 11:51:04 |
タイトル | : Re: エラー内容 name値に不正な文字が含まれています につい |
ID情報 | : hirayama |
投稿者 | : hirayama |
まず、htmlの方で、nameがすべて
name=""
となっているのがまずいと思います。
記事No | : 13182 |
投稿日 | : 2014/08/24(Sun) 16:33:11 |
タイトル | : Re^2: エラー内容 name値に不正な文字が含まれています につい |
ID情報 | : highbic |
投稿者 | : yuichi |
> まず、htmlの方で、nameがすべて
> name=""
> となっているのがまずいと思います。
ありがとうございます。修正してみます。