84669인 학습
152542인 학습
20005인 학습
5487인 학습
7821인 학습
359900인 학습
3350인 학습
180660인 학습
48569인 학습
18603인 학습
40936인 학습
1549인 학습
1183인 학습
32909인 학습
如何实现同一IP提交表单的次数限制?比如说:我开发了一个投票程序,要求同一IP在两个小时内只能投一次票(即成功提交一次)。该如何写代码?(初学者,问题可能有些白痴,请耐心回答,谢谢)
业精于勤,荒于嬉;行成于思,毁于随。
关注微信公众号:phpgod(PHP技术大全),每日精彩分享不间断。第一步,创建表,DDL如下:CREATE TABLEip_limit(idint(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',ipchar(16) NOT NULL DEFAULT '0' COMMENT 'ip地址',form_idint(11) NOT NULL DEFAULT '0' COMMENT '表单id',last_submit_timeint(11) NOT NULL DEFAULT '0' COMMENT '上次提交表单时间',success_submit_timesint(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字段信息,否则提示相关限制信息。
ip_limit
id
ip
form_id
last_submit_time
success_submit_times
保存到redis,设置生存周期为2小时键为ip,值为访问次数。每次投票检查次数,超过返回错误,未超过限制就允许投票,并把次数加一
缓存到文件sessionredis等内存数据库MySQL等SQL数据库
都可以实现
各有优劣,速度,效率,看如何取舍。当然也要看服务的精确性。
如果用client的javascript来限制提交次数的话也不可靠,如果有人直接改javascript的话就可以绕过这个限制。可以从服务端的request里面可以拿到客户端的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地址,然后你就知道怎么做了,不过这种方法对于某些客户使用代理上网的话就有问题了。
使用缓存去检测