|
|
 |
| 相似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
|
|