如何?同一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地址,然後你就知道怎麼做了,不過這種方法對於某些客戶使用代理上網的話就有問題了。
使用緩衝去檢測