Wie kann ich eine beliebige Anzahl von Rückreferenzierungen ersetzen in sed oder Perl? (Zum Verschleiern mailto)

StackOverflow https://stackoverflow.com/questions/3432752

  •  26-09-2019
  •  | 
  •  

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));
}
War es hilfreich?

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'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top