Seite 1 von 3

Inhalt eines Textfeldes in eine Datenbank-Tabelle schreiben

Verfasst: 02.08.2013 01:44
von redbull254
Hallo erstmal,

ich suche eine Mod/Snippet/Anleitung, die es mir ermöglicht, an beliebiger Stelle in Template-Dateien (HTML-Dateien) ein Textfeld/Kommentarfeld zu erstellen und den Inhalt in einer neuen Tabelle in der phpBB3-Datenbank abzuspeichern.

In einer beliebigen HTML-Datei an beliebiger Stelle habe ich folgendes eingefügt:

<form method="post" action="db.php?id=001">
<p><label>Name:<br><input type="text" name="name"></label</p>
<p><label>Kommentar:<br>
<textarea name="text" cols="50" rows="3"></textarea></label</p>
<input type="submit" value="OK">
</form>


In der "bd.php" soll der Code stehen, der die Eintragung in die Tabelle der Datenbank initiiert. Die "id=0001" soll die Start-ID des ersten Kommentars sein und bei jedem neuen Kommentar von x-beliebiger Person hoch gezählt werden, damit es eine eindeutige Zuordnung Kommentar =>Person x gibt.
Ein Absenden mit leeren Inhalt soll verhindert werden, ebenso wie die Eingabe von bösartigen Script-Code oder ähnlichem Mist. Im Textfeld soll die Eingabe von Buchstaben und Zahlen entsprechend UTF-8 Ohne BOM möglich sein. Das Feld soll nur für Admins und Moderatoren sichtbar sein.

Szenario:
Ein Moderator möchte einen Hinweis hinterlassen, den nur Moderatoren oder Administratoren lesen können. Dieser Hinweis soll solange für die Mods/Admins sichtbar sein, bis er gelöscht wird. Dies könnte vielleicht durch eine Reset-Funktion realisiert werden. Die Eingabe von weiteren Kommentaren anderer Personen soll auch möglich sein.

Ich habe jetzt einen ganzen Tag das Internet durchsucht und schon eine Menge Code dazu gefunden. Aber je mehr ich gefunden habe, umso größer wurden meine Bedenken, "mal eben" etwas zusammen zu basteln, kann man doch durch so ein Feld eine Menge Sicherheitslöcher erstellen.
Daher hoffe ich, dass jemand schon einmal etwas ähnliches benötigt hat oder mir Tipps zur sichereren Umsetzung geben kann.

Re: Inhalt eines Textfeldes in eine Datenbank-Tabelle schrei

Verfasst: 02.08.2013 09:31
von gn#36
Wirklich sicher gegenüber z.B. cross site request forgery (XSRF) bekommst du es nur, wenn du ein Form Token erzeugst und mit einbindest. Ansonsten kann im Prinzip jeder, der dir was unterschieben möchte, dich auf eine präparierte Seite locken und deinen vermutlich vorhandenen Cookie nutzen um mutwillig eigenen Text in die Tabelle zu schreiben. Sofern bei der Anzeige keine Skripte ausgeführt werden ist das per se nicht unbedingt wer weiß wie schlimm, vor allem wenn der Text hinterher nur von Admins und Moderatoren gesehen werden kann.

Ansonsten kommt es sehr stark darauf an, wie genau du das hinterher darstellen willst. Wenn du den Text beispielsweise an der gleichen Stelle anzeigen möchtest wie er eingegeben wurde, dann muss in der Datenbank ja z.B. auch noch ganz genau gespeichert werden, an welcher Stelle ein Text eingegeben wurde. Sollen sie nur alle an einer Stelle gesammelt werden ist das ganze einfacher, dann frage ich mich aber, ob du nicht vielleicht einfach mit einem internen Forum besser fährst.

Um trotzdem einfach nur Text einzufügen brauchst du eigentlich nicht viel:

Code: Alles auswählen

<?php
... Seiteninitialisierung von phpBB wie in allen anderen Seiten auch, einfach kopieren ...
// Berechtigung abfragen: Nur Moderatoren und Admins
if(!($auth->acl_get('m_') || $auth->acl_getf_global('m_')) && !$auth->acl_get('a_'))
{
    trigger_error('NOT_AUTHED');
}

$text = request_var('text', '');
//Wurde was eingegeben?
if(empty($text))
{
   trigger_error('TEXT_EMPTY');
}
//Text entweder jetzt oder später vor der Anzeige filtern:
$text = htmlentities($text, ENT_QUOTES);

