欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

如何实现同一IP提交表单的次数限制?

程序员文章站 2024-02-04 18:08:04
...
如何实现同一IP提交表单的次数限制?
比如说:我开发了一个投票程序,要求同一IP在两个小时内只能投一次票(即成功提交一次)。该如何写代码?
(初学者,问题可能有些白痴,请耐心回答,谢谢)

回复内容:

如何实现同一IP提交表单的次数限制?
比如说:我开发了一个投票程序,要求同一IP在两个小时内只能投一次票(即成功提交一次)。该如何写代码?
(初学者,问题可能有些白痴,请耐心回答,谢谢)

关注微信公众号:phpgod(PHP技术大全),每日精彩分享不间断。
第一步,创建表,DDL如下:
CREATE TABLE ip_limit (
id int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
ip char(16) NOT NULL DEFAULT '0' COMMENT 'ip地址',
form_id int(11) NOT NULL DEFAULT '0' COMMENT '表单id',
last_submit_time int(11) NOT NULL DEFAULT '0' COMMENT '上次提交表单时间',
success_submit_times int(11) NOT NULL DEFAULT '0' COMMENT '成功提交次数',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
第二步,需求逻辑,描述如下:
当用户进行第一次提交时,插入一条记录到ip_limit表,并记住ip,form_id,last_submit_time,success_submit_times等字段信息,当用户进行更多次提交时,先查询对应ip对于指定form_id的last_submit_time,如果current_time - last_submit_time>2*3600,就更新last_submit_time,success_submit_times字段信息,否则提示相关限制信息。

保存到redis,设置生存周期为2小时
键为ip,值为访问次数。
每次投票检查次数,超过返回错误,未超过限制就允许投票,并把次数加一

缓存到文件
session
redis等内存数据库
MySQL等SQL数据库

都可以实现

各有优劣,速度,效率,看如何取舍。当然也要看服务的精确性。

如果用client的javascript来限制提交次数的话也不可靠,如果有人直接改javascript的话就可以绕过这个限制。
可以从服务端的request里面可以拿到客户端的ip地址,然后你就知道怎么做了,不过这种方法对于某些客户使用代理上网的话就有问题了。

使用缓存去检测

相关标签: php