限制用户只填写表格一次

时间:2011-09-12 23:33:25

标签: c# webforms

我正在寻找创建一个简单的网络表单,我想“劝阻”用户多次填写表单。表单的度量标准用于统计分析,每次用户填写并重新提交表单时,结果集通常会更改,从而进行分析。

虽然我们不希望BLOCK重新尝试(知道重新尝试也是有价值的信息),但我们确实想警告用户:“嘿,看起来你最近填写了这个。你是不是你确定要再次填写它吗?“

这里需要注意的是,我们希望尽量减少收集到的可识别个人身份信息的数量。

以客户IP存储cookie是最好/最简单的方法吗?或者有一个简单的方法来缓存IP服务器端xx的时间,所以我们可以运行比较说“嘿,我想今天早些时候这个人试图访问我。我应该发出警告”。

3 个答案:

答案 0 :(得分:1)

具有常量值的Cookie应该足够,甚至不是IP。如果用户没有清除cookie,您就会知道用户已经填写了表单。

答案 1 :(得分:1)

我之前使用的简单解决方案是在用户填写的HTML表单中放置一个不可见的时间戳。如果您提交两次相同的时间戳,则表示已重新提交。

如果您担心篡改,可以随时混合/加密时间戳。

这也可能只是一个随机的唯一标识符,我选择了一个时间戳,以便知道用户填写表单的时间(大致)。

这基本上就像会话cookie一样,但可能会被视为更“私密”,因为客户的计算机无需记住,因此不能像某些跟踪Cookie广告网站那样使用它。

缺点是此方法要求客户端/代理不会缓存表单,因为它“更改”每个请求。

答案 2 :(得分:0)

这里有两个问题,用户多次点击提交按钮,用户在另一个时间点填写表单。

对于第二个我可以看到两个非常简单的解决方案会推荐会话cookie,只是cookie用户机器,不要让他们再次看到表单,或者要求提供一些信息,如电子邮件地址,然后检查DB如果之前已经使用过,如果是这样则忽略新的表单细节。

对于多表单提交,您可以使用此代码,这将禁用按钮onclick。

   //
   // Disable button with no secondary JavaScript function call.
   //
   public static void DisableButtonOnClick(Button ButtonControl)
   {
       DisableButtonOnClick(ButtonControl, string.Empty);
   }

    // Disable button with a JavaScript function call.
    //
    public static void DisableButtonOnClick(Button ButtonControl, string ClientFunction)
    {
        var sb = new StringBuilder(128);

        // If the page has ASP.NET validators on it, this code ensures the
        // page validates before continuing.
        sb.Append("if ( typeof( Page_ClientValidate ) == 'function' ) { ");
        sb.Append("if ( ! Page_ClientValidate() ) { return false; } } ");

        // Disable this button.
        sb.Append("this.disabled = true;");

        // If a secondary JavaScript function has been provided, and if it can be found,
        // call it. Note the name of the JavaScript function to call should be passed without
        // parens.
        if (!String.IsNullOrEmpty(ClientFunction))
        {
            sb.AppendFormat("if ( typeof( {0} ) == 'function' ) {{ {0}() }};", ClientFunction);
        }

        // GetPostBackEventReference() obtains a reference to a client-side script function 
        // that causes the server to post back to the page (ie this causes the server-side part 
        // of the "click" to be performed).
        sb.Append(ButtonControl.Page.GetPostBackEventReference(ButtonControl) + ";");

        // Add the JavaScript created a code to be executed when the button is clicked.
        ButtonControl.Attributes.Add("onclick", sb.ToString());
    }