84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
如何实现同一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字段信息,否则提示相关限制信息。
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地址,然后你就知道怎么做了,不过这种方法对于某些客户使用代理上网的话就有问题了。
使用缓存去检测