// ggf. weitere Felder der Tabelle ebenfalls über das Array füllen:
$sql = 'INSERT INTO tabelle_oder_konstante_einsetzen ' . $db->sql_build_array('INSERT', array(
    'feldname' => $text,
    'user_id' => $user->data['user_id'], //Für die Benutzerzuordnung
    //Weitere Felder die notwendig sind?
));
//Ausführen
$db->sql_query($sql);

trigger_error('TEXT_ENTERED');
Kann man sicherlich noch feintunen, z.b. werden ohne zusätzliche Sprachdateien natürlich statt schönen Fehlermeldungen die hässlichen Texte die oben drin stehen ausgegeben. Es wäre auch möglich dass ich da jetzt auf die schnelle ein paar Fehler eingebaut habe. Die ID im Formular anzugeben kannst du dir übrigens im Prinzip sparen. Es gibt Tabellenspalten, die selbst hochzählen, wenn ein neuer Eintrag erfolgt. Muss irgend ein Zahlenwert als Datentyp sein und dann als AUTO_INCREMENT festgelegt werden, wenn die Tabelle angelegt wird. Dieses Formular enthält jetzt keinen Form Token und ist daher im Prinzip angreifbar per XSRF. Da aber alle HTML Befehle in angezeigte Symbole verwandelt werden (d.h. kein ausführbarer Code ist möglich) und das außerdem nur von Moderatoren angesehen werden können soll wäre mir persönlich das egal. Wenn du dich dagegen absichern willst, dann musst du einen Token einbauen, der abgefragt wird, hierfür reicht es dann nicht mehr nur irgendwo ein Formular in den HTML Code zu setzen.

Re: Inhalt eines Textfeldes in eine Datenbank-Tabelle schrei

Verfasst: 02.08.2013 14:05
von redbull254
Hallo gn#36,
gn#36 hat geschrieben:Wirklich sicher gegenüber z.B. cross site request forgery (XSRF) bekommst du es nur, wenn du ein Form Token erzeugst und mit einbindest. Ansonsten kann im Prinzip jeder, der dir was unterschieben möchte, dich auf eine präparierte Seite locken und deinen vermutlich vorhandenen Cookie nutzen um mutwillig eigenen Text in die Tabelle zu schreiben.
Hm.., wie soll ein Angreifer von den eingefügten Textfeld wissen? Ich will keinen generellen Schutz für das Internet haben, sondern nur ein, an einer bestimmten eingebautes Textfeld (siehe dazu den Code, den ich eingestellt habe) , in das man nicht jeden Mist eingeben kann, der zur Ausführung gelangt. Da phpBB3 sicher ist, will ich nicht durch so etwas das ganze System unsicher machen. Solche Textfelder/Kommentarfelder sind nicht wirklich etwas ungewöhnliches, finde ich sie doch überall im Netz. Ich habe mir die Umsetzung jetzt nicht wirklich als ein besonderes Problem für einen Programmierer vorgestellt. :o


gn#36 hat geschrieben: Sofern bei der Anzeige keine Skripte ausgeführt werden ist das per se nicht unbedingt wer weiß wie schlimm, vor allem wenn der Text hinterher nur von Admins und Moderatoren gesehen werden kann.
Trotzdem sollte es abgesichert sein.
gn#36 hat geschrieben:Ansonsten kommt es sehr stark darauf an, wie genau du das hinterher darstellen willst. Wenn du den Text beispielsweise an der gleichen Stelle anzeigen möchtest wie er eingegeben wurde, dann muss in der Datenbank ja z.B. auch noch ganz genau gespeichert werden, an welcher Stelle ein Text eingegeben wurde. Sollen sie nur alle an einer Stelle gesammelt werden ist das ganze einfacher, dann frage ich mich aber, ob du nicht vielleicht einfach mit einem internen Forum besser fährst.
Ich mach es einmal deutlicher an einer Datei. Ich möchte ein Textfeld in die Galerie von @nickvergessen einbauen (viewimage.html), in dem, zum Beispiel für einen Wettbewerb, die Moderatoren Notizen eingeben können. Diese Notizen sollten natürlich genau dort angezeigt werden, wo sie eingegeben wurden, ansonsten würde das platzierte Textfeld Sinnfrei sein. Auch sollen sie so angezeigt werden, wie sie eingegeben wurden. Das es anders auch möglich sein soll, ist mit erst gar nicht in den Sinn gekommen. :-?




Um trotzdem einfach nur Text einzufügen brauchst du eigentlich nicht viel:

Code: Alles auswählen

