时间:2021-07-01 10:21:17 帮助过:5人阅读
如何实现同一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地址,然后你就知道怎么做了,不过这种方法对于某些客户使用代理上网的话就有问题了。
使用缓存去检测