2010-02-06 107 views
2

我的所有應用程序都是用PHP編寫的,bar 1腳本恰好創建了一個md5散列,稍後通過PHP腳本使用它。問題是他們不匹配。比較PERL md5()和PHP md5()

PERL:

#$linkTrue = 'http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking-signup.php' 
md5_hex($linkTrue); 

以及用於測試目的,我在PHP這樣做:

echo md5("http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking-signup.php"); 

都返回不同的值。有人知道爲什麼嗎?

編輯: 全PHP腳本

<?php 

echo md5("http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking-signup.php"); 

?> 

全PERL腳本(對不起它長)

#!/usr/bin/perl 
use strict; 
use warnings; 
use LWP::Simple; 
require LWP::UserAgent; 
sub trim($); 
use DBI; 
use Net::FTP; 
use Digest::MD5 qw(md5 md5_hex md5_base64); 

print "Content-type: text/html\n\n"; 
print "<html>\n<head>\n</head><body>\n"; 

my $ua = LWP::UserAgent->new; 
$ua->timeout(10); 
$ua->env_proxy; 
$ua->max_redirect(0); 

#my %get =(); 
#for (split /\&/, $ENV{'QUERY_STRING'}) { my ($key, $val) = split /=/; $val =~ s/\+/ /g; $val =~ s/%([0-9a-fA-F]{2})/chr(hex($1))/ge; $get{$key} = $val; } 
#my %post =(); 
#for (split /\&/, <STDIN>) { my ($key, $val) = split /=/; $val =~ s/\+/ /g; $val =~ s/%([0-9a-fA-F]{2})/chr(hex($1))/ge; $post{$key} = $val; } 
my %get = ('findAllPages' => 'true'); 
my %post = ('ki' => '############################'); 


