2011-08-21 25 views
0

這就是我正在努力完成的事情,我認爲這很容易,然後我就會做出來。使用MySQL/PHP/JS限制IP地址每小時可以點擊1個確定鏈接的次數。

我想要一個主頁上的鏈接,每小時只能按IP地址點擊兩次。該鏈接會導致一個「提交您的電子郵件」頁面,其中有實際的表單向我們發送您的詳細信息。

我想我必須有一個MySQL數據庫才能完成這個工作 - 我通過在表中記錄訪問者的訪問時間/日期來猜測,然後下次他們點擊按鈕 - 將其與細節進行比較。錯誤的細節,新的頁面不加載。好的細節,新的頁面加載。

我該如何做到這一點?我嘗試了幾句沒有真正成功的谷歌搜索,只是談論'是的,你需要這樣做,或者你必須這樣做',但沒有解釋。有人可以借用另一個建議 - 我張開耳朵。謝謝。

回答

2

您可以在表格中存儲您的ip_address和時間點擊(日期時間字段)。我會將ips存儲爲整數,並使用inet_aton()和inet_ntoa()函數。

select count(*) as last_hour_clicks 
from table 
where ip_address = inet_aton('x.y.z.k') and click_time >= now() - interval 1 hour 

如果點擊次數等於2,則您拒絕另一次點擊。

+0

我怎麼會實際上添加到瀏覽過的頁面來實現呢?總noob-我知道。 – krispie

+0

這裏沒有代碼標籤,..? – krispie

0

您可以使用cookie來存儲每次點擊客戶端的時間並確定是否顯示鏈接。如果用戶刪除/修改cookies,這很容易被用戶繞過,但無論你做什麼,他們都可以簡單地爲「提交你的電子郵件」頁面添加書籤,並儘可能多地訪問它,這樣cookies就可以工作。否則會阻止非技術用戶。

您應該在表單提交後使用服務器端邏輯來確定是否接受它。

+0

我不能只使用MySQL和PHP使每個IP地址的鏈接可點擊兩次?不知道如何......「然後,您應該在提交表單之後使用服務器端邏輯來確定是否接受它。」......我需要更多的幫助,然後「是的,你需要這個,或者你必須這樣做',但沒有解釋。 – krispie

1

如果你的目的是糾正一個簡單的用戶錯誤,而不是防止DDOS攻擊,那麼使用MySQL是現實的。如果不使用Memcache,因爲MySQL會破壞你的服務器。

但是,您不想使用計數(*),因爲它們非常慢。而是使用INT基礎結構,如:

CREATE TABLE `clicks` (
`ip` INT UNSIGNED NOT NULL , 
`time1` INT UNSIGNED NOT NULL , 
`time2` INT UNSIGNED NOT NULL , 
PRIMARY KEY (`ip`) 
) ENGINE = MYISAM 

插入:

INSERT INTO clicks (ip,time2) VALUES (INET_ATON('{$_SERVER["REMOTE_ADDR"]}'),UNIX_TIMESTAMP()) ON DUPLICATE KEY UPDATE time1=time2, time2=UNIX_TIMESTAMP() 

檢查:

SELECT INET_NTOA(ip) FROM clicks WHERE ip=INET_ATON('{$_SERVER["REMOTE_ADDR"]}') AND time1+3600-time2+3600<=UNIX_TIMESTAMP(); 
+0

@ gustav-真棒,現在我們正在某個地方。但是我不知道究竟該怎麼處理它......每個部分放什麼頁面?怎麼樣連接到數據庫?我是MySQL + PHP的noob,請問您能否賜教? – krispie

+0

@krispie嗯,我可以在這裏提供一些鏈接:[Connecting](http://php.net/manual/en/function.mysql-connect.php) - > [Creating the structure](http:// www .w3schools.com/php/php_mysql_create.asp) - > [插入](http://www.w3schools.com/php/php_mysql_insert.asp) – Gustav

相關問題