Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

Per Klick Daten in neuem Fenster anzeigen





Frage

Hallo allerseits, ich hab mal wieder eine kleine Frage: Ich habe eine Liste von verschiedenen Usern, die in einer MySQL-Datenbank gespeichert sind. Nun möchte ich, dass man auf den Namen der jeweiligen Person klickt und sich daraufhin ein Fenster öffnet, in dem ein Textfeld steht, in dem der Name der Person steht, auf den man geklickt hat. Ich klicke also auf Test und es öffnet sich ein kleines Fenster, in dem ein Textfeld mit Test steht. Gruß, Üsch

Antwort 1 von rfb

diese "kleinen Fenster" nennt man allgemein PopUp.
Syntax zum Aufruf wird hier beschrieben: SelfHTML -> JavaScript -> window.open()

Darin wird ein HTML-Dokument geladen, welches beliebigen Inhalt haben kann.

Wo ist nun deine Frage dazu?

Antwort 2 von Uesch

Ja, aber ich will doch, dass beim Klick auf einen Namen (der nicht innerhalb eines Formulars ist), der Name im neuen Fenster erscheint. Also du klicktst auf einen Namen, ein Fenster öffnet sich und da steht: Neue Email an: "Name".

Versteht ihr?

Antwort 3 von rfb

Zitat:
Versteht ihr?
nach wie vor verstehe ich nicht wo dein Problem liegt! Kannst du kein PopUp machen? Bekommst du kein HTML-Dokument mit besagtem Inhalt (nur ein Name!) hin?
Zitat:
aber ich will doch
mal eine detaillierte Problembeschreibung incl. bisheriger Lösungsversuche und etwaiger Fehlermeldungen dabei liefern.

Antwort 4 von Uesch

Ok, also:

Ich lasse mir mithilfe von PHP und MYSQL alle USer anzeigen, die in der Datenbank vorhanden sind. Dabei soll bei einem Klick auf irgendeinen Namen sich ein neues Fenster öffnen, in dem steht: Sie möchten eine Email schreiben an "Name dessen, auf den man vorher geklickt hat". Dann gibt es da ein kleines Formular und einen Button zum Abschicken. So nun ist die Frage wie man 1.: ihm sagt, dass beim Klick auf einen Namen, er diesen als Variable speichert und 2.: wie man im Popup genau den Namen dann anzeigt, auf den man zuvor geklickt hat! Ich hab es probiert mit einem Popup, aber das eigentliche Problem liegt dabei, dass ich nicht weiß wie man den namen als Variable speichert, denn ich möchte es nicht mit einem Formular machen!

Antwort 5 von dettlef

den namen übergibst du über eine an die popup-url angehängte variable: http://www.üsch.de/popup.php?name=detlef

Antwort 6 von Uesch

Dachte ich mir auch, aber dann sendet er das Formular ja direkt ab!

Antwort 7 von dettlef

welches formular? es ist richtig, dass man solche variablen normalerweise über formulare erzeugt/verschickt. daher vielleicht dein missverständnis. hier geht es aber nicht um ein formular. bei window.open gibst du die adresse des dokuments an, welches im aufpopenden fester angezeigt werden soll. und an diese adresse hängst du die variable dran (das ergebnis ist das gleiche, als hätte man ein formular der methode "get" mit einem inputfeld namens "name" und dem inhalt "detlef" abgeschickt. das heisst diese variable kann unter php ausgewertet werden, als käme sie von einem formular). php erzeugt dann den inhalt des popups mit dem namen des members. dieses dokument ist dann das "emailformular" und dieses wird dann erstmal nur angezeigt und nicht automatisch abgeschickt.

Antwort 8 von rfb

Vermutung: du möchtest nicht für jeden Namen ein eigenes Dokument ins PopUp laden?

nehmen wir mal an du hättest im Hauptdokument folgendes:

<span onclick="popup(this)">Otto</span> 


dann könnte die Funktion popup() so aussehen:

function popup(ausloeser) {
var wen = ausloeser.firstChild.data;
MeinFenster = window.open("formular.htm?"+wen, "Zweitfenster", "width=300,height=400,left=100,top=200");
MeinFenster.focus();
}


dies sollte dann die Datei formular.htm?Otto ins popup laden

in formular.htm erhältst du den Otto dann mittels

var wer = location.search.substr(1);


alles weitere bleibt dir überlassen.


Zitat:
wie man 1.: ihm sagt
du solltest von Browsern als Browser reden -> auch wenn sie Ärger machen sind es nur Programme!

Antwort 9 von Uesch

Vielen Dank,

ich habe jetzt eine Datei test.html, in der steht:

