2011-03-26 285 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重新加载文件的内容并将其保存到内存中以获取最新的黑名单。