我正在寻找创建一个简单的网络表单,我想“劝阻”用户多次填写表单。表单的度量标准用于统计分析,每次用户填写并重新提交表单时,结果集通常会更改,从而进行分析。
虽然我们不希望BLOCK重新尝试(知道重新尝试也是有价值的信息),但我们确实想警告用户:“嘿,看起来你最近填写了这个。你是不是你确定要再次填写它吗?“
这里需要注意的是,我们希望尽量减少收集到的可识别个人身份信息的数量。
以客户IP存储cookie是最好/最简单的方法吗?或者有一个简单的方法来缓存IP服务器端xx的时间,所以我们可以运行比较说“嘿,我想今天早些时候这个人试图访问我。我应该发出警告”。
答案 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());
}