<script>
function popup(ausloeser) {
var wen = ausloeser.firstChild.data;
MeinFenster = window.open("formular.htm?"+wen, "Zweitfenster", "width=300,height=400,left=100,top=200");
MeinFenster.focus();
}
</script>

<span onclick="popup(this)"><a href="#">Otto</a></span>


Dann hab ich eine Datei formular.htm, in der steht das:

<script>var wer = location.search.substr(1);</script>


Leider zeigt er im Popup aber nix an! Einfach nur Totenleere. Was mach ich falsch?

Antwort 10 von dettlef

alles was du hast ist eine scriptvariable mit dem inhalt des angeklickten namens. jetzt brauchst du ein bisschen html und ein formular und dann musst du den value von deinem textfeld^^ auf "wer" setzen:
http://de.selfhtml.org/javascript/objekte/elements.htm#value

Antwort 11 von Uesch

und was war dann der Sinn des "Otto"?

Antwort 12 von dettlef

Zitat:
und was war dann der Sinn des "Otto"?

du meinst von "?Otto". das war damit in location.search.substr(1) der name des users drinsteht. dieser kommt dann in die variable "wer" und schliesslich landet er im textfeld (durch document.formname.feldname.value=wer).

Antwort 13 von Uesch

und wie kriegt man Otto in die Variable?

Antwort 14 von dettlef

in die variable "wer"? so:
var wer = location.search.substr(1);

Antwort 15 von Uesch

Das heißt, ich habe die formular.htm, in der
var wer = location.search.substr(1);
steht und eine zweite Datei test.html, in der
<script>
function popup(ausloeser) {
var wen = ausloeser.firstChild.data;
MeinFenster = window.open("formular.htm?"+wen, "Zweitfenster", "width=300,height=400,left=100,top=200");
MeinFenster.focus();
}
</script>

<span onclick="popup(this)"><a href="#">Otto</a></span>
steht. Wo genau kommt denn das Formular hin, von dem du vorhin gesprochen hast? In die formular.htm?

Antwort 16 von dettlef

also der otto-link und die popup-funktion stehen in dem dokument, welches die mitglieder auflistet. das auslesen von location.search.substr(1) und das formular zum kontakten des mitglieds kommt in das popupdokument (formular.htm).

Antwort 17 von rfb

Zitat:
<script>
ist falsch, korrekte Syntax:
<script type="text/javascript">


Wozu soll der Link in
<span onclick="popup(this)"><a href="#">Otto</a></span>
gut sein? Wenn du meine Funktion benutzen willst solltest du auch den Rest so machen wie vorgegeben oder alles umschreiben. So gibts höchstens eine Fehlermeldung!

Und dettlef hat Recht -> du musst in formular.htm eine JavaScript-Funktion einbauen, die mittels
location.search.substr(1)
den übergebenen Namen ausliest.
Was du weiter damit machen willst entzieht sich meiner Kenntnis.
Mit
<script (schon wieder den type weggelassen - wo hast du den Unfug gelernt?)>var wer = location.search.substr(1);</script>

hast du den Otto in der Variablen
wer
. Um ihn anzuzeigen müsstest du
wer
zB. mit
document.write(wer);
irgendwie ausgeben!

Antwort 18 von Uesch

Sehr geil.
Habs jetzt endlich verstanden und es klappt.

Danke an euch beide!

Antwort 19 von Uesch

Ach noch eine Frage: Wie mach ich folgendes richtig:

	<input type="text" name="textfieldName" value="document.write(wer);" readonly size="16"><br>


Also dass im Textfeld Otto steht...

Danke,

Üsch

Antwort 20 von rfb

zB so:

dies im head der formular.htm:

<script type="text/javascript">
window.onload=function () {
var wer = location.search.substr(1);
var feld=document.getElementsByName("textfieldName")[0];
if (feld) feld.value=wer;
}
</script>


und dies im body:


<input type="text" name="textfieldName" value="" readonly size="16">


Antwort 21 von rfb

beim Durchsehen fällt mir auf: sollte der Name Leerzeichen enthalten, also zB Otto Normalverbraucher, gibts ein Problem, das aber durch 2 kleine Code-Änderungen umgangen werden kann.

var wen = ausloeser.firstChild.data;
wird zu
var wen = escape(ausloeser.firstChild.data);


(wandelt Otto Normalverbraucher zu Otto%20Normalverbraucher)

und

var wer = location.search.substr(1);
zu
var wer = unescape(location.search.substr(1));

(zurück zu Otto Normalverbraucher)

Antwort 22 von dettlef

