Thread Werte in Datei schreiben (CGI-Formular) (87 answers)
Opened by fred0815 at 2013-12-23 10:21

Linuxer
 2023-02-27 23:32
#194694 #194694
User since
2006-01-27
3882 articles
HausmeisterIn

user image
Ich habe jetzt mal Deinen Code etwas umgearbeitet.

Ich habe versucht, Deinen Code zu erhalten, um nicht zu weit abzuweichen und dadurch wieder mehr Verwirrung zu verursachen. Meine Testergebnisse sahen akzeptabel aus.

Das Resultat:

more (14.7kb):

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/pfad/zu/perl
use strict;
use warnings;
use CGI;
use Fcntl qw(:flock);

# zentrale Definition der .htaccess Datei
my $htaccess_file = ".htaccess";

my $cgi = CGI->new;

my $param_IP = $cgi->param('IP'); # Hole den Parameter IP (=Inhalt der Textarea)

my %known_ip;
my %new_ip;

# Aktionen nur ausführen, wenn $param_IP gesetzt ist
if ( defined($param_IP) and length($param_IP) ) {

        # ermittle neue IPs; ausgehend davon, dass Parameter IP potentiell nur
        # IP-Adressen enthalten sollte, splitten wir vereinfacht am \s+
        for my $ip ( split /\s+/, $param_IP ) {
                # nur benutzen, was wie eine IP aussieht
                if ( $ip =~ m|^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$| ) {
                        $new_ip{$1}++;
                }
        }

        # ermittle die bereits gesetzten IPs
        open(my $fh, "<", $htaccess_file) or die "Cant open $htaccess_file: $!"; # Datei zum Lesen öffnen
        while (my $line = <$fh>) { # IP zeilenweise einlesen
                if ( $line =~ m|allow\s+from\s+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*$|i ) {; # ist keine numerische IP, dann weiter bei while
                        $known_ip{$1}++;  # numerische IP merken
                }
        }
        close($fh) or die "Cant close $htaccess_file:: $!";

        # Neue IPs anfügen
        open($fh, ">>", $htaccess_file) or die "Cant open $htaccess_file: $!";
        flock ($fh, LOCK_EX) or die "Cant lock $htaccess_file: $!";  # Datei sperren gegen mehrfache Schreibzugriffe

        for my $new_ip ( sort keys %new_ip ) {
                # bekannte IPs ueberspringen
                next    if exists $known_ip{$new_ip};

                # neue IPs anfuegen
                print $fh "allow from ",$new_ip,"\n" or die "Can't print to $htaccess_file: $!";
        }

        close($fh) or die "Cant close $htaccess_file: $!";
}

print $cgi->header(
  -status => '204 No Content',);  # only HTTP header is in response

__END__;


Last edited: 2023-02-27 23:44:35 +0100 (CET)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Werte in Datei schreiben (CGI-Formular)