innerHTML = "<script>..."

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • innerHTML = "<script>..."

    ich habe mir einen Ajax-Chat gebastelt und scheitere nun an einem dummen Hindernis...

    Mit Ajax hole ich mir die Daten aus der php-Datei und die wiederum aus der Datenbank.
    Es kann nun vorkommen, dass ein Script mit eingefügt wird im Chat.
    z.B. <script>alert("hallo")</script>
    Doch wenn ich innerHTML verwende wird das Script nicht ausgeführt, wenn auch angezeigt im Quelltext. Wie kann ich das Script so einfügen lassen, dass es auch ausgeführt wird?

    MfG

    JMC

  • #2
    normalerweise versucht man sowas ja zu unterbinden. aber gibts in javascript nicht auch ein eval?

    gruß
    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Sie können es auch nicht direkt einfügen sondern nur mit VBC z.B.

      :SCRIPT=rb:Meine Schrift in Regenbogenform:/SCRIPT:

      eveal nützt mir nicht so viel weil ich die PHP-Datei auslese und die dann z.B. so aussieht:

      <b>Fritzchen</b>: Hallo <script>alert("hallo")</script>
      <b>Fritzchen</b>: Hallo <script>firework()</script>
      <b>Fritzchen</b>: Hallo <script>play_sound(4)</script>! Wie gehts denn so?^^

      also habe ich nur einen ganz kleinen Teil der Datei auf den eveal angewendet werden kann.

      Kommentar


      • #4
        oooijoijoijoijooooi
        hast du eine ahnung, wie groß die sicherheitslücken sind?

        als erstes mußt du überprüfen, ob der relevante code kein risiko darstellt. dann mußt du das ganze per regexp aufdröseln und entsprechend formatiert von php an js übergeben.

        ich glaube, es wäre einfacher, du würdest vordefinierte js-funktionen bereit stellen und dann entsprechend verarbeiten.

        btw: was ist VBC? visual basic script? das ist doch ie only.

        gruß
        peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          Original geschrieben von Kropff
          ich glaube, es wäre einfacher, du würdest vordefinierte js-funktionen bereit stellen und dann entsprechend verarbeiten.
          Und ich glaube, genau das macht er. Sein Chatclient (also seine Webseite) lädt eine JS-Datei, die bestimmte Funktionen enthält. User A kann nun mit bestimmten Tags im Chattext an User B dafür sorgen, dass diese Funktionen bei User B ausgeführt werden. Das klingt nur unsicher, denn zwischendurch laufen die Daten ja noch über den Server und der kann mit stripslashes() oder so erstmal alles Gefährliche entfernen. Diese Tags bleiben dabei erhalten, können geparst und durch den entsprechenden JS-Code ersetzt werden, der bei User B eben die JS-Funktionen aufruft.
          Zuletzt geändert von onemorenerd; 20.10.2006, 22:17.

          Kommentar


          • #6
            Danke onemorenerd

            genau so wirds gemacht und dies muss dann irgendwie ausgeführt werden... mit innerHTML aber wird der <script>-tag nicht verarbeitet also wie kann ich dafür sorgen dass er das doch wird?

            und sry wegen dem VBC ich nenne bbcode, vieleicht fälschlicherweise ,immer so.

            Kommentar


            • #7
              Der Hinweis kam oben schon einmal, vielleicht hast du ihn überlesen: http://de.selfhtml.org/javascript/ob...engig.htm#eval

              Kommentar


              • #8
                Danke, nein eigentlich nicht.

                Könntest du mir ein Beispiel geben wie ich das in meinem Fal verwirklichen kann?

                Meinst du alle Scriptbereiche einzeln rausnehmen und dann verarbeiten? so z.B.:

                PHP-Code:
                 $string "Hallo. [script]play_sound(4)[/script]Wie gehts den so?[script]
                alert('huhuu')[/script]"
                ;
                preg_match_all("/\[script\][a-z0-9_\(\)\'\"]+\[\/script\]/i",$string,$matches);
                $matches implode(";",$matches[0]).";";
                $string preg_replace("/\[script\][a-z0-9_\(\)\'\"]+\[\/script\]/i","",$string);
                $matches preg_replace("/\[[\/]?script\]/i","",$matches);
                echo 
                "matches: ".$matches// Ausgabe: matches: play_sound(4);alert('huhuu')
                echo "String: ".$string// Ausgabe: String: Hallo. Wie gehts den so? 
                Dann verwende ich bei $matches eval und bei $string innerHTML oder wie hast du dir das vorgestellt?

                Kommentar


                • #9
                  Wenn du in .innerHTML einfach JS-Code reinschreibst, wird zwar der Inhalt des DOM-Elements geändert, aber nicht der JS-Interpreter aufgerufen. Folge: Der Code wird nicht ausgeführt.

                  Du könntest ein neues DOM-Element vom Typ script als Child des Elements erzeugen, über dessen innerHTML wir die ganze Zeit reden. Aber ich bin mir nicht sicher, ob da in allen Browsern der JS-Interpreter anspringt.

                  Deshalb versuche es mal so: Definiere einen onchange-Handler für das Element, über dessen innerHTML wir sprechen. Der Handler eval't den (neuen) Inhalt von innerHTML. Könnte funktionieren.

                  Kommentar


                  • #10
                    Die 1. Variante funktioniert leider z.B. beim IE nicht. Aber sonst eigentlich schon. Dann muss ich aber sowas wie bei $string und $matches machen.

                    die 2. Variante habe ich mal so probiert:
                    Code:
                    <script>
                    eval("<div>hi</div>;a=3;alert('hallo')");
                    </script>
                    und sie funktioniertsobald ich nach und vor jedem Aufruf von Javscript einen ; mache.
                    dies könnte die Lösung sein, wenn nicht
                    eval("a=3 und b=5, das ist die Lösung!;alert('Kapiert?!');");
                    z.B. einen Javascriptfehler verursachen würden.

                    so muss ich wohl doch jeweils einzeln $matches und $string übergeben und dann

                    .innerHTML += $string(als AJAX-responsetext)
                    eval($matches(als AJAX-responsetext))

                    Kommentar


                    • #11
                      Wenn du zwei so unterschiedliche Arten von Rückgabedaten hast - einmal Textdaten, einmal Scriptcode - dann würde ich mich von innerHTML (und vermutlich auch XMLHTTPRequest.responseText, weil damit AJAX ja "so schön einfach ist", nicht wahr?) mal verabschieden, und das ganze sauber aufbauen ... also dem X in AJAX auch Bedeutung verleihen: Sauberes XML zurückgeben, in dem es dann z.B. für Scriptcode ein eigenes Element gibt [1], dessen Inhalt dann leicht extrahiert werden könnte, etc.



                      [1] Der Name eines auch in XHTML vorhandenen solchen wäre übrigens bspw. <script>.
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #12
                        wennich das hier alles so lese, dann fällt mir auf, dass hier grad einige leute gleichzeitig an einem chat arbeiten, der auf dieser ajax-shoutBox basiert...(mich eingeschlossen).. und deren funktionen unterscheiden sich nur wenig...

                        vielleicht sollten wir alle nen gemeinsamen thread öffnen, statt jeder seinen eigenen...wir haben nämlich oft alle die gleichen probleme..
                        erfahrungsmangel mit dem innerHTML bzw DOM/child...übergabe, ablauf...usw.

                        falls nicht, werd ich meinen 2seiten thread gleich mal pflegen

                        Kommentar


                        • #13
                          Danke es klppt jetzt bei mir alles.

                          @ wahsaga: Ich habe jetzt sowieso alles mit respon************ML gemacht. Wenn es noch eine andere Möglichkeit gibt hast du ein Tutorial oder so für mich?

                          MfG

                          JMC

                          Kommentar

                          Lädt...
                          X