grundsätzlich find ich es sowieso sauberer mit der member id zu arbeiten. bei nicknamen kommen zu den sonderzeichenproblemen im http-protokoll ja dann auch noch html-codeinjectionprobleme dazu (member mit namen, wie "<script>history.back()</script>" und so ;-)).

habe grade im firefox getestet:
name des members: "<img src='1.jpg'>"
ausgegeben mit der php-funktion htmlentities():
<span onclick="popup(this)">&lt;img src='1.jpg'&gt;</span>

also noch alles im grünen bereich!
aber dann im popup mit:
document.write(unescape(location.search.substr(1)));

wird das bild angezeigt!

Antwort 23 von rfb

@detleff:
kann ich nicht nachvollziehen,
unescape(escape("&lt;")) 
ergibt bei mir &lt; und nicht <

Übrigens: wenn du document.write (und sein hässliches Brüderlein innerHTML) nicht verwendest, also so wie in Antwort 21 sauber arbeitest, bist du beim JavaScript auf der sicheren Seite.
Aber auch wenn da jemand mit viel Mühe Schadcode einschleust: es wird doch nur auf seiner eigenen Kiste ausgeführt!

Dass du serverseitig die Formulareingaben immer auf eingeschleusten Code überprüfen musst kann dir sowieso kein JavaScript abnehmen.

Antwort 24 von dettlef

hab grad ein wenig gebastelt und habe gedacht das problem lokalisiert zu haben, aber die gegenprobe ist gescheitert. jetz bin ich wieder so weit wie am anfang. ;-)
aber egal. wollte trotzdem schon mal vorweg zu deinen aussagen stellung nehmen:
Zitat:
Aber auch wenn da jemand mit viel Mühe Schadcode einschleust: es wird doch nur auf seiner eigenen Kiste ausgeführt!

der code wird auf der kiste desjenigen ausgeführt, der dem einschleuser eine mail schicken möchte!
Zitat:
Dass du serverseitig die Formulareingaben immer auf eingeschleusten Code überprüfen musst kann dir sowieso kein JavaScript abnehmen.

ganz andere baustelle: hier geht es darum, dass eine serverseitig getroffene sicherheitsmassnahme nachträglich von js sabotiert wird.

generell wollte ich ja nur darauf hinaus, dass man den umgang mit "fremdcode" weitestgehend vermeiden sollte und wenn möglich durch selbst erzeugten (member id) ersetzen. vor allem sollte man vermeiden, ihn durch eine "blackbox" wie js zu "jagen". und das ist unabhängig von der frage, ob das js gut oder schlecht programmiert ist.

Antwort 25 von rfb

Zitat:
der code wird auf der kiste desjenigen ausgeführt, der dem einschleuser eine mail schicken möchte!
E-Mail? Bahnhof?

