1

Я обнаружил ошибку в PHP-программе с открытым исходным кодом и хочу создать отчет об ошибке. Я ожидаю, что журнал сервера будет важен для разработчиков (как минимум, необходимо доказать, что есть ошибка, а не ошибка пользователя). Журнал на сервере является "чистым" и содержит действительные IP-адреса моих пользователей.

Я искал информацию об анонимизации, но все результаты, которые я нашел, касались анонимизации на лету и не сохранения IP-адресов на сервере. Но это не относится к моей ситуации.

Я нашел сценарий, который обещает сделать то, что мне нужно. К сожалению, это не работает - вывод представляет собой файл, содержащий одну строку ORIG вместо журнала со случайными IP-адресами. Я не знаю Perl, поэтому я не могу устранить его.

Есть идеи, как сделать мои данные анонимными? Весь файл журнала представляет собой список HTTP-запросов и ответов, по одному на строку. Мне все равно, если я использую что-то другое, чем сценарий выше, или если вы можете указать, в чем проблема с этим.

1 ответ1

2

Чтобы исправить этот сценарий, вам нужно изменить while (< ORIG >) { на while (<ORIG>) { .

Обратите внимание, что в этом сценарии используется немного кувалдой - он заменит любую последовательность из четырех чисел любой длины, разделенных точками, а не только IP-адресами. Другими словами, он будет соответствовать 124.4534653.74623.0 , 1.1.1.1 , http://example.com/foo/1.2.3.42345446/bar и многим другим. Если это проблема для вас, вам нужно будет определить, какой столбец вашего журнала содержит IP-адреса, и написать немного более сложный скрипт, который изменяет только этот столбец.


Исправлен сценарий, включающий в себя этот самостоятельный вопрос, благодарность Стивену Каппету.

#!/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));
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .