kaffeetrinker: html in einem formular verbieten

hallo, ich habe einen kleinen "homepage builder" programmiert. benutzer gibt einfach den wunschtext ins formular ein, und der inhalt wird als html datei abgespeichert.

mein problem: der script lässt HTML tags innerhalb der benutzereingaben zu, und das will ich unbedingt verhindern.

wie kann ich sowas machen?

danke!!

  1. Halihallo kaffeetrinker

    mein problem: der script lässt HTML tags innerhalb der benutzereingaben zu, und das will ich unbedingt verhindern.

    indem du die Markups kodierst. Die wichtigen Zeichen, welche einen Markup definieren, sind '<' und '>', diese lassen sich durch '<' und '>' kodieren und werden somit als Text ausgegeben, jedoch nicht interpretiert.
    Du suchst nach regular expressions:

    $html =~ s/</</g;
    $html =~ s/>/>/g;

    Viele Grüsse

    Philipp

    1. Hallo Philip,

      gibts auch eine möglichkeit das der ganze HTML tag rausgeschnitten wird und also nicht als text ausgegeben wird.

      geht sowas?

      danke!!!

      1. Hallo Teetrinker,

        $html =~ s/<.*?>//g;

        klappt vielleicht - ist aber kaum zu empfehelen, da die Gefahr besteht, zuviel zu löschen.

        Gruß

        Eidgenosse

        1. Halihallo Eidgenosse

          $html =~ s/<.*?>//g;

          klappt vielleicht - ist aber kaum zu empfehelen, da die Gefahr besteht, zuviel zu löschen.

          jain. Mit <(.*?)> löschst du ja möglichst _kleine_ matches. Zuviel wird IMO nicht gelöscht, höchstens zuwenig, z. B. wenn sowas vorkommt:

          <a onClick="document.write('<test>'); return false;">

          Viele Grüsse

          Philipp

          1. Hallo,

            $html =~ s/<.*?>//g;

            klappt vielleicht - ist aber kaum zu empfehelen, da die Gefahr besteht, zuviel zu löschen.

            jain. Mit <(.*?)> löschst du ja möglichst _kleine_ matches. Zuviel wird IMO nicht gelöscht, höchstens zuwenig, z. B. wenn sowas vorkommt:

            <a onClick="document.write('<test>'); return false;">

            Um zu wenig zu löschen reicht bei obigem Schnippsel schon ein mehrzeiliges Starttag:

            <a href="mailto:me@home.home"
               title="mailmir"
               style="text-decoration: none;"

            me@home.home</a>

            Besser wäre es imho deshalb HTML::Parser zu verwenden.

            Gruß Alex

            1. wie kann man den HTML::Parser ein und ausschalten? danke nochmals für die vielen tipps!!

              1. Halihallo kaffeetrinker

                wie kann man den HTML::Parser ein und ausschalten? danke nochmals für die vielen tipps!!

                HTML::Parser lässt sich nicht ein oder abschalten. Es ist ein Modul, dessen Funktionen man verwenden kann oder nicht. Ein Modul wird durch

                use modul_name;

                geladen, in dem Falle also "use HTML::Parser;". Um die Funktionsweise zu verstehen kannst du in der Shell

                perldoc HTML::Parser

                eingeben.

                Viele Grüsse

                Philipp

                1. Hallo,

                  wie kann man den HTML::Parser ein und ausschalten? danke nochmals für die vielen tipps!!

                  HTML::Parser lässt sich nicht ein oder abschalten. Es ist ein Modul, dessen Funktionen man verwenden kann oder nicht. Ein Modul wird durch

                  use modul_name;

                  geladen, in dem Falle also "use HTML::Parser;".

                  [...]

                  Nur tut's dann noch nichts. Man muss HTML::Parser erst beerben. ;)

                  Ich habe mir mal aus diversen Schnippseln folgende Batchdatei zusammengebastelt:

                  ======striphtml.bat========
                  @echo off
                  perl -x -S %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
                  goto end_of_perl
                  #!perl

                  use strict;

                  package HTMLStripper;

                  BEGIN {
                   open PLAIN, '>'.$ARGV[1] or die $!;
                  }

                  use HTML::Parser;
                  use HTML::Entities qw(decode_entities);

                  use vars qw(@ISA *PLAIN);

                  @ISA = qw(HTML::Parser);

                  sub text {
                   my ($self, $text) = @_;
                   # hier noch andere Umwandlungen von Text einfuegen
                   print PLAIN decode_entities($text);
                  }

                  END { close PLAIN; }

                  package main;

                  open HTML, $ARGV[0] or die $!;
                   HTMLStripper->new->parse_file(*HTML);
                  close HTML;

                  __END__
                  :end_of_perl

                  x:> striphtml index.html index.txt

                  'striphtml.bat' liest so aufgerufen index.html ein, und speichert nur den Text zwischen den tags in index.txt

                  Gruß Alex

                  1. Sehr faszinierend dein bat-inline-perl-modul-script... aber ich weiss nicht, ich weiss nicht...

                    Nur mal so warum ich nicht weiss: Hier das beim Modul mitgelieferte beispiel das eine HTML Seite in text umwandeld:

                    use HTML::Parser 3.00 ();

                    my %inside;

                    sub tag
                    {
                       my($tag, $num) = @_;
                       $inside{$tag} += $num;
                       print " ";  # not for all tags
                    }

                    sub text
                    {
                        return if $inside{script} || $inside{style};
                        print $_[0];
                    }

                    HTML::Parser->new(api_version => 3,
                                      handlers    => [start => [&tag, "tagname, '+1'"],
                                                      end   => [&tag, "tagname, '-1'"],
                                                      text  => [&text, "dtext"],
                                                     ],
                                      marked_sections => 1,
                            )->parse_file(shift) || die "Can't open file: $!\n";;

                    Was ich hier für Anfänger anmerken möchte ist die: )->parse_file(shift) || die "Can't open file: $!\n";;
                    Zeile. Shift nimmt in diesem fall das erste argument mit dem das Script aufgerufen wurde (von @_/@argv) (Is' mir furz egal ob sich jetzt jemand auf den Schlips getreten fühlt weil ihm das völlig klar ist... Diese implizite Parameter übergabe ist ein wichtiger Grund warum Leute Perl für cryptisch halten... und hat meiner Meinung nach in Beispielen nix zu suchen)

                    und in einem CGI Script würde man natürlich statt parse_file() parse( $string ) verwenden.

  2. Ich benutze für sowas das Modul HTML::FromText (z.B. Gaestebucheinträge).

    Das quoted dir alles was HTML ist. Gleichzeitig kannst du solche sachen erlauben das URL automatisch mittels href verlinkt werden usw. Schau dir halt mal die Optionen an.

    Als ergebnis erhälts du dann HTML -- was ja evntl. für das was du machen willst sehr praktisch ist.

    Allerdings schneidet es HTML-Tag halt nicht raus sondern quoted es nur korrekt. Und es ist halt ein Modul das installiert sein muss.

    Nur mal so als alternative...