Zitat:
serverseitig getroffene sicherheitsmassnahme
bislang dreht es sich um:
  • eine Seite mit einem Namen in einem span-Element
  • darauf ein onclick-Event
  • ein JavaScript-PopUp
  • darin wird ein Parameter beim PopUp-Aufruf per JavaScript verarbeitet

    -> das ist alles userseitig.

  • Antwort 26 von dettlef

    @rfb:
    ok. also nochmal alles ganz ausführlich:

    üsch gibt eine liste von membern aus, die er aus einer mysql-datenbank liest. wenn man einen dieser namen anklickt, öffnet sich ein kontaktformular (siehe antwort 2) und man kann eine (art?) mail an jenen schicken.

    nun hattest du ja eine lösung vorgeschlagen, wie man den namen des empfängers an das popup übermitteln kann, ohne dieses serverseitig dynamisch zu erzeugen, indem man mit js ein query an die popupurl hängt und dieses im popupdokument wieder mit js einliest. so weit so gut.

    dann viel dir ein, dass es ein problem geben könnte, wenn der membername ein leerzeichen enthält und du hast das skript dafür modifiziert.

    das grundlegende prinzip dieses problems ist es ja, dass man mit daten arbeitet, die man zum zeitpunkt der programmierung noch nicht kennt, da sie von den usern erzeugt werden.
    das hat mich auf einen anderen gedanken gebracht, nämlich das artverwandte problem von userseitiger codeinjection.

    vorweg:
    natürlich muss man versuchen, massnahmen zu setzen, die es dem user von vorneherein verunmöglichen, code zu injezieren. aber das problem ist natürlich komplex (wie man auch hier im sn beobachten kann). lange rede, kurzer sinn: es kann immer passieren, was nicht passieren darf.

    um zu prüfen ob eine codeinjection möglich ist, habe ich folgende annahme getroffen: ein user hat es geschafft, sich unter dem namen
    "<img src='1.jpg'>" bei der seite anzumelden. dieser name steht in der datenbank des servers (es ist also kein lokales problem eines users, sondern betrifft alle!).

    des weiteren habe ich angenommen, dass serverseitig die übliche standardmethode benutzt wird, daten, die von usern stammen, vor der ausgabe mit der funktion htmlentities() zu behandeln, um codeinjections unschädlich zu machen.

    beim aufruf der memberliste wird der name also nicht als "<img src='1.jpg'>" sondern als "&lt;img src='1.jpg'&gt;" ausgegeben.
    dementsprechend kommt der html-code nicht zur ausführung. es wird der name angezeigt und nicht das bild 1.jpg geladen.

    nun kommt aber js ins spiel. und der "übeltäter" ist die data eigenschaft (nicht etwa document.write). statt dem korrekten textknoteninhalt "&lt;img src='1.jpg'&gt;" gibt sie den html-code "<img src='1.jpg'>" zurück, der letztlich im popup eingefügt wird und zur ausführung gelangt, d.h. das bild wird angezeigt.

    dieses verhalten zeigen bei mir firefox, opera und der ie.

    Antwort 27 von dettlef

    Zitat:
    Übrigens: wenn du document.write (und sein hässliches Brüderlein innerHTML) nicht verwendest, also so wie in Antwort 21 sauber arbeitest, bist du beim JavaScript auf der sicheren Seite

    anscheinend gibt es aber auch ausnahmen. innerHTML gibt, im unterschied zu data, bei allen drei browsern den inhalt des textknotens korrekt wieder!

    Antwort 28 von rfb

    @detleff:
    zusammenfassend kingt das für mich recht konstruiert

    zu
    Zitat:
    statt dem korrekten textknoteninhalt "&lt;img src='1.jpg'&gt;" gibt [data] den html-code "<img src='1.jpg'>"
    die Methoden des node-Objekts geben das wieder, was im Dokumentenbaum ankommt, also auch nach der Auflösung der Entities.
    innerHTML hingegen gibt einfach alles wieder, was im Quellcode steht und zwar insbesondere auch HTML-Code.

    zur vermeintlichen Gefahr:
    Schau dir die Scripte nochmals genau an: letztlich würde auch hier das "<img src='1.jpg'>" nur im value eines input-Elements auftauchen - also einer Stelle, die serverseitig widerum entschärft wird. Solange üsch sowas nicht per
    document.write
    oder
    innerHTML
    ausgibt passiert damit nix, denn nur so bekommst er das in den Elementenbaum.

    zu
    Zitat:
    das grundlegende prinzip dieses problems ist es ja, dass man mit daten arbeitet, die man zum zeitpunkt der programmierung noch nicht kennt, da sie von den usern erzeugt werden.
    üsch hat nie geschrieben, wie seine Datenbank zustande kommt.

    Aber deine Bedenken lassen sich mit folgendem leicht entschärfen:
    var wen = escape( ausloeser.firstChild.data.replace(/<|>/g,  " "));

    (mit anderen Worten: ersetze alle kleiner/größer-Zeichen durch Leerzeichen)

    Antwort 29 von rfb

    ach so - für den Fall, dass sich jemand die Mühe macht, formular.htm durch direkte Eingabe in die Adresszeile aufzurufen (wozu auch immer), zusätzlich:

    var wer = unescape( location.search.substr(1).replace(/<|>/g, " "));


    Antwort 30 von dettlef

    ich habe nicht das gefühl, dass du den kern dessen, was ich meinte verstanden hast. seis drum.

    Antwort 31 von rfb

    So ist das mit den Gefühlen!

    Aber nochmals mein Ansatz:
  • Ich gehe davon aus, dass üsch brauchbare Namen in seiner Namensdatenbank hat
  • ich verkompliziere die Problematik nicht durch Annahmen, die Datenbank enthielte bereits schadhafte Datensätze
  • mit der Variante der Datenübergabe zwischen Hauptseite und PopUp (escape und replace) kann kein HTML-Code in beiden JavaScripten auftauchen.
  • ich gehe davon aus, dass serverseitig eine sinnvolle Auswertung erfolgt.
  • mein Gefühl sagt mir, dass die JavaScript-Seite so sicher ist, wie JavaScript nun mal nur sein kann.

    Zitat:
    es kann immer passieren, was nicht passieren darf.
    Wurst und Käse* wären hier: JavaScript ist deaktiviert. Dann passiert aber einfach gar nix. Inwiefern das schädlich ist, entzieht sich meiner Kenntnis. Frag doch mal üsch!

    * "the worst case"

  • Ich möchte kostenlos eine Frage an die Mitglieder stellen:


    Ähnliche Themen:


    Suche in allen vorhandenen Beiträgen: