2012-07-16 121 views
0

我正在写一个接收POST方法提交的小Perl页面。我希望能够防止单个人/计算机多次提交表单(以避免重复提交泛滥)。但是我无法找到关于如何在Perl CGI中执行此操作的示例或解释。你能建议还是直接给我一些例子? 我知道我可以使用来自HTTP标头(令牌?)的一些数据和/或第一次提交后种植一个cookie,但我不知道如何。避免用户使用Perl提交表单两次(CGI)

任何帮助将不胜感激。 最好的问候, -Arseny

回答

1

避免用户多次单击按钮的最简单方法是将一些JavaScript添加到您的页面。这将不起作用的脚本或即按F5

<input type="submit" name="go" id="go" value="go" onclick="this.disabled='disabled'"/> 

你也可以写保存用户和时间标记的IP地址的服务器上的日志文件/数据库,并检查他是否为已提交。除了设置和检查cookie之外,这样做可能是一条路。

有关cookie,请参阅CGI文档中的cookies。简单的例子:

use strict; use warnings; 
use CGI; 

my $q = new CGI; 

my $submitted = 0; 
if ($q->cookie('submitted ')) { 
    $submitted = 1; 
} 
# Here you could place the file/db check to also set $voted 
if ($submitted) { 
    print $q->header('text/plain'); 
    print "You have already submitted!"; 
} else { 
    # Do stuff with the form, like $q->param('foo')... 
    # Once you're done, place the cookie 
    print $q->header(
    -type => 'text/plain', 
    -cookie => $q->cookie(
     -name => 'submitted', 
     -value => 1, 
     -expires => '+1y', 
)); 
} 
+0

谢谢! 你能否告诉我在哪里可以得到我的CGI提交者的IP?它会在CGI类型对象的某个地方吗? – 2012-07-16 13:21:07

+1

'$ q-> remote_addr()' - 参见[获取环境变量](http://search.cpan.org/dist/CGI/lib/CGI.pm#FETCHING_ENVIRONMENT_VARIABLES) – simbabque 2012-07-16 13:30:04