我正在使用Ubuntu,Apache和Django构建一个网站。我想阻止人们不止一次填写并在我的网站上提交特定表格。我知道阻止一个坚定的用户改变他的IP地址,删除他的cookie等等几乎是不可能的;我正在寻找的东西将阻止临时用户重新提交。
在我看来,阻止来自同一IP地址的多个表单提交是实现我正在寻找的最佳方式。但是,我不确定我应该怎么做,以及我是应该从Apache还是从Django这样做。有什么提示吗?
编辑:我希望防止故意重新提交,而不仅仅是无意的双重提交。例如我有一项调查,我想阻止人们多次投票。
答案 0 :(得分:5)
如果您主要关注的是阻止某人编写脚本并多次自动提交表单,您可能需要在表单中使用CAPTCHA。
答案 1 :(得分:3)
几个整个国家都是NAT,还有一些(大多数?)大型跨国公司,其中每个都有数十万用户。通过IP阻止任何事情都是糟糕的想法。
转而选择一个cookie,这样就可以了。您也可以让用户登录,在这种情况下,您可以知道该表单是否为该登录重复提交。
答案 2 :(得分:1)
我会使用会话ID,并将表单提交存储在具有会话ID,时间戳和可选的某种表单标识符的表中。然后,当提交表单时,您可以检查表格以确保它在一段时间内没有发生。
答案 3 :(得分:1)
对IP地址和/或cookie的过滤都很容易解决,但是由于浏览器出现问题,不耐烦等等,它们会阻止临时用户多次意外提交相同的内容。
如果你想要比你更好的东西你可以实现登录,但当然这会阻止很多用户做出响应。
答案 4 :(得分:1)
在隐藏字段中向表单添加单调递增的ID号。
在提交每个表单时,将id记录在“used”列表/映射中(或标记它使用,或者其他任何实现细节)。
如果您第二次获得相同的ID(如果它已经在您使用过的地图中),请通知他们双重提交的用户。
答案 5 :(得分:1)
虽然没有什么是万无一失的,但我会建议这样的事情:当用户加载带有表单的页面时,会设置一个cookie,并且cookie的值附加一个固定的秘密字符串和md5值写入表单上的隐藏字段。确保每次用户访问表单时都会生成一个新值。
当用户提交表单时,检查cookie值和表单值是否匹配,用户所提供的cookie之前是否已用于提交表单,以及引用者ID是否与表单的URL匹配。可选地,您确保在过去的2分钟内没有尝试从该IP发布(足够快,对大多数人来说无关紧要,但速度慢到可以减慢机器人的速度)。
要解决此问题,用户必须制作一个加载页面的脚本,存储Cookie并提交正确的值。这比用户只需提交表单要困难得多。
添加基于编辑:我会阻止Django框架中的用户。这允许您向用户呈现更好的错误消息,并且您只能从该表单中阻止它们。
答案 6 :(得分:1)
这是一个身份验证和授权问题,它们是相关但不相同的。为了管理授权,您必须首先验证(可靠地识别)用户。
如果你想让这种抗拒故意滥用,那么你不仅会得到用户名和密码,还会要求提供个人识别用户的信息,以及银行的内容。询问您何时打开帐户。流血的心和左撇子会无休止地侵犯隐私,但实际上你和银行的做法完全相同,原因完全相同。
这是很多工作,可能会受到法律的影响。你真的想这么做吗?
答案 7 :(得分:1)
以下方法都相对简单,无论是实现还是黑客攻击。任何拥有Firebug和一点知识的人都不会眨眼。
以下JavaScript使用Mootools,我没有检查它是无bug的。我知道JQ语法几乎完全相同,原始JS足够相似,所以重点应该是明确的。
1)如果表格是通过AJAX提交的,您可以在提交之前进行检查(对不起,如果我只是说明显而易见的话)。
var sent = 0;
$('myForm').addEvent('submit', function(){
if(!sent) this.send();
})
这非常简单,并且在重新加载页面之前非常有效。
2)添加JavaScript cookie。再次,使用Mootools:
$('myForm').addEvent('submit', function(){
if(Cookie.read('submitted')){ alert('once only'); return false;}
else{ Cookie.write('submitted', 1); return true; }
})
即使用户重新加载页面,这也会有效。
3)添加Python会话cookie。我不熟悉Python,但如果它像PHP一样,这将没有方法2的优势。在任何一种情况下,用户都可以使用FireCookie或WebDeveloper工具栏(或其他浏览器上的等价物)删除cookie并重新加载页面
4)添加Flash cookie(使用Flex)。这是理想的选择 - Flash Cookie存储在不同的位置,不明显,并且很难删除。唯一的缺点是你需要创建并嵌入一个小swf。
5)将值存储在隐藏字段中,并检查该值。 可以将哈希添加到内部链接,以确保即使页面被导航,该值仍然填充。
6)可以为每位访客增加一个URL(或使用htaccess的自定义URL)播放其他游戏。
swf cookie是上述最好的想法,虽然它可以与其他人结合使用。