sub trim($){ 
    my $string = shift; 
    $string =~ s/^\s+//; 
    $string =~ s/\s+$//; 
    return $string; 
} 
sub extention { 
    my($data) = @_; 
    if(substr(trim($data), -1) eq "/"){ 
     my @extArray = ('.html', '.php', '.htm', '.asp', '.shtml', '.aspx'); 
     foreach(@extArray){ 
     my $ext = $_; 
     my $testResponse = $ua->get('http://' . trim($data . "index" . $ext)); 
     my $testResponseCode = $testResponse->code; 
     if($testResponseCode == 200 || $testResponseCode == 301 || $testResponseCode == 302){ 
      return trim($data . "index" . $ext); 
      last; 
     } 
     } 
    }else{ 
     return $data; 
    } 
} 
if(defined($get{findAllPages}) && defined($post{ki})){ 
    my ($database, $hostname, $port, $password, $user); 
    $database = "##########"; 
    $hostname = "############"; 
    $password = "##########"; 
    $user = "#########"; 
    my $KI = $post{ki}; 
    # connect to the database 
    my $dsn = "DBI:mysql:database=$database;host=$hostname;"; 
    my $dbh = DBI->connect($dsn, $user, $password); 
    my $sth = $dbh->prepare("SELECT * FROM accounts WHERE KI = '$KI' ") or die "Could not select from table" . $DBI::errstr; 
    $sth->execute(); 
    if($sth->rows != 0) { 
     my $ref = $sth->fetchrow_hashref(); 
     my $domain = $ref->{website}; 
     my $DB_username = $ref->{db_name}; 
     my $DB_password = $ref->{db_pass}; 
     my $DB_ftpuser = $ref->{ftpuser}; 
     my $DB_ftppass = $ref->{ftppass}; 
     my $DB_ftpserver = $ref->{ftpserver}; 
     $sth->finish(); 
     $dbh->disconnect(); 

     chomp(my $url = trim($domain)); 
     # try and find full path 
     sub findFullPath { 

     my($link, $landingPage) = @_; 

     # strip ./ and/from beggining of string 
     $link =~ s/^(?:(?:\/)|(?:\.\/))//g; 

     # find out whether link is backtracing to previous folder 
     if($link =~ m/^\.\.\//) { # link desination is back tracing 

      if($landingPage =~ m/(?:(?:\.html)|(?:\.php)|(?:\.htm)|(?:\.asp)|(?:\.shtml)|(?:\.aspx))$/g) { 
       # find destination folder from landing page 
       my @folders = split("/", $landingPage);  
       #find size of array 
       my $foldersSize = scalar @folders; 
       delete $folders[$foldersSize - 1]; 
       $foldersSize = scalar @folders; 
       my @backFolders = ($link =~ m/\.\.\//g); # get rid of ../ 
       my $amountOfBackFolders = scalar @backFolders; # find how many folders back 
       for(my $x=0; $x < $amountOfBackFolders; $x++) { 
        my $numberToDelete = ($foldersSize - 1) - $x; 
        delete $folders[$numberToDelete]; 
       } 
       $landingPage = join("/", @folders); 
       $link =~ s/\.\.\///g; 
       return $landingPage . "/" . $link . "\n"; 
      } elsif($landingPage =~ m/(?:\/)$/g) { 
       my @folders = split("/", $landingPage);  
       #find size of array 
       my $foldersSize = scalar @folders; 
       delete $folders[$foldersSize - 1]; 
       $foldersSize = scalar @folders; 
       my @backFolders = ($link =~ m/\.\.\//g); # get rid of ../ 
       my $amountOfBackFolders = scalar @backFolders; # find how many folders back 
       for(my $x=0; $x < $amountOfBackFolders; $x++) { 
        my $numberToDelete = ($foldersSize) - $x; 
        delete $folders[$numberToDelete]; 
       } 
       $landingPage = join("/", @folders); 
       $link =~ s/\.\.\///g; 
       return $landingPage . "/" . $link . "\n"; 
      } else { 

      } 

     }else{ 
      if(substr($landingPage, -1) eq "/"){ 
       return $landingPage . $link; 
      }else{ 
       my @splitLandingPage = split("/", $landingPage); 
       my $amountSplit = scalar @splitLandingPage; 
       my $toDelete = $amountSplit - 1; 
       my $lastEntry = $splitLandingPage[$toDelete]; 
       if($lastEntry =~ m/(?:(?:com)|(?:co\.uk)|(?:net)|(?:org)|(?:cc)|(?:tv)|(?:info)|(?:org\.uk)|(?:me\.uk)|(?:biz)|(?:name)|(?:eu)|(?:uk\.com)|(?:eu\.com)|(?:gb\.com)|(?:gb\.net)|(?:uk\.net)|(?:me)|(?:mobi))$/g) { 
        return join("/", @splitLandingPage) . "/" . $link . "\n"; 
       }else{ 
        delete $splitLandingPage[$toDelete]; 
        return join("/", @splitLandingPage) . "/" . $link . "\n"; 
       } 
      } 
     } 
     } 

     # get HTTP details 
     my $response = $ua->get('http://' . trim($url)); 
     my $responseCode = $response->code; 
     my $responseLocation = $response->header('Location'); 

     # contintue only if status code is 200 or 301 
     if($responseCode != 200 && $responseCode != 301 && $responseCode != 302){ 
      print "<span class=\"red\"> error: http://" . trim($url) . "Domain name invalid, please use differnet domain name: http status - " . $responseCode . "</span><br />\n"; 
      die; 
     } 

     # change url if domain status eq 301 
     if($responseCode == 301 || $responseCode == 302){ 
     if($response->header('Location') =~ m/^http:\/\/www\./g) { 
      $url = substr($response->header('Location'), 11); 
     }elsif($response->header('Location') =~ m/^http:\/\//g) { 
      $url = substr($response->header('Location'), 7); 
     }else{ 
      $url = findFullPath($response->header('Location'), $url); 
     } 
     } 

     my @pagesArray = ($url); 
     my @pagesScannedArray; 
     my @mainPagesArray; 
     my @pagesNotScanned; 
     my $z = 0; 

     #print "\nGethering all valid links from " . $domain . "...\n\n"; 

     while (@pagesArray && $z < 100) { 
     # get the next in queue for proccessing 
     my $page = trim(shift @pagesArray); 
     if(! grep {$_ eq trim($page)} @pagesNotScanned) { 
      # check page http status 
      $response = $ua->get("http://" . trim($page)); 
      $responseCode = $response->code; 
      if($responseCode == 200 || $responseCode == 301 || $responseCode == 302){ 
       # change page url if 301 redirect 
       if($responseCode == 301 || $responseCode == 302){ 
        if($response->header('Location') =~ m/^http:\/\/www\./g) { 
        $page = substr($response->header('Location'), 11); 
        }elsif($response->header('Location') =~ m/^http:\/\//g) { 
        $page = substr($response->header('Location'), 7); 
        }else{ 
        $page = findFullPath($response->header('Location'), $url); 
        } 
       } 
       # connect to page and get contents 
       if(my $pageData = get "http://" . trim($page)) { 
        # get all links on page 
        my @pageLinksArray = ($pageData =~ m/href=["']([^"']*)["']/g); 
        # foreach link on the page 
        foreach(@pageLinksArray) { 
         my $link = trim($_); 
        # remove url if located on same domain 
        $link =~ s/(?:http:\/\/)?(?:www\.)?$url//g; 
        # if link is format we are looking for 
        if($link =~ m/(?:(?:\.html)|(?:\.php)|(?:\.htm)|(?:\.asp)|(?:\.shtml)|(?:\.aspx)|(?:\/))$/) { 
         # if link is outbound 
         if($link =~ m/^http:\/\//g) { 
          if(! grep {$_ eq trim($link)} @pagesNotScanned) { 
           if(! grep {$_ eq trim($page)} @mainPagesArray) { 
           push (@pagesNotScanned, trim($link)); 
           } 
          } 
         }else{ 
          # find full path for link 
          my $newUrl = &findFullPath(trim($link), trim($page)); 
          # if link has not already been claimed to be a main page 
          if(! grep {$_ eq trim($newUrl)} @mainPagesArray) { 
           # if link is not already in queue 
           if(! grep {$_ eq trim($newUrl)} @pagesArray) { 
           push (@pagesArray, trim($newUrl)); 
           } 
          } 
         } 
        } 
        } 
        if(! grep {$_ eq trim($page)} @mainPagesArray) { 
        push (@mainPagesArray, trim($page)); 
        } 
       } 
      }else{ 
       if(! grep {$_ eq trim($page)} @pagesNotScanned) { 
        if(! grep {$_ eq trim($page)} @mainPagesArray) { 
        push (@pagesNotScanned, trim($page)); 
        } 
       } 
      } 
     } 
     $z++; 
     } 

     if(scalar @mainPagesArray != 0) { 
     my ($database, $hostname, $port, $password, $user); 
     $database = $DB_username; 
     $hostname = "###########"; 
     $password = $DB_password; 
     $user = $DB_username; 

     # connect to the database 
     my $dsn = "DBI:mysql:database=$database;host=$hostname;"; 
     my $dbh = DBI->connect($dsn, $user, $password) or die " error: Couldn't connect to database: " . DBI->errstr; 

     print "\nTesting links' extentions from " . $domain . "...\n\n"; 

     my $root; 
     my $ftp = Net::FTP->new($DB_ftpserver, Debug => 0) or die "Cannot connect to some.host.name: [email protected]"; 
     $ftp->login($DB_ftpuser, $DB_ftppass) or die "Cannot login ", $ftp->message; 
     my @list = $ftp->dir; 
     if(scalar @list != 0) { 
      foreach(@list){ 
       if($_ =~ m/((?:www)|(?:public_html)|(?:htdocs))$/g){ 
        $root = $1; 
        last; 
       } 
      } 
     } 
     if($root eq "") { 
      print "error: could not identify root directory.<br />\n"; 
      die; 
     } 

     foreach(@mainPagesArray) { 
      my $webpage = &extention(trim($_)); 
      if(trim($webpage) ne trim($domain)){ 
       my $webpageQuote = $dbh->quote("http://www." . $webpage); 
       my $sth = $dbh->prepare("SELECT * FROM page_names WHERE linkTrue = $webpageQuote ") or die "Could not select from table" . $DBI::errstr; 
       $sth->execute(); 
       if($sth->rows == 0) { 
        print "http://www." . $webpage . "<br />\n"; 
        my $linkTrue = $dbh->quote("http://www." . $webpage); 
        my $string = ($webpage =~ s/^$domain//g); 
        my $linkFromRoot = $dbh->quote($root . $webpage); 
        my $page_name = $dbh->quote(""); 
        my $table_name = $dbh->quote(md5_hex(trim($linkTrue))); 
        my $navigation = $dbh->quote(""); 
        my $location = $dbh->quote(""); 
        $dbh->do("INSERT INTO page_names (linkFromRoot, linkTrue, page_name, table_name, navigation, location) VALUES ($linkFromRoot, $linkTrue, $page_name, $table_name, $navigation, $location)") or die " error: Couldn't connect to database: " . DBI->errstr; 
       } 
      } 
     } 
     }else{ 
     print "<span class=\"red\"> error: No pages where found. This CMS is designed for pre-existing sites. Please contact support for more information.</span><br />\n"; 
     } 
    }else{ 
     print "<span class=\"red\"> error: input key incorrerct.</span><br />\n"; 
    } 
}else{ 
    print "<span class=\"red\"> error: This area is forbidden please locate back to www.plugnplaycms.co.uk</span><br />\n"; 
} 

print "</body>\n</html>"; 

相信其對線274的代碼可能是混亂的,但它的我的第一次腳本與Perl,只在它一個星期。

事情我明白了。 $ dbh-> quote()在值周圍添加單引號。

http://www.themobilemakeover.co.uk/index.php
HEX:58030da397e8a071bc192e67744faeb3 VALUE:[ 'http://www.themobilemakeover.co.uk/index.php '] http://www.themobilemakeover.co.uk/about-us-the-mobile-makeover.php
HEX:569c081a2974da39758a3cbf3c3407d2 VALUE:[' http://www.themobilemakeover.co.uk/about-us-the-mobile-makeover.php '] http://www.themobilemakeover.co.uk/beauty-products-used.php
HEX:ac94f84cf6b27bca0c23cd6b0e0f1fc9 VALUE:[' http://www.themobilemakeover.co.uk/beauty-products-used.php'] http://www.themobilemakeover.co.uk/beauty-treatments.php
HEX :e88d7e8e16ffc0a72b56a884d4c6c06b VALUE:['http://www.themobilemakeover.co.uk/beauty-treatments.php'] http://www.themobilemakeover.co.uk/contact.php
HEX:8924fa24bdde1c4e072f99826d957b77 VALUE:[」 http://www.themobilemakeover.co.uk/contact.php '] http://www.themobilemakeover.co.uk/pamper-parties.php
HEX:1f2fae70048359734a9d1b3ca29cce55 VALUE:[' http://www.themobilemakeover.co.uk/pamper-parties.php '] http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking.php
HEX:9961f75109590c3924e4018768ecd44e VALUE:[' http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking.php '] http://www.themobilemakeover.co.uk/sitemap/index.php
HEX:fbca4996156b038f4635467ee13e1615 VALUE:[' http://www.themobilemakeover.co.uk/sitemap/index.php '] http://www.themobilemakeover.co.uk/accessibility/index.php
HEX:6f03046cbe90c490e4993c5325a44aa7 VALUE:[' http://www.themobilemakeover.co.uk/accessibility/index.php「] http://www.themobilemakeover.co.uk/terms/index.php
HEX:5304b5e9bd933fb920a4f8749c27094b VALUE:[ 'http://www.themobilemakeover.co.uk/terms/index.php '] http://www.themobilemakeover.co.uk/beauty-treatments2.php
HEX:96225fa657ef60b4969d277d01d8b577 VALUE:[' http://www.themobilemakeover.co.uk/beauty-treatments2.php '] http://www.themobilemakeover.co.uk/beauty-treatments3.php
HEX:327c1bc37354aad202c90efe0dfa756b VALUE:[' http://www.themobilemakeover.co.uk/beauty-treatments3.php'] http://www.themobilemakeover.co.uk/wedding-and-special-occasions.php
HEX:54c074a1881a0c958c7c2b8ff88f63d6 VALUE:[ 'http://www.themobilemakeover.co.uk/wedding-and-special-occasions.php '] http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking-signup.php
HEX:486c944b10ef539aa7ba4bfe607861f2 VALUE:[' http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking-signup.php']

+0

僅供參考:'$ echo -n'http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking-signup.php'| MD5'給 a4cbeef10b3c6d44ca30d96370619eef – Thilo 2010-02-06 09:40:06

+0

是和Perl:486c944b10ef539aa7ba4bfe607861f2 – 2010-02-06 09:43:38

+0

'S/PERL/Perl的/ g' – Ether 2010-02-06 17:48:28

回答

10

當我嘗試它時,兩個程序都會返回a4cbeef10b3c6d44ca30d96370619eef

我有這種感覺,您並沒有給我們提供全部圖片。向我們展示導致此問題的代碼。特別是檢查換行符。你有沒有在Perl腳本中使用chomp?

試試吧。下面是完整的PHP腳本我用:

<?php 
echo md5("http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking-signup.php"); 
?> 

,這裏是我用一個完整的Perl腳本:

#!/usr/bin/perl 
use Digest::Perl::MD5 'md5_hex'; 

$linkTrue = 'http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking-signup.php'; 
print md5_hex($linkTrue); 

編輯:

這要是兩個腳本不返回該值MD5?這是一個有bug的人。記錄你傳遞給md5的值,(之後用'['before'和']'來檢測額外的空格)。這個值是否符合你的期望?

編輯2:

看起來你找到它了吧?這是單引號。此:

print md5_hex("'http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking-signup.php'"); 

請注意額外的引號。以上行給出:486c944b10ef539aa7ba4bfe607861f2

+0

同上。確保兩個字符串的末尾沒有任何額外的空格。 – jamieb 2010-02-06 09:47:13

+0

即時通訊不知道你說什麼(我確定它的Perl輸出是不正確的) – 2010-02-06 10:01:56

+0

再次看編輯問題。 – 2010-02-06 10:05:46