CGI-BBS > 基本認証 > 自動パスワード制限 > @以降を入力させたくない。


カレッヂ
カレッヂ


質問者 ひー  投稿日 6/1(金) 18:59:20
アクセス制限自動管理システム
でメールアドレスでパスワードを自動生成されるわけなのですが、
入力フォームで@以降を入力させたくないのですが、どうすればよろしいのでしょうか?
たとえば、
[ name="EMAIL" ]@docomo.ne.jp

登録が完了し、そのページにアクセスする際"EMAIL"がユーザーネームになるので@以降の入力の手間を省かせたいのですが・・・。

宜しくお願い致します。
回答者 呑兵衛  [削除]  投稿日 6/2(土) 18:00:58
呑兵衛といいます。
アクセス制限自動管理システム、ですね。

2つ質問です。
1.
@以前だけ入力させたとして、生成されたパスワードはどこに送るのでしょうか。
あるいは、パスワードやIDをどう知ることができるのでしょうか。

2.
@以前はそのアドレス(メールボックス)を発行するプロバイダーなりサーバー管理者
の管理するドメインでは唯一だと思いますが、
hoge@tako.ne.jp
hoge@honyo.co.jp
hoge@herohero.com
が登録してきた場合誰もアクセスできなくなりますが、そこのところはいかがでしょうか。
質問者 ひー  [削除]  投稿日 6/4(月) 02:56:47
お返事ありがとうございます。
言葉が足りなくてすみません。
i-mode限定のサイトですので、@以降は、全てdocomo.ne.jpとなります。
[EMAIL](@の前)だけ入力してもらい、レジストする際に、
CGIの中で[EMAIL]に@docomo.ne.jpを連結させてsendmail、データファイルへの書き込みは可能でしょうか?

回答者 呑兵衛  [削除]  投稿日 6/4(月) 16:10:01
こんにちは。
ではこのようなものでいかがでしょう。
記録は入力文字だけ、送信は入力文字に@docomo.ne.jpが加わりアドレスになります。
-----------
regist.cgi
-----------
94行目あたり #入力確認 の直後に
ブロック A を挿入

98 行目あたりの
if (!($FORM{'EMAIL'} =~ /(.*)\@(.*)\.(.*)/)) { &error ・・以降 ); }までを消して
ブロック Bを挿入

142行目あたり #電子メール処理 の後に
ブロック C を挿入

-----------
change.cgi
-----------
56行目 あたり #入力確認 の後に

ブロック A
ブロック B を挿入

以上

ブロック A  (全角文字入力対策)
--------------------------------------------------------------------------------
#入力画面と regist.cgiなどのAuto Pwdが shift-jisならば
$sjis  = 'a-zA-Z0-9@.−,ー';
$euc   = jcode::euc($sjis, 'sjis');
$ascii = 'a-zA-Z0-9@.-,-';
jcode::euc($FORM{'EMAIL'}, 'sjis');
jcode::tr(\$FORM{'EMAIL'}, $euc, $ascii);
jcode::sjis($FORM{'EMAIL'});

#入力画面と regist.cgiなどのAuto Pwdが euc-jpならば
jcode::tr(\$FORM{'EMAIL'}, 'a-zA-Z0-9@.−,ー', 'a-zA-Z0-9@.-,-');
--------------------------------------------------------------------------------

ブロック B (@以降の入力ミスをチェック)
--------------------------------------------------------------------------------
if ($FORM{'EMAIL'} =~ /\@/) { &error('入力ミス', '@以降を入力しないで下さい.'); }
--------------------------------------------------------------------------------

ブロック C (ユーザ名を送信アドレスに置き換える)
--------------------------------------------------------------------------------
$FORM{'EMAIL'} = "$FORM{'EMAIL'}\@docomo.ne.jp"
--------------------------------------------------------------------------------

回答者 呑兵衛  [削除]  投稿日 6/4(月) 16:25:14
追伸です。 @以降も記録したいのでしたね。

regist.cgi change.cgi の #入力確認 の中の

@PICKUP = grep(/^$FORM{'EMAIL'}\:(.+)$/,@PASSWORDS);
の前にブロック C を挿入し、
regist.cgi の #電子メール処理 の中では挿入しないようにします。

ただ、文字数は少ないですが@docomo.ne.jpが増える分検索の無駄かもしれません。
質問者 ひー  [削除]  投稿日 6/5(火) 21:17:28
呑兵衛さん、何度もありがとうございます。

変更してみたのですが、サーバーエラーとなってしまいます。

#入力確認のみ変更となるのですね。

regist.cgiを以下の様にしてみたのですが・・・。

#----------------------------------------------------------------------#
#入力確認
#-------------------------------------------------------------
#追加ブロック A  (全角文字入力対策)
#--▼----------------------------------------------------------
#入力画面と regist.cgiなどのAuto Pwdが shift-jisならば
$sjis  = 'a-zA-Z0-9@.−,ー';
$euc   = jcode::euc($sjis, 'sjis');
$ascii = 'a-zA-Z0-9@.-,-';
jcode::euc($FORM{'EMAIL'}, 'sjis');
jcode::tr(\$FORM{'EMAIL'}, $euc, $ascii);
jcode::sjis($FORM{'EMAIL'});
#--▲-----------------------------------------------------------

