meggamoon: .htaccess und .htpasswd nicht einlesen oder nicht ausgeben

Hallo

Ich habe einen Download-Counter im cgi-bin Verzeichnis und habe dazu eine Frage :

Der Download-Counter scant das Download-Verzeichnis ein und schreibt dies in eine txt-Datei.
Jetzt ist es aber so das ich das Verzeichnis mit Download-Schutz mittels .htaccess und .htpasswd geschützt habe. Beim einscannen des Verzeichnisses scannt er diese 2 Dateien logischerweise mit ein.
Wenn er mir dann den Inhalt des Verzeichnisses anzeigt dann sind da diese beiden Dateien auch mit dabei, was nicht so schön ist.

Gibt es eine Möglichkeit das ich im beibringen kann das er entweder beim Einlesen oder später bei der Ausgabe diese 2 Dateien ausklammert ?

Für eine hilfreiche Antwort wäre ich sehr dankbar.

Gruß
meggamoon

  1. Hi,

    Jetzt ist es aber so das ich das Verzeichnis mit Download-Schutz mittels .htaccess und .htpasswd geschützt habe. Beim einscannen des Verzeichnisses scannt er diese 2 Dateien logischerweise mit ein.
    Wenn er mir dann den Inhalt des Verzeichnisses anzeigt dann sind da diese beiden Dateien auch mit dabei, was nicht so schön ist.

    Gibt es eine Möglichkeit das ich im beibringen kann das er entweder beim Einlesen oder später bei der Ausgabe diese 2 Dateien ausklammert ?

    Sicher, dass ist mit einer einfachen Abfrage, die den jeweiligen Dateinamen auf ".htaccess" bzw. ".htpasswd" checkt, und dann ggf. ignoriert, getan.
    Bzw. normalerweise reicht der Check darauf, ob der Dateiname mit ".ht" beginnt - denn solche Dateien liefert der Apache per Default nicht aus, also will man alle solchen idR. auch nicht bei sowas aufgelistet haben.

    MfG ChrisB

    --
    "The Internet: Technological marvel of marvels - but if you don't know *what* you're lookin' for on the Internet, it is nothing but a time-sucking vortex from hell."
    1. Hallo

      Ich dachte mir schon das es irgendwie gehen muß, nur leider weiß ich nicht wie das konkret zu realisieren ist, könntest du mir da nicht etwas helfen ?

      Gruß
      meggamoon

      1. Ich dachte mir schon das es irgendwie gehen muß, nur leider weiß ich nicht wie das konkret zu realisieren ist, könntest du mir da nicht etwas helfen ?

        Da du mit Luft und Liebe programmierst erhältst du Hilfe mit Luft und Liebe.
        Falls du weniger esoterisch angehaucht bist, poste deinen Code.

        Vonnixkommnix

        mfg Beat

        --
        Selber klauen ist schöner!
        1. Sorry, hät ich auch gleich mit posten können - hast recht.

          Verzeichnis wird gescannt mit :

          sub scan_dir {
          my ($new_date,$last_date,$found,$scantype,@lines,@filename,@new_array);
          opendir(HOMEDIR, "$base_dir");
          @filename = readdir(HOMEDIR);
          closedir(HOMEDIR);

          open(DATA,"$basedat");
          @lines = <DATA>;
          close(DATA);
          $last_date = shift(@lines);

          $scantype = ($FORM{'type'} eq "all") ? '.' : '.'.$FORM{'type'};
          foreach $new_line (@filename) {
           next if ($new_line eq '.' || $new_line eq '..');
           next if ($new_line !~ /.*($scantype)$/ );
           foreach $test_line (@lines)  {
            ($file_id,$stub) = split(/|/,$test_line,2);
            if ($new_line eq $file_id) {
             $found =1;
             last;
            }
            $found=0;
           }
           $stamp = time();
           push (@new_array, "$new_line|0|$base_url/$new_line|$stamp|---\n") if ($found == 0);
          }
          if (@new_array>0) {
           open(FILE,">>$basedat");
           flock(FILE,2) if ($lock == 1);
           unless ($last_date =~ /\w+/) {
            $new_date = &get_date($new_date);
            print FILE ("$new_date\n");
           }
           print FILE (@new_array);
           close(FILE);
          }
          }

          Gruß
          meggamoon

          1. Hallo,

            next if ($new_line !~ /.*($scantype)$/ );

            (Das funktioniert nicht wenn der type-Parameter "all" ist. ".*" kann weggelassen werden.)

            next if ($new_line ~ /^.ht/ );

            Btw hab ich praktisch keine Ahnung von Perl.

            Gruß

            1. Ich habe es jetzt so versucht :

              $scantype = ($FORM{'type'} eq "all") ? '.' : '.'.$FORM{'type'};
              foreach $new_line (@filename) {
               next if ($new_line eq '.' || $new_line eq '..');
               next if ($new_line !~ /.*($scantype)$/ );
               next if ($new_line ~ /^.ht/ );
               foreach $test_line (@lines)  {
                ($file_id,$stub) = split(/|/,$test_line,2);
                if ($new_line eq $file_id) {
                 $found =1;
                 last;
                }
                $found=0;
               }

              So gings gar nicht. Deshalb habe ich das "!" rein gemacht :

              $scantype = ($FORM{'type'} eq "all") ? '.' : '.'.$FORM{'type'};
              foreach $new_line (@filename) {
               next if ($new_line eq '.' || $new_line eq '..');
               next if ($new_line !~ /.*($scantype)$/ );
               next if ($new_line !~ /^.ht/ );
               foreach $test_line (@lines)  {
                ($file_id,$stub) = split(/|/,$test_line,2);
                if ($new_line eq $file_id) {
                 $found =1;
                 last;
                }
                $found=0;
               }

              Jetzt scannt er wieder, aber auch die .htaccess und .htpasswd scannt er wieder mit ein.
              Auch wenn ich das ".*" weglasse gehts leider nicht.

              Wo kann der Fehler liegen ?

              Gruß
              meggamoon

              1. Hallo,

                Sorry, ohne das ".*" geht es wirklich nicht, weil ~ einen Match vom Beginn an macht. Habe da etwas verwechselt.
                Wie sieht denn das Format aus, das readdir() zurückgibt?

                Gruß

                1. Wie sieht denn das Format aus, das readdir() zurückgibt?

                  Perl: readdir() Ausgabe

                  a) Im Listenkontext eine Liste von Dateinamen
                  typischerweise:
                  <example>
                  ..
                  .
                  file.txt
                  </example>

                  b) Im Stringkontext:
                  Einen konkatenierten String:
                  <example>
                  ...file.txt
                  </example>

                  Was wenig Sinn macht, weshalb man readdir() im Listenkontext abarbeitet oder einem Array zuweist.

                  mfg Beat

                  --
                  Selber klauen ist schöner!
                  1. Ich habs jetzt hinbekommen, so gehts :

                    $scantype = ($FORM{'type'} eq "all") ? '.' : '.'.$FORM{'type'};
                    foreach $new_line (@filename) {
                     next if ($new_line eq '.' || $new_line eq '..');
                     next if ($new_line !~ /.*($scantype)$/ );
                     next if ($new_line =~ /^.ht/ );
                     foreach $test_line (@lines)  {
                      ($file_id,$stub) = split(/|/,$test_line,2);
                      if ($new_line eq $file_id) {
                       $found =1;
                       last;
                      }
                      $found=0;
                     }

                    anstatt !~ mußte =~ geschrieben werden.

                    Vielen Dank an ALLE die geholfen haben !

                    Gruß
                    meggamoon

          2. sub scan_dir {
            my ($new_date,$last_date,$found,$scantype,@lines,@filename,@new_array);
            opendir(HOMEDIR, "$base_dir");
            @filename = readdir(HOMEDIR);
            closedir(HOMEDIR);

            Dein Problem kannst du hier anpacken.

            opendir(HOMEDIR, "$base_dir") or die("$!");

            erwäge dass das Directory nicht gelesen werden kann.

            foreach ( readdir(HOMEDIR)  ){
               $_ =~ /^./ and next;
               # damit übergehe ich alles, was mit einem . beginnt, ergo .htaccess
               push( @filelist, $_);
            }
            closedir(HOMEDIR);
            Achtung. Ich habe diesen Code nicht getestet.

            mfg Beat

            --
            Selber klauen ist schöner!
            1. Ich habe es so probiert :

              sub scan_dir {
              my ($new_date,$last_date,$found,$scantype,@lines,@filename,@new_array);
              opendir(HOMEDIR, "$base_dir") or die("$!");

              erwäge dass das Directory nicht gelesen werden kann.

              foreach ( readdir(HOMEDIR)  ){
                 $_ =~ /^./ and next;
                 # damit übergehe ich alles, was mit einem . beginnt, ergo .htaccess
                 push( @filelist, $_);
              }
              closedir(HOMEDIR);

              Jetzt scannt er leider gar nichts mehr ein ...
              Irgendwo muß da noch der Wurm drin sein.

              Gruß
              meggamoon

              1. Jetzt scannt er leider gar nichts mehr ein ...

                Bei mir funktioniert der Code tadellos.

                Struppi.

                1. Hallo Struppi!

                  Bei mir funktioniert der Code tadellos.

                  Hut ab, wenn Du das Problem des OP verstehst... das war im Eröffnungsposting noch klar, seit dem aber Code gepostet wurde, verstehe ich nicht mehr, was meggamoon erreichen will.

                  http://de.selfhtml.org/perl/funktionen/listenhashes.htm#grep@title=grep() tut's in so einem Fall einfacher, wenn es nur darum geht, die Einträge für's aktuelle Verzeichnis (».«) und Ebene höher (»..«) und alles, was mit einem Punkt anfängt aus der Verzeichnisliste zu entfernen:

                  my @files = grep(!/^\.\.?/, readdir DIR);

                  Viele Grüße aus Frankfurt/Main,
                  Patrick

                  --

                  _ - jenseits vom delirium - _
                  [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                  Nichts ist unmöglich? Doch!
                  Heute schon gegökt?
              2. korrigiere @filelist zu deinem entsprechenden Equivalent.
                Checke perls error messages

                Eventuell denke an weitere filetests, die man unter Umständen einbaut.
                Man möchte z.B. keine symbolischen Links aufnehmen.

                mfg Beat

                --
                Selber klauen ist schöner!
                1. Ich habe es jetzt an mehreren Stellen probiert, dann habe ich die @filelist geändert in @new_array (ich denke das ist der richtige Ausdruck in meinem Falle), funktioniert jedoch leider nicht.
                  Hier nochmal der gesamt code zum scannen :
                  wo muß ich es einbauen ?

                  sub scan_dir {
                  my ($new_date,$last_date,$found,$scantype,@lines,@filename,@new_array);
                  opendir(HOMEDIR, "$base_dir");
                  @filename = readdir(HOMEDIR);
                  closedir(HOMEDIR);

                  open(DATA,"$basedat");
                  @lines = <DATA>;
                  close(DATA);
                  $last_date = shift(@lines);

                  $scantype = ($FORM{'type'} eq "all") ? '.' : '.'.$FORM{'type'};
                  foreach $new_line (@filename) {
                   next if ($new_line eq '.' || $new_line eq '..');
                   next if ($new_line !~ /.*($scantype)$/ );
                   foreach $test_line (@lines)  {
                    ($file_id,$stub) = split(/|/,$test_line,2);
                    if ($new_line eq $file_id) {
                     $found =1;
                     last;
                    }
                    $found=0;
                   }
                   $stamp = time();
                   push (@new_array, "$new_line|0|$base_url/$new_line|$stamp|---\n") if ($found == 0);
                  }
                  if (@new_array>0) {
                   open(FILE,">>$basedat");
                   flock(FILE,2) if ($lock == 1);
                   unless ($last_date =~ /\w+/) {
                    $new_date = &get_date($new_date);
                    print FILE ("$new_date\n");
                   }
                   print FILE (@new_array);
                   close(FILE);
                  }
                  }

                  Gruß
                  meggamoon

                  1. wo muß ich es einbauen ?

                    Zwischen deinen Ohren.
                    Lerne wie man selber klaut.

                    mfg Beat

                    --
                    Selber klauen ist schöner!
                    1. Dir gehts wohl nicht gut - oder ?
                      Ich habe nur eine normale höfliche Frage gestellt !!

                      1. Dir gehts wohl nicht gut - oder ?
                        Ich habe nur eine normale höfliche Frage gestellt !!

                        Der Punkt ist, dass du der Programmierer bist.
                        Code kopieren oder von Fremden einfügen lassen ist eine Sache die man später bereuen kann, beiderseits.

                        Du weisst sehr gut, dass der Code, den ich dir gepostet habe, nirgendwo einzufügen ist, sondern dass er einen anderen Zugang darstellt, wie du das directory an erster Stelle ausliest und nur dasjenige in deine Fileliste aufnimmst, was du effektiv brauchst.

                        mfg Beat

                        --
                        Selber klauen ist schöner!
          3. Verzeichnis wird gescannt mit :

            Perl bietet Dir einiges an Modulen, besondersFile::Glob undFile::Find könnten Dich interessieren.

            sub scan_dir {
            my ($new_date,$last_date,$found,$scantype,@lines,@filename,@new_array);
            opendir(HOMEDIR, "$base_dir");
            @filename = readdir(HOMEDIR);
            closedir(HOMEDIR);

            Bereits hier solltest Du die Prüfung einbauen, welche Files auszuschließen sind und die gefundenen Einträge gleich wegschreiben.

            Siechfred

            --
            Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.