2011-02-04 56 views
3

我運行一個大型論壇,並像其他人一樣,與垃圾郵件發送者/機器人有問題。有大量已知的垃圾郵件IP列表,您可以下載並以htaccess格式使用,但我唯一關心的是文件大小。所以我想這個問題是多大太大了,因爲它會爲每個用戶加載。添加所有的IP到它大約100kb。IP禁止 - 最有效的方式?

是否有替代品可以減少開銷?可能用php做,或者由於文件大小和檢查IPS等原因會導致一些重負載?

任何意見將不勝感激。

感謝,

史蒂夫

回答

0

好吧,你正在建設地址的數據庫,對不對?爲它使用數據庫產品不是有用的嗎?如果你還沒有,SQLite可以完成任務。

+0

這是一個靜態列表,只有網絡服務器將讀取它,所以可能不會。當你有改變數據和特別的時候,DBS會發揮全部的力量。與多個數據訪問器。對於一個靜態的IP列表檢查這將是開銷,雖然人們可能會爭論,如果它真的是太多的開銷。 (雖然我剛剛注意到在閱讀其他答案時,查詢它可能實際上在DBS中更加高效,包括索引列和所有內容。) – Kissaki 2011-02-04 09:51:30

+0

@Kissaki:嗯,這取決於很多變量(分析在此非常重要)。如果OP已經有某種數據庫,這將更容易。順便說一句,「DBs對於只讀數據並不真正有用」是一種常見的誤解,因爲錯誤地反轉了「文件不適合併發讀寫訪問」 - 使用DB可以提高只讀性能(或殺死它,如果它做錯了,當然)。在特定的環境中測試和測量*是關鍵 - 一種尺寸永遠不適合所有人。 – Piskvor 2011-02-04 09:56:13

1

有幾個選項:

  • 您可以將存儲塊列表到數據庫中。查詢那裏比用PHP中的循環更有效。
  • 您可以使用array_map(ip2long())預處理列表以節省內存並可能查找時間。
  • 你可以將IP列表打包成一個正則表達式,也許可以通過優化器(Perl Regexp :: Optimizer)來運行它。 PCRE測試再次比foreach和strpos測試更快。 $regex = implode("|", array_map("preg_quote", file("ip.txt")));

但是,然後,IP塊列表往往不是非常可靠。也許你應該實施其他兩種解決方法:隱藏的表單域來檢測愚蠢的機器人。或者驗證碼來阻止非人類(不是非常方便用戶,但解決了問題)。

+0

啊,關於IP禁止有效性的好處。前段時間我遇到過這個問題,然後去了「保持IP,阻止用戶」的方式:http://stackoverflow.com/questions/3513445/keeping-a-troll-out-ip-bans-considered-有害的東西,而不是 – Piskvor 2011-02-04 09:51:21

+0

@Piskvor:我有同樣的問題。雖然一些知識產權禁止名單可以緩解這個問題,但它只能對付未經專人處理的垃圾郵件製造者。 – mario 2011-02-04 09:55:16

0

也許你想阻止垃圾郵件的好方式 - Captcha

我相信愛因斯坦曾經說過:問題不能在創建它們:)意識同級解決

+0

感謝您的回覆。不過,我已經使用了recaptcha,但仍然得到機器人通過。但是,它確實削減了這一數額。 – Steve 2011-02-04 10:19:16

0

除非你已經有問題,你的服務器上的負載,你可能不會注意到,與100K .htaccess文件的區別。 可能有更快的替代方案,可能包括使用iptables或使用排序的ip列表,這些列表可以更快搜索匹配,甚至可以使用數據庫(儘管單個數據庫查詢的開銷可能會壓縮索引的好處表),但它可能不值得的努力,除非你運行高負載的論壇。

您也可以嘗試使用captcha或類似的。這個方向的一切都是在付出代價的,沒有什麼是100%可靠的。

2

通常比IP禁令更有效的方法。例如,只有表單中的隱藏字段纔會填寫,或者需要JavaScript或Cookie來提交表單。

對於IP禁止,我不會使用.htaccess文件。根據您的網絡服務器,它可能會讀取每個請求的htaccess文件。我肯定會將IP禁令添加到您的Web服務器虛擬主機配置中。這樣我就可以確定網絡服務器將它保存在RAM中,而不是一次又一次地讀取它。

通過PHP來做它也是一個選項。這樣,您也可以輕鬆地將禁令限制爲表單,例如在論壇中註冊。

0

請勿使用此類IP列表。他們很可能會過時,你可能會阻止錯誤的請求。只要投資於好的或更好的驗證碼,並且只是時時阻止IP,如果他們真的在做某種拒絕服務攻擊。

0

在.htaccess在你的DocumentRoot後:

Order Deny,Allow 

附加一行:

Deny from <black ip>