if ($FORM{'EMAIL'} eq '') { &error('入力エラー','Eメールを入力してください.','d電話機の[戻る]ボタンを押して前の画面に移動してください.'); }
if ($FORM{'EMAIL'} =~ / / || $FORM{'EMAIL'} =~ /,/) { &error('入力エラー','Eメールは1つのみ記入できます.','電話機の[戻る]ボタンを押して前の画面に移動してください.'); }

#変更箇所ブロック B (@以降の入力ミスをチェック)
#--▼-----------------------------------------------------------
#if (!($FORM{'EMAIL'} =~ /(.*)\@(.*)\.(.*)/)) { &error('入力エラー','Eメールは半角で正しく記入してください.','電話機の[戻る]ボタンを押して前の画面に移動してください.'); }
#↓に置き換え
if ($FORM{'EMAIL'} =~ /\@/) { &error('入力ミス', '@以降を入力しないで下さい.'); }
#--▲-----------------------------------------------------------

if (!open(DB,$file)) { &error('システムエラー','パスワード管理ファイルにアクセスできません.','復旧するまでお待ちください.'); }
@PASSWORDS = <DB>;
close(DB);

呑兵衛さんの書いていただいたものをコピペしました。

何度も恐縮なのですが、ご教授願います。
回答者 呑兵衛  [削除]  投稿日 6/6(水) 00:49:54
こんにちは。

当方の記入ミスです。

$FORM{'EMAIL'} = "$FORM{'EMAIL'}\@docomo.ne.jp"

$FORM{'EMAIL'} = "$FORM{'EMAIL'}\@docomo.ne.jp";
としてください。
質問者 ひー  [削除]  投稿日 6/6(水) 01:55:51
何度もありがとうございます。

そんくらい自分で気付けよ! って感じのトコでした。
お手数取らせましてすみません。

・・・もう一つよろしいですか・・・?

前に追伸で頂いた

>@以降も記録したいのでしたね。
>regist.cgi change.cgi の #入力確認 の中の
>@PICKUP = grep(/^$FORM{'EMAIL'}\:(.+)$/,@PASSWORDS);
>の前にブロック C を挿入し、
>regist.cgi の #電子メール処理 の中では挿入しないようにします。
>ただ、文字数は少ないですが@docomo.ne.jpが増える分検索の無駄かもしれません。

なのですが、よくよく考えるとmember.cgiの中に@以降が書き込まれるってことは、
ユーザー認証の際に@以降も入力する必要があるって事ですよね?

それでは、手間がかかるので、やっぱり

>142行目あたり #電子メール処理 の後に
>ブロック C を挿入

を使わせていただくことにします。

そこで、登録が完了したさいの返信メールの内容なのですが、USERNAME:のところに
フルアドレスが記入されてしまいます。
   #電子メール処理
   print OUT "USERNAME: $FORM{'EMAIL'}\n";

返信メールのUSERNAME:のところに登録の際入力したアドレス(@docomo.ne.jpを抜いたもの)を明記させる方法はありますか?

何度もすみません。宜しくお願い致します。
回答者 呑兵衛  [削除]  投稿日 6/6(水) 13:28:37
呑兵衛です。どうも頼りなくてすみません。
前回のままだとまるで役に立ちませんよね。

ブロック C は止めましょう。

#電子メール処理 の直後あたりに
$email_to = "$FORM{'EMAIL'}\@docomo.ne.jp";
を挿入し、

if (!open(OUT,"| $sendmail $FORM{'EMAIL'}"))

if (!open(OUT,"| $sendmail $email_to"))
とし、

print OUT "TO: $FORM{'EMAIL'}\n";

print OUT "TO: $email_to\n";
とします。


全角処理を施された場合、
change.cgi の全角処理の前に
require './jcode.pl';
を挿入する(パスを通してください)ことも追加します。

これで、ユーザの入力は登録もパスワード変更も@より前のみでOK
になり、記録もその通りされ、パスワードのお知らせのときだけ
ユーザ名@docomo.ne.jpで処理されるようになります。

追加
デフォルトでは、メールサブジェクトが全角の日本語ですので、
場合によっては文字化けする可能性が高いです。
regist.cgi の #Eメールの題名
$subject = 'アクセスパスワードのお知らせ';

$subject = 'Announce for Password';
等と英語表記し、
&jis("Subject: $subject"); print OUT "$msg\n";

print OUT "Subject: $subject";
とするのが手っ取り早い方法です。
質問者 ひー  [削除]  投稿日 6/10(日) 22:22:19
いろいろありがとうございました。
無事動きました。
また何かありましたら宜しくお願い致します。

このページは終了したので返信(回答)は書きこめません

Web裏技