<?php
... Seiteninitialisierung von phpBB wie in allen anderen Seiten auch, einfach kopieren ...
// Berechtigung abfragen: Nur Moderatoren und Admins
if(!($auth->acl_get('m_') || $auth->acl_getf_global('m_')) && !$auth->acl_get('a_'))
{
    trigger_error('NOT_AUTHED');
}

$text = request_var('text', '');
//Wurde was eingegeben?
if(empty($text))
{
   trigger_error('TEXT_EMPTY');
}
//Text entweder jetzt oder später vor der Anzeige filtern:
$text = htmlentities($text, ENT_QUOTES);

// ggf. weitere Felder der Tabelle ebenfalls über das Array füllen:
$sql = 'INSERT INTO tabelle_oder_konstante_einsetzen ' . $db->sql_build_array('INSERT', array(
    'feldname' => $text,
    'user_id' => $user->data['user_id'], //Für die Benutzerzuordnung
    //Weitere Felder die notwendig sind?
));
//Ausführen
$db->sql_query($sql);

trigger_error('TEXT_ENTERED');
Ich danke Dir für den Code. Der deckt sich in einigen Zeilen mit dem, den ich gefunden habe. Nun habe ich aber wie schon zu Beginn das Problem, das ich die Tabelle nicht erstellen kann und auch deren Inhalt nicht genau kenne. Ein entsprechender SQL-Befehl für Deinen Code wäre da sicherlich hilfreich.

Ich fasse einmal zusammen. Mit dem Code für das HTML-Textfeld (siehe meinen ersten Beitrag dazu) rufe ich durch den Klick auf "den OK-Button (oder senden oder was auch immer) die Datei auf, in der Dein Code (siehe dazu Deinen Beitrag) steht. Nun wird Dein Code "gestartet" und trägt den Inhalt aus dem HTML-Textfeld in die Tabelle ein und der wird dort gespeichert und bleibt so dauerhaft angezeigt. Da es scheinbar nichts fertiges dazu gibt, wäre es für mich hilfreich, wenn ich solches Vorgehen, idealerweise auf Deutsch, nachlesen könnte. Ich habe absolut keine Ahnung, wie ich die Tabelle in der SQL-Datenbank erzeugen kann und dann alles noch zu verbinden. Wenn ich das könnte, hätte ich nicht dieses Thema erstellt. Wahrscheinlich habe ich zu Beginn einfach nur die falschen Seiten erwischt, die mich mit ihren ganzen Warnhinweisen bekloppt gemacht und Mutlos haben. :oops:


Ich danke Dir für Deinen Beitrag, vielleicht fühlen sich dadurch noch andere Programmierer inspiriert, ein paar erklärende Kommentare dazu zu verfassen. Aktuell habe ich gerade wohl eine Art "temporären" Gehirnkrampf und drehe mich gedanklich im Kreis. :lol:
Sobald der Krampf sich gelöst hat, werde ich derweil weiter im großen Netzwerk "Internet" nach Lösungen suchen, ich bin sicherlich nicht der einzige, der solche Ideen hat, sie aber nicht umsetzen kann. Nicht jeder hat Programmierer gelernt, es gibt noch eine Menge andere Berufe, die man lernen oder studieren kann, um sein Geld zu verdienen. Ich kann zum Beispiel wirklich gut mit Werkzeug umgehen und auch ganz große Maschinen und Geräte reparieren. :D

Re: Inhalt eines Textfeldes in eine Datenbank-Tabelle schrei

Verfasst: 02.08.2013 17:14
von BNa
Nun habe ich aber wie schon zu Beginn das Problem, das ich die Tabelle nicht erstellen kann und auch deren Inhalt nicht genau kenne.
Liegt doch auf der Hand. Einfach ein, zwei zusätzliche SQL Tabellenspalten in der Gallery :wink:

Schonmal wegen:
Ich möchte ein Textfeld in die Galerie von @nickvergessen einbauen (viewimage.html), in dem, zum Beispiel für einen Wettbewerb, die Moderatoren Notizen eingeben können. Diese Notizen sollten natürlich genau dort angezeigt werden, wo sie eingegeben wurden, ansonsten würde das platzierte Textfeld Sinnfrei sein. Auch sollen sie so angezeigt werden, wie sie eingegeben wurden. Das es anders auch möglich sein soll, ist mit erst gar nicht in den Sinn gekommen. :-?
Wie sollte es auch anders gehen, wenn es der Gallery oder Gallery Bildern zugeordnet sein soll.

Für so eine Specialerweiterungen wäre eine gute Adresse hier: viewforum.php?f=57

Re: Inhalt eines Textfeldes in eine Datenbank-Tabelle schrei

Verfasst: 03.08.2013 05:02
von redbull254
BNa hat geschrieben:
Für so eine Specialerweiterungen wäre eine gute Adresse hier: viewforum.php?f=57
Nachdem ich nun Jahrelang und mit Tausenden Beiträgen anderen geholfen habe, werde ich doch wohl erst einmal ebenfalls eine kostenlose Hilfe in diesem Forum suchen. Es gibt für die unmöglichsten Funktionen eine Mod, warum nicht auch für so einen Fall? Es kommen jeden Tag neue Ideen und darauf resultierende Mods dazu, wie man daran sehen kann, dass innerhalb eines Monats zwei Ideen von mir zu nützlichen Mods geworden sind. :roll:
BNa hat geschrieben:Liegt doch auf der Hand. Einfach ein, zwei zusätzliche SQL Tabellenspalten in der Galler
Wenn Du meinen Beiträgen die zum Verständnis nötige Aufmerksamkeit gewidmet hättest, wäre vielleicht Dir aufgefallen, dass ich dies nicht kann.

Dein Beitrag hat leider nicht Ansatzweise ein Hilfe für mein Problem gebracht und war in meinen Augen leider nur "Off-Topic". Ich bitte darum, in diesem Thema davon abzusehen, weil er mich nicht weiter bringt und mir eine Lösung des Problems wichtig ist. Ich war lange genug aktiv im phpbb.de-Team, um die Jobbörse zu kennen, wenn ich es nicht schon als "normales" Mitglied gewusst hätte. Sollte aber Deine Motivation für diesen Hinweis dahinter den das Ziel verfolgen, mir eine kostenpflichtige Lösung anzubieten, kannst Du mir gerne ein Angebot direkt per PN zukommen lassen. Das wäre der einfachere Weg. :) Zwar hoffe ich begründet immer noch auf eine kostenlose Hilfe, aber man sollte sich immer alle Optionen offen halten.
Ansonsten bitte ich von Beiträgen dieser Art abzusehen, Danke dafür. Beiträge der Art wie der von @gn#36 sind sicherlich auch anderen hilfreich, weil er die Codezeilen sehr gut kommentiert hat, was dazu führt, dass man die Funktion endlich einmal detailliert erklärt lesen kann und so weiß, was sie genau bedeuten. Dafür meinen besonderen Dank. :wink:


Edit//
Dieser Artikel könnte die Lösung bringen, wobei ich die SQL-Anweisung für die Erstellung der benötigen Tabelle noch wissen müsste.
Formulare in Datenbank speichern (PHP/MySQL)

Man muss nicht immer das Rad neu erfinden. :lol:

Re: Inhalt eines Textfeldes in eine Datenbank-Tabelle schrei

Verfasst: 03.08.2013 12:04
von BNa
redbull254 hat geschrieben:
BNa hat geschrieben:Liegt doch auf der Hand. Einfach ein, zwei zusätzliche SQL Tabellenspalten in der Gallery

Wenn Du meinen Beiträgen die zum Verständnis nötige Aufmerksamkeit gewidmet hättest, wäre vielleicht Dir aufgefallen, dass ich dies nicht kann.
Nun bin ich aber verwirrt :grin:
redbull254 hat geschrieben: Ich möchte ein Textfeld in die Galerie von @nickvergessen einbauen (viewimage.html), in dem, zum Beispiel für einen Wettbewerb, die Moderatoren Notizen eingeben können. Diese Notizen sollten natürlich genau dort angezeigt werden, wo sie eingegeben wurden, ansonsten würde das platzierte Textfeld Sinnfrei sein. Auch sollen sie so angezeigt werden, wie sie eingegeben wurden.

Re: Inhalt eines Textfeldes in eine Datenbank-Tabelle schrei

Verfasst: 03.08.2013 12:20
von Elsensee
redbull254 hat geschrieben:
BNa hat geschrieben:Liegt doch auf der Hand. Einfach ein, zwei zusätzliche SQL Tabellenspalten in der Galler
Wenn Du meinen Beiträgen die zum Verständnis nötige Aufmerksamkeit gewidmet hättest, wäre vielleicht Dir aufgefallen, dass ich dies nicht kann.

[...]

Edit//
Dieser Artikel könnte die Lösung bringen, wobei ich die SQL-Anweisung für die Erstellung der benötigen Tabelle noch wissen müsste.
Formulare in Datenbank speichern (PHP/MySQL)

