christiane k.: function checkForm() - im Textfeld Formulierungen ausschließen

schönen sonntag allerseits!

wenn ich in einem formular-textfeld ausschließen will, dass jemand verlinkungen einträgt, wie mache ich das?
der folgende teil bei function checkForm() wird nicht anerkannt:

if (document.Formular.Text.value = "http" || document.Formular.Text.value = "a href")
   {
       alert("Bitte keine Verlinkungen eintragen.");
       document.Formular.Text.focus();
       return false;
      }

vielen dank schon mal!

  1. Hallo,

    wenn ich in einem formular-textfeld ausschließen will, dass jemand verlinkungen einträgt, wie mache ich das?

    indem du den eingegebenen String prüfst und unerwünschte Eingaben abweist.
    Hilft dir das jetzt weiter? ;-)

    der folgende teil bei function checkForm() wird nicht anerkannt:

    Was meinst du mit "wird nicht anerkannt"? Vermutlich wird die Funktion sogar korrekt ausgeführt - aber ich sehe darin mindestens zwei logische Fehler, deshalb dürfte sie *jede* nur erdenkliche Eingabe abweisen und außerdem bei jedem Aufruf den String "http" ins Eingabefeld eintragen.

    if (document.Formular.Text.value = "http" || document.Formular.Text.value = "a href")

    Fehler #1: Das Symbol '=' steht für eine Zuweisung, nicht für einen Vergleich. Dieser Code würde also erstmal den String "http" an document.Formular.Text.value zuweisen (und ihn damit in das Textfeld schreiben). Dann stellt Javascript fest, dass das Ergebnis der Zuweisung, also der zugewiesene Wert, im boolschen Sinn true ergibt. Die nachfolgende Oder-Verknüpfung wird daher gar nicht mehr ausgeführt, weil sie das Gesamtergebnis sowieso nicht mehr ändert.

    Fehler #2: Du prüfst -wenn wir mal den richtigen Operator '==' annehmen- nur auf exakte Übereinstimmung. Wenn "http" aber nur ein Teil der Eingabe ist, wird deine Prüfung nicht anspringen. Du musst also überprüfen, ob der unerwünschte Ausdruck *im String enthalten* ist, nicht unbedingt, ob er mit dem String identisch ist. Schau dir mal die Methoden des String-Objekts an. Für diesen Fall dürfte vor allem indexOf() interessant sein.

    Und dann noch etwas Generelles: Die beiden Muster, auf die du prüfst, sind keineswegs eindeutige Merkmale für Links. Okay, es ist zwar unwahrscheinlich, dass "http" im normalen Text vorkommt; aber bei der Eingabe "cdibgelhttpxgtfash" würde deine Prüfung auch ansprechen - und das ist ganz bestimmt kein Link. Dagegen würde "<a title='weiter' href='...'>" gar nicht beanstandet. Überlege dir also, wie deine Vergleichsmuster eindeutiger werden.
    Und warum willst du überhaupt die Eingabe von Links oder URLs verhindern?

    So long,
     Martin

    PS: Nach dem Absenden des Formulars wird die Eingabe serverseitig hoffentlich nochmal geprüft, oder? Denn Javascript kann ja leicht manipuliert oder deaktiviert werden ...

    --
    F: Was ist wichtiger: Die Sonne oder der Mond?
    A: Der Mond. Denn er scheint nachts. Die Sonne dagegen scheint tagsüber, wenn es sowieso hell ist.
    1. Hallo,

      wenn ich in einem formular-textfeld ausschließen will, dass jemand verlinkungen einträgt, wie mache ich das?

      indem du den eingegebenen String prüfst und unerwünschte Eingaben abweist.
      Hilft dir das jetzt weiter? ;-)

      nein, aber nett gefragt

      der folgende teil bei function checkForm() wird nicht anerkannt:

      Was meinst du mit "wird nicht anerkannt"? Vermutlich wird die Funktion sogar korrekt ausgeführt - aber ich sehe darin mindestens zwei logische Fehler, deshalb dürfte sie *jede* nur erdenkliche Eingabe abweisen und außerdem bei jedem Aufruf den String "http" ins Eingabefeld eintragen.

      if (document.Formular.Text.value = "http" || document.Formular.Text.value = "a href")

      Fehler #1: Das Symbol '=' steht für eine Zuweisung, nicht für einen Vergleich. Dieser Code würde also erstmal den String "http" an document.Formular.Text.value zuweisen (und ihn damit in das Textfeld schreiben). Dann stellt Javascript fest, dass das Ergebnis der Zuweisung, also der zugewiesene Wert, im boolschen Sinn true ergibt. Die nachfolgende Oder-Verknüpfung wird daher gar nicht mehr ausgeführt, weil sie das Gesamtergebnis sowieso nicht mehr ändert.

      ich hatte dann beim weiteren Ausprobieren so '==' geschrieben, also weiter hier:

      Fehler #2: Du prüfst -wenn wir mal den richtigen Operator '==' annehmen- nur auf exakte Übereinstimmung. Wenn "http" aber nur ein Teil der Eingabe ist, wird deine Prüfung nicht anspringen. Du musst also überprüfen, ob der unerwünschte Ausdruck *im String enthalten* ist, nicht unbedingt, ob er mit dem String identisch ist. Schau dir mal die Methoden des String-Objekts an. Für diesen Fall dürfte vor allem indexOf() interessant sein.

      das kann ich nicht auf meine Frage übertragen, denn das, was du unten schreibst, stimmt

      Und dann noch etwas Generelles: Die beiden Muster, auf die du prüfst, sind keineswegs eindeutige Merkmale für Links. Okay, es ist zwar unwahrscheinlich, dass "http" im normalen Text vorkommt; aber bei der Eingabe "cdibgelhttpxgtfash" würde deine Prüfung auch ansprechen - und das ist ganz bestimmt kein Link. Dagegen würde "<a title='weiter' href='...'>" gar nicht beanstandet. Überlege dir also, wie deine Vergleichsmuster eindeutiger werden.

      wenn ich nur http ins Textfeld schreibe, wird das tatsächlich als Fehler gerechnet, aber schon, wenn ich httpa schreibe, lässt sich das Formular ohne weiteres absenden

      Und warum willst du überhaupt die Eingabe von Links oder URLs verhindern?

      Das soll die Art Spamschutz sein, die ich noch beherrsche. Das Formular sitzt auf der Hoempage eines Kunden, und ich frage so ab:
      function checkForm()
          {
        if (document.Formular.Anrede.value == "")
            {
             alert("Bitte geben Sie Ihre Anrede an!");
             document.Formular.Anrede.focus();
             return false;
            }
          if (document.Formular.Anrede.value == "a href")
            {
             alert("Bitte geben Sie Ihre Anrede an!");
             document.Formular.Anrede.focus();
             return false;
            }
        if (document.Formular.Name.value == "")
         {
             alert("Bitte geben Sie Ihren ganzen Namen an!");
             document.Formular.Name.focus();
             return false;
            }
         if (document.Formular.Strasse.value == "")
         {
             alert("Bitte geben Sie Ihre Strasse an!");
             document.Formular.Strasse.focus();
             return false;
            }
         if (document.Formular.Ort.value == "")
         {
             alert("Bitte geben Sie Ihren Wohnort an!");
             document.Formular.Ort.focus();
             return false;
            }
         if (document.Formular.eMail.value == "")
         {
             alert("Bitte geben Sie Ihre eMail-Adresse an!");
             document.Formular.eMail.focus();
             return false;
            }
          if (document.Formular.eMail.value.indexOf('@') == -1)
         {
             alert("Das ist keine gültige eMail-Adresse!");
             document.Formular.eMail.focus();
             return false;
            }
         if (document.Formular.Telefon.value == "")
         {
             alert("Bitte geben Sie Ihre Rufnummer an!");
             document.Formular.Telefon.focus();
             return false;
            }
            if (document.Formular.Umfrage.value == "spam")
         {
             alert("Bitte teilen Sie uns mit, wie Sie auf uns aufmerksam geworden sind.");
             document.Formular.Umfrage.focus();
             return false;
            }
         if (document.Formular.Text.value == "http" || document.Formular.Text.value == "a href")
         {
             alert("Bitte keine Verlinkungen eintragen.");
             document.Formular.Text.focus();
             return false;
            }
       }

      Bis jetzt hat die Umfrageliste (6 Menupunkte zum Auswählen)ganz gut verhindert, dass zuviel Spam kam, aber es kommt natürlich doch was durch. Vor allem die Textfelder sind voller Links und nerven den Kunden. Ich beherrsche kein PHP, darum war das meine Art...

      So long,
      Martin

      PS: Nach dem Absenden des Formulars wird die Eingabe serverseitig hoffentlich nochmal geprüft, oder? Denn Javascript kann ja leicht manipuliert oder deaktiviert werden ...

      ja, habe ich gemerkt

      Danke für Deine ausführliche Antwort! Ich muss weitersuchen, wie ich es mit meinen Möglichkeiten noch hinbekomme
      Christiane

      Christiane

      1. Hi,

        Hilft dir das jetzt weiter? ;-)
        nein, aber nett gefragt

        okay, war auch eher ironisch gemeint.

        Fehler #1: Das Symbol '=' steht für eine Zuweisung, [...]
        ich hatte dann beim weiteren Ausprobieren so '==' geschrieben, also weiter hier:
        Fehler #2: Du prüfst -wenn wir mal den richtigen Operator '==' annehmen- nur auf exakte Übereinstimmung. [...] Schau dir mal die Methoden des String-Objekts an. Für diesen Fall dürfte vor allem indexOf() interessant sein.
        das kann ich nicht auf meine Frage übertragen, denn das, was du unten schreibst, stimmt

        Warum hilft dir das nicht? Du möchtest prüfen, ob "http" in der Eingabe vorkommt, und indexOf() verrät dir genau das. Es verrät dir sogar, an welcher Stelle im String dieser Ausdruck vorkommt - das könntest du ausnutzen, wenn du nur "http" am Anfang verbieten möchtest. Übrigens empfehle ich dir, den Doppelpunkt mit hinzuzunehmen, also auf "http:" zu prüfen.

        wenn ich nur http ins Textfeld schreibe, wird das tatsächlich als Fehler gerechnet, aber schon, wenn ich httpa schreibe, lässt sich das Formular ohne weiteres absenden

        Das meinte ich. Und auch wenn du "http://blah" eingibst, geht das ungestreift durch.

        Und warum willst du überhaupt die Eingabe von Links oder URLs verhindern?
        Das soll die Art Spamschutz sein, die ich noch beherrsche.

        Nun ja ...

        if (document.Formular.Strasse.value == "")
           if (document.Formular.Ort.value == "")
           if (document.Formular.eMail.value == "")
           if (document.Formular.Telefon.value == "")

        Ich würde als Interessent, der dieses Kontaktformular nutzen oder an einer Umfrage teilnehmen möchte, mich abwenden und sagen, "Ihr könnt mich mal", denn meine Postanschrift und meine Telefonnummer ist für die Anfrage sicher völlig belanglos und geht deshalb keinen was an.

        Christiane
        Christiane

        Zweimal?? :-)

        Übrigens solltest du dich bitte für *einen* Nick entscheiden und den auch konsequent verwenden. Personen, die ihren Nicknamen wechseln wie andere das Hemd, werden hier eher schief angeguckt.

        Ciao,
         Martin

        --
        Wenn der Computer wirklich alles kann,
        dann kann er mich mal kreuzweise.
        1. Hei Martin,
          dann entscheide ich mich jetzt für kleinananas und bleibe dabei-

          "Du möchtest prüfen, ob "http" in der Eingabe vorkommt, und indexOf() verrät dir genau das. Es verrät dir sogar, an welcher Stelle im String dieser Ausdruck vorkommt - das könntest du ausnutzen, wenn du nur "http" am Anfang verbieten möchtest. Übrigens empfehle ich dir, den Doppelpunkt mit hinzuzunehmen, also auf "http:" zu prüfen."

          indexOf('http:') == 1 wäre dann richtig?
          indexOf('@') == -1 hatte ich bei falscher email-Angabe reingeschrieben

          Vielen Dank!

          Hi,

          Hilft dir das jetzt weiter? ;-)
          nein, aber nett gefragt

          okay, war auch eher ironisch gemeint.

          Fehler #1: Das Symbol '=' steht für eine Zuweisung, [...]
          ich hatte dann beim weiteren Ausprobieren so '==' geschrieben, also weiter hier:
          Fehler #2: Du prüfst -wenn wir mal den richtigen Operator '==' annehmen- nur auf exakte Übereinstimmung. [...] Schau dir mal die Methoden des String-Objekts an. Für diesen Fall dürfte vor allem indexOf() interessant sein.
          das kann ich nicht auf meine Frage übertragen, denn das, was du unten schreibst, stimmt

          ...

          1. Hallo kleinananas,

            dann entscheide ich mich jetzt für kleinananas und bleibe dabei-

            :-)

            indexOf('http:') == 1 wäre dann richtig?
            indexOf('@') == -1 hatte ich bei falscher email-Angabe reingeschrieben

            Sehen wir doch mal nach, was indexOf() liefert:

            Ermittelt das erste Vorkommen eines Zeichens oder einer Zeichenkette innerhalb einer Zeichenkette und gibt zurück, an wie vielter Stelle das Zeichen in der Zeichenkette steht. Die Zählung beginnt bei 0. Wenn die Suche erfolglos ist, wird -1 zurückgegeben.

            Der zweite Satz ist einfach: Wenn der gesuchte Ausdruck *nicht* vorkommt, liefert indexOf() -1. Deshalb die Verwendung in der Prüfung der Mailadresse: Kommt ein '@' nicht in der Eingabe vor, ist es keine gültige Mailadresse.
            Andernfalls liefert indexOf() die Position des Suchbegriffs im String, wobei die Zählung, wie in der Informatik üblich, bei 0 beginnt. Mit dem Vergleich auf ==1 würdest du also prüfen, ob "http:" an der zweiten Position im String steht.
            Jetzt müsstest du die Schlussfolgerung aber selbst hinkriegen.

            Ciao,
             Martin

            --
            Wenn man keine Ahnung hat - einfach mal Fresse halten.
              (Dieter Nuhr, deutscher Kabarettist)
            1. es klappt wunderbar!
              danke!

              Hallo kleinananas,

              dann entscheide ich mich jetzt für kleinananas und bleibe dabei-

              :-)

              indexOf('http:') == 1 wäre dann richtig?
              indexOf('@') == -1 hatte ich bei falscher email-Angabe reingeschrieben

              Sehen wir doch mal nach, was indexOf() liefert:

              Ermittelt das erste Vorkommen eines Zeichens oder einer Zeichenkette innerhalb einer Zeichenkette und gibt zurück, an wie vielter Stelle das Zeichen in der Zeichenkette steht. Die Zählung beginnt bei 0. Wenn die Suche erfolglos ist, wird -1 zurückgegeben.

              Der zweite Satz ist einfach: Wenn der gesuchte Ausdruck *nicht* vorkommt, liefert indexOf() -1. Deshalb die Verwendung in der Prüfung der Mailadresse: Kommt ein '@' nicht in der Eingabe vor, ist es keine gültige Mailadresse.
              Andernfalls liefert indexOf() die Position des Suchbegriffs im String, wobei die Zählung, wie in der Informatik üblich, bei 0 beginnt. Mit dem Vergleich auf ==1 würdest du also prüfen, ob "http:" an der zweiten Position im String steht.
              Jetzt müsstest du die Schlussfolgerung aber selbst hinkriegen.

              Ciao,
              Martin

      2. Hallo kleinananas!

        Bis jetzt hat die Umfrageliste (6 Menupunkte zum Auswählen)ganz gut verhindert, dass zuviel Spam kam, aber es kommt natürlich doch was durch. Vor allem die Textfelder sind voller Links und nerven den Kunden.

        Da wirst Du mit »nur JavaScript« kaum Spam verhindern können. Dieser wird von Bots eingetragen, welche die Textfelder auslesen und ausfüllen - ganz ohne JavaScript.

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --

        _ - jenseits vom delirium - _
        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Nichts ist unmöglich? Doch!
        Heute schon gegökt?
        All'alba vincerò!
        1. hei patrick,

          gibt's denn für das serverseitige gegenstück ein skript, das auch blonde mit  php-halbwissen verstehen? adressen gibt's viele, wenn ich suche, aber ich muss die sachen ja auch etwas verstehen, und die zeit habe ich grade nicht, mich gründlich in alles einzuarbeiten-
          könntest du mir eine adresse empfehlen?
          vielen dank
          christiane

          Hallo kleinananas!

          Bis jetzt hat die Umfrageliste (6 Menupunkte zum Auswählen)ganz gut verhindert, dass zuviel Spam kam, aber es kommt natürlich doch was durch. Vor allem die Textfelder sind voller Links und nerven den Kunden.

          Da wirst Du mit »nur JavaScript« kaum Spam verhindern können. Dieser wird von Bots eingetragen, welche die Textfelder auslesen und ausfüllen - ganz ohne JavaScript.

          Viele Grüße aus Frankfurt/Main,
          Patrick

          1. Hi Christiane,

            gibt's denn für das serverseitige gegenstück ein skript, das auch blonde mit  php-halbwissen verstehen?

            ouuh, Halbwissen ist manchmal bedenklich - kommt drauf an, welche Hälfte man kennt und welche nicht. Gerade PHP scheint auf den ersten Blick sehr leicht zu lernen. Aber dadurch, dass die Sprache an sich sehr viel kann, sind auch die Auswirkungen von kleinen Fehlern manchmal kritisch. Und damit meine ich nicht, dass das Script offensichtlich aus dem Ruder läuft, sondern dass man bestimmte Lücken übersieht, durch die böswillige Angreifer dann mit "getricksten" Eingaben Zugriff auf die Datenbank oder gar auf den Dateibestand des ganzen Servers haben.

            Also ob blond oder nicht - ich kann im Falle von PHP nur raten, sich langsam, aber gewissenhaft einzuarbeiten und nichts zu überstürzen.

            In deinem konkreten Fall: Wenn du damit leben kannst, dass ab und zu falsch ausgefüllte (oder total blödsinnige) Datensätze abgeschickt werden, dann bleib vorläufig bei deiner Javascript-Prüfung. Der Anteil der gutartigen Nutzer, die kein Javascript ausführen lassen (so wie ich *g*), ist recht gering. Meist sind es eher Spam-Bots, die einfach blind jedes Formular mit Dreck ausfüllen und absenden, das nicht bei drei auf den Bäumen ist.

            Hallo kleinananas!
            [...]

            Und bevor du dich in PHP einarbeitest, lies und beherzige doch bitte den Wiki-Artikel über TOFU.

            Schönen Abend noch,
             Martin

            --
            "Drogen machen gleichgültig."
             - "Na und? Mir doch egal."
          2. Hi,

            gibt's denn für das serverseitige gegenstück ein skript, das auch blonde mit  php-halbwissen verstehen?

            Du brauchst kein Script, sondern nur eine simple Abfrage, die Du in Dein jetziges Script vor dem Eintragen setzen musst:

            if(strpos($_POST['Dein_name-Attribut_des_Feldes'], 'http://') === false) {  
            // diese Zeichenkette ist nicht enthalten - weiter mit dem Eintragen.  
            }
            

            freundliche Grüße
            Ingo