2011-03-26 283 views
0

Iv'e目前一直在爲我公司開發一個相對較小的項目,它基本上是node.js中的代理,此時的功能相對簡單字符串搜索/通配符匹配

  • 緩存
  • HTTP(S)
  • 黑名單
  • 配置

林在那裏IM建立黑名單制度的階段,我的黑名單文件是必須在同一行的每個列入黑名單的網站一個純文本文件。

現在黑名單將被修建,這樣你可以在以下類型的黑名單值:

  • google.com
  • google.com/path
  • ww2.google.com/path
  • 202.55.66.201
  • 202.55.66。[100-200]

現在瓦特ithin node.js中,當收到請求時我有提供給我的是從客戶端請求的URL,這將隨後在IP緩存文件擡頭,如果不存在的話它就會被ping通和我得到的IP爲請求。

所以具有的信息的幾個位在手,1爲域,2是所述IP,3是所述端口。

現在的問題是找到最快的方法來檢查這些值與基於文件的黑名單。

由於這些值不直接查找林不知道,如果把再進一個對象,這樣做的:

if(ip in blacklist || domain in blacklist || fullUri in blacklist) 
{ 
    //block 
} 

即使我沒有這樣做,它不會真的是有益的,因爲我不能查IP範圍等,它缺乏對更苛刻的網站黑名單技術的支持。

我想某種數據庫系統的,但是這是我想避免的,所以基本上什麼IM問的是有一些方法來,而不會造成太多的開銷對數據文件執行通配符查詢。

回答

2

我認爲,更有效的辦法是循環中的文件的每一行,和比較反對您的信息 - 也將使模式匹配 - 因此,在僞代碼:

each file as line 
    if line equal ip or line eq domain or line match 134.567.987.[0-9]{1-3} 
     then block and break 
+0

如果有2K個域名被列入黑名單,你的意思是我應該這樣做(2個直接查找和1個正則表達式)* 2000每個請求,而不是經常性的epressions我寧願使用字符串函數,如split,以獲得[100-200]的最小值和最大值,然後爲最後一個已知點和「<=>」做一個子字符串來比較範圍,但仍然覺得它可以更好地處理,比如{{FULL_IP:{a,b ,c,d}} abcd是ip的每個段。 – RobertPitt 2011-03-26 22:23:03

+0

將是您設計的任何測試的2K - 假定您正在閱讀單行上包含黑名單項目的文本文件。你可以把它放在一個正則表達式中('if line match(domain | ip | 134.567.987。[0-9] {1, 3})'),但是我懷疑性能會有很大的不同。 – 2011-03-26 22:31:04

0

您可以在加載文件啓動你的nodejs進程。然後,您可以處理整個文件並分離在3門陣列(IP,域和端口)。上存儲器

在搜索元素是快的。

然後,您可以有一個setInterval重新加載文件的內容並將其保存到內存中以獲取最新的黑名單。