强力档正则表达式 - 若干年后自己都快看不懂了^_^

blog最主要还是作为自己积淀的一个总结,所以逛逛电脑上许久未曾到过的地方先,果不其然,下面这段代码甚至让自己也汗了一把,仔细想了想,应该是做网络安全审计的时候,从POST数据包中,窃取可能存在的用户名和密码的代码,罪过啊罪过,好在只是验证测试性质,未实际投入使用

估计不会有什么复用价值,所以其它不多说了,上代码,一边精读《精通正则表达式》,一遍写的,顺便赞一下这本书,以及强大的perl!

 

perl代码(JE居然木有perl高亮。。。):

 

 

# 用法 perl findUser.pl 文件夹

$dir=$ARGV[0];

#print "(debug) dir is $dir , \n";

if(opendir DD,"$dir"){

    @dirList = readdir(DD);
    #print @dirList;
    closedir(DD);

    foreach  $mydir (@dirList){
        
        
        if($mydir=~/txt$|CONTENT$/){
            
        #print "(debug) var mydir is $mydir \n";
        
        open(MYFILE,$mydir)|| die ( "cannot open $mydir\n");

#########################################

        # 解析头
        while($line = <MYFILE>){
        
            #print $line;
            
        	if($line =~ m/Host:\s*(\S+)/i){
        		
        		$host = $1;
        		#print "\nhost:====$host====\t";
        		#last;
        	}
        	
        	# 头体分割行
        	#if($line =~ m/^\s$/m){
        	#	last;
        	#}
        	
        #}
        
        #while($line = <$mydir>){
        	if($line =~ m/
        	        # 匹配用户名的部分
        	        (?:&|\s)
        	        (u(?:se?r)?|login|account|member|alias|chat|nick)?_?
        	            # 用户名不规则,如果前半部分出现,则后半部分可以不出现
        	            # 如果前半部分没出现,则后半部分必须出现
        	            (?(1)
        	                (?:name|id|key)?
        	                |(?:name|id|key)
        	            )
        	        # 这里就是保存到的用户名了
        	        =
        	        ([^&\s]+)
        	        
        	        
        	        # 用户名和密码之间,是不是一定有一个&?,用户名是不是一定在密码之前?
        	        # 有密码在用户名之前的,目前还没有处理这种情况
        	        #&(?:.+&)*
        	        
        	        # 先找到用户名了才去找密码
        	        (?(2)
        	            (?:	        
                	        (?:&|\s)
                	        # 匹配密码的部分,QQ密码可以为空格,密码为(多个)空格如何处理?\s包括空格么?
                	        (?:(?:user)?|(?:login)?)
                	        # 还需要优化,搞得不清楚 password passwords pwd pwds pass key keys
                	        (?:p(?:ass)?w(?:or)?ds?|key|pass)
                	         # 这里就是保存到的密码了
                	        =
                	        ([^&\s]+) 
            	        )
        	        )
        	        # i-忽略大小写,x-可以对正则表达式排版
        	        /ix
                ){
                
                $name=$2;
                $pass=$3;
        
                print "host:==$host==\tname:==$name==\tpass:==$pass==\n";
                #last;
            }
            
        }


#########################################
        }
    }
}


 

 

 

你可能感兴趣的:(正则表达式,qq,Blog,perl)