2012-01-26 11 views
1

私はPerl(CGIモジュールを使用しています)とrecaptchaを使って申し込みフォームを作成しています。フォームは正常に動作し、SQLデータベースにデータを送信します。ただし、フォームを使用して別のユーザーを作成すると、データベースに入力されたデータは最初のユーザーと同じになります。 my $var = $cgi->param('param_name');を使用して確認ページのフォームデータを取得しています。パラメータを消去する必要がありますか、それとも別のものですか。 (私は$cgi->delete_all();を試みたが、それは何もしていないようでした)Perl CGI以前のデータを再利用するフォーム

フォーム認証コード:(それは文字通りプロトタイプなので、セキュリティがまだ解決されていません)

my $challenge = $q->param('recaptcha_challenge_field'); 
my $response = $q->param('recaptcha_response_field'); 
my $username = $q->param('Username'); 
my $password = $q->param('Password'); 
my $name = $q->param('Name'); 
my $email = $q->param('Username'); 
my $security = $q->param('Security'); 
my $answer = $q->param('Answer'); 
my $permissions = 1; 

# Verify submission 
my $result = $c->check_answer(
    "my_private_key", $ENV{'REMOTE_ADDR'}, 
    $challenge, $response 
); 

if ($result->{is_valid}) { 
    insert_new_user(); 
    print $q->redirect('cgi-bin/admin/text_campaign.pl'); 
} 
else { 
    # Error 
    print $q->redirect('login.pl?crc=false'); 
} 

############################################################################### 
# Sub Routines                # 
############################################################################### 
sub insert_new_user 
{ 
    my $sql = "INSERT INTO users (u_username, u_password, u_realname, u_email, u_security_question, u_security_answer, PRIVILEGES_idPRIVILEGES) 
       VALUES(?, ?, ?, ?, ?, ?, ?) "; 
    my $sth=$dbh->prepare($sql); 
    $sth->execute($username, $password, $name, $email, $security, $answer, $permissions); 
    $sth->finish(); 

    return; 
} 
+0

同じことを意味しますか?フォームを読み込んだとき、または挿入した後に同じレコードが取得されたときに、事前に設定されていますか? FastCGIやmod_perlなどを使用していますか? – Cfreak

+0

こんにちは、それは同じレコードです。私は、いくつかのテスト情報で「新規ユーザー1」としてフォームに記入して提出します。これは期待どおりのSQLデータベースに入りますが、フォームに戻っていくつかのテスト情報で「新規ユーザー2」として入力すると、「新規ユーザー1」と同じ情報を持つSQLデータベースに移動します。ソースファイルを変更してもう一度入力した場合にのみ、別の情報が入力されます。私はCGIとCaptcha :: reCAPTCHAモジュール以外は使用していません。 – Enigma

+0

POSTの代わりにGETを使用してフォームを送信していますか?おそらく以前の投稿のURLに値が入っていた可能性があります。 – gpojd

答えて

0

はい、それは道それです通常動作します。ドキュメント

http://perldoc.perl.org/CGI.html#PRAGMAS

またはDELETE_ALL()関数で-nosticky "プラグマ" を調べてください。

--- EDIT ---

私はCGI.pmのドキュメントにあるサンプルの修正された形で少しを果たしました。それを参照の容易さのためにここに含めると、私はそれを少し変更したので。

#!/usr/bin/perl 

use CGI qw/-nosticky :standard/; 

print header; 
print start_html("Example CGI.pm Form"); 
print "<h1> Example CGI.pm Form</h1>\n"; 
do_work(); 
print_prompt(); 
print_tail(); 
print end_html; 

sub print_prompt { 
    print "<hr>\n"; 
    print start_form; 
    print "<em>What's your name?</em><br>"; 
    print textfield('name'); 
    print checkbox('Not my real name'); 
    print "<p><em>Where can you find English Sparrows?</em><br>"; 
    print checkbox_group(
          -name=>'Sparrow locations', 
          -values=>[England,France,Spain,Asia,Hoboken], 
          -linebreak=>'yes', 
          -defaults=>[England,Asia]); 
    print "<p><em>How far can they fly?</em><br>", 
     radio_group(
       -name=>'how far', 
       -values=>['10 ft','1 mile','10 miles','real far'], 
       -default=>'1 mile'); 
    print "<p><em>What's your favorite color?</em> "; 
    print popup_menu(-name=>'Color', 
          -values=>['black','brown','red','yellow'], 
          -default=>'red'); 
    print hidden('Reference','Monty Python and the Holy Grail'); 
    print "<p><em>What have you got there?</em><br>"; 
    print scrolling_list(
        -name=>'possessions', 
        -values=>['A Coconut','A Grail','An Icon', 
          'A Sword','A Ticket'], 
        -size=>5, 
        -multiple=>'true'); 
    print "<p><em>Any parting comments?</em><br>"; 
    print textarea(-name=>'Comments', 
          -rows=>10, 
          -columns=>50); 
    print "<p>",reset; 
    print submit('Action','Shout'); 
    print submit('Action','Scream'); 
    print end_form; 
    print "<hr>\n"; 
} 

sub do_work { 
    print "<h2>Here are the current settings in this form</h2>"; 
    for my $key (param) { 
     print "<strong>$key</strong> -> "; 
     my @values = param($key); 
     print join(", ",@values),"<br>\n"; 
    } 
} 

sub print_tail { 
    print <<END; 
<hr> 
<address>Lincoln D. Stein</address><br> 
<a href="/">Home Page</a> 
END 
} 

このスクリプトはそのままで、私たちが議論している振る舞いを示しています。 -nostickyの使用は助けには見えません。私はそうのように、)print_prompt(do_work後と前にDELETE_ALLを追加する場合

しかし、:

print header; 
print start_html("Example CGI.pm Form"); 
print "<h1> Example CGI.pm Form</h1>\n"; 
do_work(); 
Delete_all(); 
print_prompt(); 
print_tail(); 
print end_html; 

その後、デフォルトが事前に設定されていません。

こちらがお役に立てば幸いです。

+0

私はこれについてはあまりよく分かりません。 CGIはまだステートレスでなければなりません。 2回目のリクエストの場合は、コード内に以前の値を取得するものは何も表示されません。 Nostickyは、フォームが生成されるときにデフォルト値をオフにするだけです。 – Cfreak

+0

まあ、私たちはコード全体を持っておらず、手足に出ていますが、よくcgi.pmが使用される方法は、同じPerlスクリプトでフォームを生成してPOSTリクエストを処理することです。それにPOSTすると、情報を処理してから、フォームを再生成し、投稿された値を再利用します。もちろん、異なるセッション間で値が保持されるわけではありませんが、同じユーザーがブラウザからcgi.pmスクリプトへの複数の投稿を行っているときにこの動作が表示されます。私は素早くGoogleをやって、さらに、ノスタッチプラグマに関するいくつかの疑問や苦情を発見したので、より多くの研究が必要になるかもしれません。 – theglauber

+0

一方、delete_all()は動作するはずです。 – theglauber

関連する問題