我的所有应用程序都是用PHP编写的,第1栏脚本恰好创建了一个md5哈希,后来通过PHP脚本使用。问题是他们不匹配。
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 SCRIPT
<?php
echo md5("http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking-signup.php");
?>
整个抄本(抱歉很长)
#!/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: $@";
$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-&gt; quote()在值周围添加单引号。
http://www.themobilemakeover.co.uk/index.php
HEX:58030da397e8a071bc192e67744faeb3价值:['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值:['http://www.themobilemakeover.co.uk/beauty-products-used.php']
http://www.themobilemakeover.co.uk/beauty-treatments.php
HEX:e88d7e8e16ffc0a72b56a884d4c6c06b价值:['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值:['http://www.themobilemakeover.co.uk/pamper-parties.php']
http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking.php
HEX:9961f75109590c3924e4018768ecd44e价值:['http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking.php']
http://www.themobilemakeover.co.uk/sitemap/index.php
HEX:fbca4996156b038f4635467ee13e1615价值:['http://www.themobilemakeover.co.uk/sitemap/index.php']
http://www.themobilemakeover.co.uk/accessibility/index.php
HEX:6f03046cbe90c490e4993c5325a44aa7价值:['http://www.themobilemakeover.co.uk/accessibility/index.php']
http://www.themobilemakeover.co.uk/terms/index.php
HEX:5304b5e9bd933fb920a4f8749c27094b价值:['http://www.themobilemakeover.co.uk/terms/index.php']
http://www.themobilemakeover.co.uk/beauty-treatments2.php
HEX:96225fa657ef60b4969d277d01d8b577价值:['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价值:['http://www.themobilemakeover.co.uk/wedding-and-special-occasions.php']
http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking-signup.php
HEX:486c944b10ef539aa7ba4bfe607861f2价值:['http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking-signup.php']
答案 0 :(得分: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 before和']'后检测额外的空格)。这个值是否符合您的期望?
编辑2:
看起来你找到了,对吗?这是单引号。这样:
print md5_hex("'http://www.themobilemakeover.co.uk/mobile-makeover-appointment-booking-signup.php'");
注意额外的报价。上面这行给了我:486c944b10ef539aa7ba4bfe607861f2