Wie kann ich eine beliebige Anzahl von Rückreferenzierungen ersetzen in sed oder Perl? (Zum Verschleiern mailto)
Frage
Ich bin auf der Suche nach einem Weg zu verschleiern mailtos im Quellcode einer Website. Ich möchte von diesem gehen:
href="mailto:president@whitehouse.gov"
Um dies zu:
href="" onmouseover="this.href='mai'+'lto:'+'pre'+'sid'+'ent'+'@wh'+'ite'+'hou'+'se.'+'gov'"</code>
Ich werde wahrscheinlich mit einer PHP-Lösung gehen, anstatt, wie dieser ( ich habe auf diese Weise nur global auf die gesamte mailto und die Quelle an meinem Ende besser) aussehen wird ersetzen, aber ich habe zu viel Zeit mit der Suche in sed und Perl und jetzt ich kann nicht aufhören darüber nachzudenken, wie dies geschehen könnte! Irgendwelche Ideen?
Update: Basierend stark auf eclark Lösung kam ich schließlich mit auf den Punkt:
#!/usr/bin/env perl -pi
if (/href="mailto/i) {
my $start = (length $`) +6;
my $len = index($_,'"',$start)-$start;
substr($_,$start,$len,'" onmouseover="this.href=' .
join('+',map qq{'$_'}, substr($_,$start,$len) =~ /(.{1,3})/g));
}
Lösung
Aufbauend auf Sinans Idee, hier ein kurzer Perl-Skript, das eine Datei Zeile für Zeile verarbeitet.
#!/usr/bin/env perl -p
my $start = index($_,'href="') +6;
my $len = index($_,'"',$start)-$start;
substr($_,$start,$len+1,'" onmouseover="this.href=' .
join('+',map qq{'$_'}, substr($_,$start,$len) =~ /(.{1,3})/g)
);
Wenn Sie vorhaben, es zu benutzen, stellen Sie sicher, dass Sie Ihre alten Dateien zu Quellcodeverwaltung verpflichtet, und ändern Sie die Option -p -i, die eine Datei anstelle umschreiben wird.
Andere Tipps
#!/usr/bin/perl
use strict; use warnings;
my $s = 'mailto:president@whitehouse.gov';
my $obfuscated = join('+' => map qq{'$_'}, $s =~ /(.{1,3})/g );
print $obfuscated, "\n";
Ausgabe:
'mai'+'lto'+':pr'+'esi'+'den'+'t@w'+'hit'+'eho'+'use'+'.go'+'v'
Beachten Sie, dass 'lto:
vier Zeichen ist, während es sieht aus wie Sie drei Zeichengruppen wollen.
Ist die nahe genug?
use strict;
use warnings;
my $old = 'href="mailto:president@whitehouse.gov"';
$old =~ s/href="(.*)"/$1/;
my $new = join '+', map { qq('$_') } grep { length $_ } split /(.{3})/, $old;
$new = qq(href=""\nonmouseover="this.href=$new\n");
print "$new\n";
__END__
href=""
onmouseover="this.href='mai'+'lto'+':pr'+'esi'+'den'+'t@w'+'hit'+'eho'+'use'+'.go'+'v'
"
Nur ein Beispiel.
$ echo $s
href="mailto:president@whitehouse.gov"
$ echo $s | sed 's|\(...\)|\1+|g' | sed 's/hre+f=\"/href="" onmouseover="this.href=/'
href="" onmouseover="this.href=+mai+lto+:pr+esi+den+t@w+hit+eho+use+.go+v"
Ack! ! Thppfft Ich biete Ihnen diese Haarballen:
s='href="mailto:president@whitehouse.gov"'
echo "$s" | sed -n 's/=/=\x22\x22\n/;
h;
s/\n.*//;
x;
s/[^\n]*\n//;
s/"//g;
s/\(...\)/\x27&\x27+/g;
s/.*/onmouseover=\x22this.href=&\x22/;
x;
G;
s/\n//2;
s/+\([^\x22]\{1,2\}\)\x22$/+\x27\1\x27\x22/;
s/+\x22$/\x22/;
p'