我在一个开源 PHP 程序中发现了一个错误,我想创建一个错误报告。我期望服务器日志对开发人员很重要(至少,需要证明存在错误而不是用户错误)。服务器上的日志是“纯净的”,包含我用户的有效用户 IP 地址。
我四处寻找匿名化方法,但找到的所有结果都是关于即时匿名化,而不是在服务器上保留 IP。但这不适用于我的情况。
我发现了一个脚本它承诺可以满足我的需要。遗憾的是,它不起作用 - 输出是一个包含单个字符串的文件,ORIG
而不是带有随机 IP 地址的日志。我不懂 Perl,所以我无法排除故障。
有什么想法可以让我的资料匿名化吗?整个日志文件只是 HTTP 请求和响应的列表,每行一个。我不在乎我是否使用了上述脚本以外的其他东西,或者您是否可以指出其中的问题所在。
答案1
要修复该脚本,您需要更改while (< ORIG >) {
为while (<ORIG>) {
。
请注意,该脚本采用了一种强硬的方法——它将取代任何由点分隔的任意长度的四个数字组成的序列,而不仅仅是 IP 地址。换句话说,它将匹配124.4534653.74623.0
、等等。如果这对您来说是个问题,那么您需要确定日志的哪一列包含 IP 地址,并编写一个稍微复杂一些的脚本来仅修改该列。1.1.1.1
http://example.com/foo/1.2.3.42345446/bar
已修复脚本,以保持此问答的独立性,归功于史蒂芬·库佩特。
#!/usr/bin/perl
if ($#ARGV + 1 < 1) {
print "\n\tUsage:\n";
print "\t------\n\n";
print "\tperl log_anonymize.pl file1 [file2 [file3 [...]]]\n\n";
die "Please specify at least one file to use this script.\n\n";
}
my %forward = ();
my %reverse = ();
foreach (@ARGV) {
open(ORIG, $_)
or die "Failed to open input file for reading.";
open(ANON, "+>", $_.".anon")
or die "Failed to open destination file for writing.";
while (<ORIG>) {
if (/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {
if (!($forward->{$1})) {
$newIp = getNewIp();
while ($reverse->{$newIp}) {
$newIp = getNewIp();
}
print "New mapping created: $1 -> $newIp\n";
$forward->{$1} = $newIp;
$reverse->{$newIp} = $1;
}
$repl = $forward->{$1};
$_ =~ s/$1/$repl/;
}
print ANON $_;
}
close(ORIG);
close(ANON);
}
exit 0;
sub getNewIp {
return int(rand(256)) . "." . int(rand(256)) . "." . int(rand(256)) . "." . int(rand(256));
}