Man muss nicht immer das Rad neu erfinden. :lol:
Hm... hast du nicht sowas wie phpMyAdmin? Damit wäre das Erstellen von Tabellenspalten doch recht einfach?
Notfalls müsstest du dir eben die SQL-Anweisung raussuchen:

Code: Alles auswählen

ALTER TABLE table_name
ADD column_name datatype
Für den Text kannst du den Datentyp MEDIUMTEXT wählen, so wie es phpBB für die Beiträge gemacht hat. Für ein Kommentar würde vielleicht auch die kleinere Version reichen, aber sicher ist sicher. :D Gib du mal 16,7 Millionen Zeichen ein...
Für die ID hat phpBB bei den Post-Texten UNSIGNED MEDIUMINT(8) verwendet. Platz für 16,7 Millionen Posts und, wenn du es verwendest, auch Platz für 16,7 Millionen Kommentare. Was meinst du? Reicht das? :wink:

Jetzt musst du nur noch wissen, in welche Tabelle das soll und wie die Spalten heißen sollen. comment_id und comment_text wären vielleicht gute Namen. Das Ergebnis:

Code: Alles auswählen

ALTER TABLE phpbb_gallery
ADD comment_id UNSIGNED MEDIUMINT(8) NOT NULL auto_increment;
Hinweis: NOT NULL heißt, das in diese Tabelle keine Null-Werte dürfen und auto_increment sagt, dass sich der Wert automatisch beim Eintragen erhöht. :wink:

Code: Alles auswählen

ALTER TABLE phpbb_gallery
ADD comment_text MEDIUMTEXT
Theoretisch könnte nun noch diese Anweisung folgen:

Code: Alles auswählen

ALTER TABLE phpbb_gallery
ADD KEY
Müsste so funktioneren. Steht auch so ähnlich im phpBB drin. :D

Du musst phpbb_gallery natürlich noch mit der Tabelle ersetzen, in der die Infos zur Gallerie oder den Bildern oder so gespeichert werden... Vielleicht wäre aber eine ganz eigene Tabelle mit einer comment_id, einem comment_text und der photo_id (oder was auch immer) besser? :wink: Wenn du den Moderatoren ermöglichen willst dadrunter zu diskutieren, wäre das wirklich besser. :) Die photo_id darf dann natürlich nicht auto_increment sein, da sie ja zu dem Foto verweist, unter dem diese Diskussion stattfindet.

Brillante Ideen hast du. :wink: Ich hoffe, ich konnte dir ein wenig helfen oder wenigstens anderen einen Einstiegspunkt in diese Diskussion geben. :)

Re: Inhalt eines Textfeldes in eine Datenbank-Tabelle schrei

Verfasst: 03.08.2013 15:30
von Miriam

Code: Alles auswählen

ALTER TABLE phpbb_gallery ADD KEY(spalten_name_1, spalten_name_2, spalten_name_3);
Du kannst den Tabellennamen und die Spaltennamen auch in Backticks setzen, dann bist Du auf der sicheren Seite.

Re: Inhalt eines Textfeldes in eine Datenbank-Tabelle schrei

Verfasst: 03.08.2013 16:52
von redbull254
Hallo Elsensee und Miriam,

erst einmal „Danke“ für Eure sinnvollen Beiträge, die mich nun weiter bringen.

Das benötigte Textfeld in eine HTML-Datei zu setzen, war und ist nicht das Problem gewesen. Auch das eventuelle Ausrichten mit CSS stellt mich vor keine unlösbare Aufgabe, solche Dinge bekomme ich selber hin, zumal es dazu jede Menge deutschsprachige Hilfe im Netz gibt. Zu PHP und SQL sind die meisten, wohl auch guten Seiten in Englisch verfasst und da ich diese Sprache gelegentlich nur im Urlaub zum Essen und Trinken bestellen brauche, sind meine verbliebenen Kenntnisse dieser Sprache eher begrenzt für solche Dinge einsetzbar. :P

Aber Dank der genauen Erklärung von @Elsensee kommt nun auch in dieses Thema langsam Licht in Dunkle. :)

Ich danke Euch für die Unterstützung. :)

Re: Inhalt eines Textfeldes in eine Datenbank-Tabelle schrei

Verfasst: 04.08.2013 08:06
von Gast234254
Schau dir mal diese Mod s an:

Personal Notes

Admin Notes

Die könntest du doch für deinen Zweck umbauen. Zumindestens veraten die dir den Datenbankeintrag. Guttenberg und viele andere Politiker haben auch abgeschrieben :wink: