心路
死生契阔,与子成说。执子之手,与子偕老。

  • 首页
  • 关于
  • MyIcy
  • 琐记(413)
  • 技术(221)
  • 八卦(105)
  • 读书(20)
  • RSS
  • 很感谢云舒兄弟去年推荐到阿里...
  • 信春哥,得永生....
  • 据说胡适有36个博士学位...
  • 我给你力吧...
  • 当前Blog无任何评论...
  • 最新论证:先有的嫖客后有的鸡...
  • 好的呀,非常感谢! 我这个当...
  • 云老大,将你的程序修改了下,...
  • cnbeta上有中文的...
  • 当前Blog无任何评论...
  • 舒舒,不要把我给你的邮件随便...
  • 本人有项目想和你合作,有意向...
  • hehe
  • 大哥,你好,Ttyutils的rpm或...
  • 很好
  •  
     
  • 黑小子's Blog
  • Nick's blog
  • sbilly的乌托邦
  • 80 sec
  • 段段的blog
  • 肉肉的洗手间
  • JY美女
  • 小叶子的空间
  • 螺螺的blog
  • 忽尔今秋
  • Icy's Blog
  • 虚拟面包
  • 涛涛的blog
  • Tomy's blog
  • 王俊的blog
  • 狐狸的叶子
  • demonalex's blog
  • Super*Hei's Blog
  •  
    Powered by: SaBlog
    相似URL的判定
    Submitted by 云舒 on 2010, January 10, 10:18 PM. 技术

    摘要:我是在洗澡的间隙,坐在马桶上写这篇博客的。因此,凌乱、间断、错漏肯定是有的,只是我怕思路断了会忘记,所以还是记录下来先。前些时候写过一个利用Bloom Filter消除重复URL的文章,今天想了下相似URL判定的方法。URL相似度的判定,在WEB黑盒扫描工具中是很有用的。

    最开始想到的是URL也是一个特殊的字符串,那么URL的相似度判定就转化成了字符串相似度判定了。这个问题已经有了很多算法,比较著名的有俄国人的Edit Distance。但是仔细思考后,这个算法做普通字符串相似度比较是可以的,但是作为URL这种特殊的内容来比较则会有很多问题。举例来说,http://www.xxx.com/123.html到http://www.xxx.com/456.html的距离(相似度)与到http://www.xxx.com/abc.html的距离是一样的,但是对于URL来说前面两个是相似的URL,第一个与第三个则不是,这属于特殊条件下的误判。

    于是我想到,URL是有结构的,也许我们可以利用这种结构来做判定。对于人来说,一眼就能看出http://video.sina.com.cn/ent/s/h/2010-01-10/163961994.shtml和http://video.sina.com.cn/ent/s/h/2010-01-10/163961890.shtml是相似的URL。但是与http://video.sina.com.cn/ent/m/c/2010-01-10/164661995.shtml呢?则未必,这取决于你如何看待目录本身,可以认为是相似的,也可以认为不是。基于结构来判断URL相似度,我的想法是去掉数字这种东西本身,最终只保留一个结构。字符串是否也需要去掉自身只保留结构,或者保留存在长度的结构,可以根据情况来灵活取舍。

    随手写了一段脚本印证想法,这里我没有去掉字符串,仅仅将数字转变成结构了。URL中的参数,我去掉了值,其实这里的值也可以保留结构本身的。冷……不写了。

    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $url1 = 'http://video.sina.com.cn/ent/s/h/2010-01-10/163961994.shtml?a=1&b=10';
    my $url2 = 'http://video.sina.com.cn/ent/m/c/2010-01-10/164661995.shtml?b=2&a=5';
     
    my @array1 = split( ///, $url1 );
    my @array2 = split( ///, $url2 );
     
    if( @array1 != @array2 )
    {
    	print "they are not the similar url.\n";
    	return;
    }
     
    for( my $i = 3; $i < @array1; $i ++ )
    {
    	$array1[$i] =~ s/d+/d/g;
    	$array2[$i] =~ s/d+/d/g;
     
    	#we should compare char sometimes.
    	#$array1[$i] =~ s/[a-zA-Z]/c/g;
    	#$array2[$i] =~ s/[a-zA-Z]/c/g;
    }
     
    my $flag1 = index( $array1[-1], '?' );
    my $flag2 = index( $array2[-1], '?' );
    my $tmp1 = substr( $array1[-1], $flag1 + 1 );
    my $tmp2 = substr( $array2[-1], $flag2 + 1 );
     
    if( $flag1 != -1 )
    {
    	$array1[-1] = substr( $array1[-1], 0, $flag1 );
    	$array2[-1] = substr( $array2[-1], 0, $flag2 );
     
    	my @tmp_arr = split( /&/, $tmp1 );
    	for( my $i = 0; $i < @tmp_arr; $i ++ )
    	{
    		$tmp_arr[$i] =~ s/=.*//g;
    	}
    	$array1[-1] = $array1[-1]. '?'. join( '&', sort @tmp_arr );
    }
     
    if( $flag2 != -1 )
    {
    	my @tmp_arr = split( /&/, $tmp2 );
    	for( my $i = 0; $i < @tmp_arr; $i ++ )
    	{
    		$tmp_arr[$i] =~ s/=.*//g;
    	}
    	$array2[-1] = $array2[-1]. '?'. join( '&', sort @tmp_arr );
    }
    my $result1 = join( '/', @array1 );
    my $result2 = join( '/', @array2 );
     
    print $url1, "\n\t==>\n\t    ", $result1, "\n\n";
    print $url2, "\n\t==>\n\t    ", $result2, "\n";
     
    if( $result1 eq $result2 )
    {
    	print "\nthey are the similar url\n";
    }
    else
    {
    	print "\nnot\n";
    }
    脚本非常的乱,不过只是为了验证想法而已,没有关系。
    
     
    评论
    Post by System on 2010, January 11, 1:05 A
    Post by sdfdsf on 2010, January 11, 1:06 AM
    perl 达人
    Post by 冒充的人 on 2010, January 11, 10:20 AM
    有味道的博客
    Post by ro on 2010, January 11, 10:26 AM
    用相似度和结构判定我都用过,
    还有一种是分支判定,效果也不错
    Post by linx on 2010, January 11, 11:07 AM
    最近也有思考这个问题
    Post by leg0 on 2010, January 11, 10:54 PM
    看了博主的一些文章还是被博主技术能力所折服,最近看到关于ssl中间人攻击的新办法sslstrip,感觉思路还是挺好的,不知道博主什么时候能用vc6写一个让大家学习学习。我有个问题想请教,要想进行中间人攻击,一个办法是先进行arp欺骗,使被骗主机的数据流通过本机来转发。但是仅仅是转发而已,本机怎么能建立和被骗主机的sock链接呢?谢谢
    Post by zhouli76 on 2010, January 20, 9:19 AM
    如果是SSL中间人,需要伪造证书的。这种时候,作为攻击者监听443端口,被骗的客户端以为自己连接上的是真正的服务器,根本不知道攻击者的存在。(由ARP欺骗进行DNS欺骗,或者在网关处路由转发进行)。
    Post by 云舒 on 2010, January 20, 10:20 AM
    云舒大师您没有明白我的问题,我作为转发数据流的机器,使用混杂模式捕获网卡上的数据流,被骗客户端的链接申请在我这里被更改MAC地址后转发给网管,由网关转发到互联网。我如何能冒充服务端把客户端的链接申请sock接下来,然后完成连接呢,我直接打开相关端口的listen,可以听到吗?谢谢
    Post by zhouli76 on 2010, January 20, 4:09 PM
    听到了,晚点回复你。
    关于这个事情,你完全理解错了。
    Post by 云舒 on 2010, January 20, 6:16 PM
    中间人攻击不是你理解的这样子。假设A和B在同一个内网,C是一个WEB服务器,开放HTTPS服务。B想要劫持A和C之间的数据,B必须让A以为B就是C。混杂模式捕获数据是没有意义的,需要做的是先DNS欺骗,A解析域名的时候将域名解析到B的IP地址。至于如何做DNS欺骗,则需要ARP欺骗作为基础,你需要先理解ARP欺骗的原理,然后可以看http://www.xfocus.net/articles/200303/498.html理解DNS欺骗。

    其实关于HTTPS劫持我简单的写过一篇博客,详细说起来就麻烦了。
    Post by 云舒 on 2010, January 22, 5:05 PM
    谢谢,我学习一下,有问题再问
    Post by zhouli76 on 2010, January 25, 10:59 AM
    HttpsMiM已经学习了,收获很大,非常感谢。但是在做SSL服务端的时候还是遇到了点问题,使用您给的证书初始化的时候总是报错,也不知道为什么,想深入研究一下证书的函数,MakeCert.exe这个代码能提供吗?原来的地址无法下载,网上也找不到。谢谢
    Post by zhouli76 on 2010, February 10, 6:19 PM
    MakeCert.exe的代码微软发布了吗
    Post by 冒充的人 on 2010, February 10, 9:41 PM
    添加评论
    您的名字:
    您的E-mail:
    评论内容:
    验证码:
    Processed in 0.351202 second(s)