Ein Selfhtml Artikel ohne Datum, abfrage zur Aktualität.
Engin
- zu diesem forum
Nabend,
hab mir gerade diesen Artikel "Formularvalidierung mit regulären Ausdrücken"
angesehen und würde gern wissen,
wie Aktuell die dort beschriebene Methode ist.
Da steht leider kein Datum zum erstellungs Zeitpunkt. Bug oder Absicht? Man weiss es nicht. :)
Grüße,
Engin
GYRO
Moin!
hab mir gerade diesen Artikel "Formularvalidierung mit regulären Ausdrücken"
angesehen und würde gern wissen,
wie Aktuell die dort beschriebene Methode ist.Da steht leider kein Datum zum erstellungs Zeitpunkt. Bug oder Absicht? Man weiss es nicht. :)
Der Quelltext sagt:
<meta name="SELF.Firstdate" content="2005-04-02T13:35+01:00">
Dem würde ich erst einmal glauben. Und auch ein oberflächliches Artikelscannen hat keine argen Bösheiten auffinden lassen: Der PHP-Code kennt z.B. $_GET, die Problematik von magic_quotes_gpc, die Notwendigkeit des Escapings für Datenbanken mit mysql_real_escape_string() etc.
Wenn du Fehler findest, darfst du sie trotzdem gerne melden: https://redaktion.selfhtml.org/newticket?component=SELFHTML aktuell :)
- Sven Rautenberg
Hi Sven, hi roland,
Der Quelltext sagt:
<meta name="SELF.Firstdate" content="2005-04-02T13:35+01:00">
>
> Dem würde ich erst einmal glauben.
Da hätte ich auch selbst draufkommen können, liegt aber daran, das ich in
meinen Quelltexten sowas nicht benutze, sollte ich in Zukunft wohl machen.
> Wenn du Fehler findest, darfst du sie trotzdem gerne melden: <https://redaktion.selfhtml.org/newticket?component=SELFHTML%20aktuell> :)
O.k, werde das Formular benutzen, wenn ich gehackt werde meld ich mich. :)
Grüße aus H im R,
Engin
--
["ich bin ein Insekt, ich bin ein Insekt"](http://nimmet.de/nimmet-dateien/banjo.shtml)
![](http://nimmet.de/nimmet-bilder/valigator.gif)[Der Valligator](http://old.atomic-eggs.com/old_forum/messages/237.html#a1)
["I would like to buy a hamburger"](http://www.youtube.com/watch?v=x8S7x_z1w1s)
Hi Sven,
Wenn du Fehler findest, darfst du sie trotzdem gerne melden: https://redaktion.selfhtml.org/newticket?component=SELFHTML aktuell :)
Da wollte ich jetzt drauf zurück kommen, aber weiss nicht, wie ich es dort melden soll, da mein anliegen irgendwie zu
keinem der "Type:" passt, da fehlt dann "beschwerde". :)
Hätte man bei diesem Script nicht einfaches verständliches PHP verwenden können?
Ich wollte im Script Teil
if ($form_send):
$errorlist = $errors == 0
? '<h2>Vorschau, die Daten wurden noch nicht gespeichert!</h2>
<p>....</p>'
die gefüllten Variablen aus den Formularen zur vorschau einbinden, aber ich versteh
diese Art von PHP Code nicht. Wie schimpft sich die hier verwendete Methode?
Laufen tut es jedenfalls schonmal.
Grüße aus H im R,
Engin
Hi,
Ich wollte im Script Teil
if ($form_send):
$errorlist = $errors == 0
? '<h2>Vorschau, die Daten wurden noch nicht gespeichert!</h2>
<p>....</p>'
>
> die gefüllten Variablen aus den Formularen zur vorschau einbinden, aber ich versteh
> diese Art von PHP Code nicht. Wie schimpft sich die hier verwendete Methode?
Das erste ist eine [alternative Schreibeweise fuer If](http://www.php.net/manual/en/control-structures.alternative-syntax.php) - statt den Anweisungsblock, den du von einer Bedingung abhaengig machen moechtest, in geschweifte Klammern zu schreiben, kannst du auch
~~~php
if(bedingung):
// Anweisungen
endif;
verwenden.
Und das andere, worueber du hier gestolpert bist, ist der Ternary Operator - manchmal auf Deutsch auch als Trinitaets-Operator bezeichnet.
Der stellt eine Art Kurzform einer If-Abfrage dar, in Form eines Ausdruckes - eignet sich insbesondere fuer Zuweisungen, wo du abhaengig von einer Bedingung einen bestimmten Wert und bei Nichtzutreffen einen anderen zuweisen willst.
$a = ($b == 5) ? $c : $d;
Wenn die Bedingung $b == 5 zutrifft, bekommt $a den Wert von $c zugewiesen, andernfalls den von $d.
In der "langen" Schreibweise mit If saehe das so aus:
if($b == 5) {
$a = $c;
}
else {
$a = $d;
}
MfG ChrisB
Hi ChrisB,
Danke, das hab ich jetzt soweit verstanden, nur, wie kann ich in diesem Block
if ($form_send):
$errorlist = $errors == 0
? $vor_var = $values['interpret']
: '<h2>..</h2>';
endif;
die Variable $vor_var
mit dem Wert von $values['interpret']
füllen, ohne das
ganze gleich auszugeben, da die Ausgabe an anderer Stelle passieren soll.
Warum wird im obigen beispiel überhaupt irgendwas ausgegeben? Ich füll die Variable doch nur mit einem Wert.
Grüße aus H im R,
Engin
Hi,
if ($form_send):
$errorlist = $errors == 0
? $vor_var = $values['interpret']
: '<h2>..</h2>';
endif;
>
> Warum wird im obigen beispiel überhaupt irgendwas ausgegeben? Ich füll die Variable doch nur mit einem Wert.
Eben - da wird nix ausgegeben.
Wenn du eine Ausgabe hast, muss die woanders herkommen.
MfG ChrisB
Hi ChrisB,
Eben - da wird nix ausgegeben.
Wenn du eine Ausgabe hast, muss die woanders herkommen.
Ich weiss es nicht, hab mich jetzt die ganze Zeit nur auf das genannte stück Code
fixiert gehabt, da änderungen nur dort bemerkbar wurden.
Das gesamte Script ist so unübersichtlich und schwer zu Handhaben, an sich funktioniert es ja, nur Vorschau
sollte auch Vorschau sein.
Ich versteh garnicht, für wem das Script sein soll, für anfänger die es lernen wollen (ungeeignet) oder
fortgeschrittene, die es eh können.
http://nimmet.de/phpistest/eintragtest.txt
Grüße aus H im R,
Engin
Lieber Engin,
if ($form_send):
$errorlist = $errors == 0
? $vor_var = $values['interpret']
: '<h2>..</h2>';
endif;
Du meinst wohl eher soetwas?
~~~php
if ($form_send) {
$vor_var = ($errors == 0) ? $values['interpret'] : $values['fehlermeldung'];
}
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hi Felix,
Du meinst wohl eher soetwas?
if ($form_send) {
$vor_var = ($errors == 0) ? $values['interpret'] : $values['fehlermeldung'];
}
Ja, so soll es sein, vielen Dank!
Da mogelt sich in der Vorschau noch irgendwo her eine "1" in die Seite,
damit kann ich aber leben. :) Wahrscheinlich irgendein Array indiz.
Hab´s für mich ein wenig ändern müssen, da ich mir da irgendwas zusammen abstrahiert hab,
aber es lebt.
~~~php
$errorlist = '';
if ($form_send) {
$vor_var = ($errorlist = $errors == 0) ? $values['interpret'].'<br />'.$values['album'] : '<h2>Einige Formulareingaben sind unvollständig oder
fehlerhaft</h2><ul><li>'.
join('</li><li>', array_filter($messages)).
'</li></ul>';
}
else {
$vor_var = '';
}
Dann kann ich Heute ja doch noch ruhig schlafen. :) Werde Heute Abend noch die HTML ausgabe überarbeiten.
Gute Nacht und viele Grüße aus H im R,
Engin
Hi,
Da mogelt sich in der Vorschau noch irgendwo her eine "1" in die Seite,
damit kann ich aber leben. :) Wahrscheinlich irgendein Array indiz.
Nein, vermutlich eher ein Funktionsaufruf, der true als Rueckgabewert zurueckgibt - den du dann unnoetigerweise per echo ausgibst, was true zu 1 konvertiert.
MfG ChrisB
Hi ChrisB,
Nein, vermutlich eher ein Funktionsaufruf, der true als Rueckgabewert zurueckgibt - den du dann unnoetigerweise per echo ausgibst, was true zu 1 konvertiert.
Stimmt, jetzt ist es Fertig. :) Da war noch die Variable $errorlist im <<< EOT, daher hatte ich
es übersehen.
Da kann man ja an die Tests,
Sinnlose Einträge zu testzwecken und überlastung meiner Server erwünscht,
falls sich hier der ein oder andere hacker Tummelt, so ist er herzlichst eingeladen, mich zu hacken. :))
Grüße aus H im R,
Engin
"Formularvalidierung mit regulären Ausdrücken"
Da steht leider kein Datum zum erstellungs Zeitpunkt.
Use The Source, Luke:
<meta name="DC.Date" content="2005-04-02T13:35+01:00">
<meta name="SELF.Firstdate" content="2005-04-02T13:35+01:00">
<meta name="SELF.Version" content="1">
Hi Engin,
jaa, schon wieder ich, schon wieder usereingaben. *g
Bastel grad an einem Login mit registrierung, diese Daten kommen in die DB, die muss
ich wohl auch mit mysql_real_escape_string
übergeben oder? Hab ein Tut dazu gefunden, wo es ohne gemacht wird,
ich mach es einfach mit.
Aber wie ist das beim fertigen Login, wenn der User seine Daten hat und sich einloggen will,
da muss er ja nur sein Benutzernamen und sein Passwort eingeben, muss ich diese Eingaben auch bearbeiten? Wenn ja, mit was?
Bzw. Passwort wird mittels md5 übergeben, also man sieht nur Sterne, aber der Benutzername.
Und natürlich noch die Suchfunktion, ich hab mir da was provisorisch aus GET
gebastelt, müssen auch hier die Eingaben gesondert behandelt werden?
<form action="searchdetails.php?" method="GET">
<input type="radio" name="suche_in" value="Interpret">Interpret
<input type="radio" name="suche_in" value="Album">Album
<input type="radio" name="suche_in" value="Titel">Titel
<input type="text" name="suche" size="20" value=""> Suche
if (($_GET['suche_in']) && ($_GET['suche'])){
$sql = "SELECT * from songtexte WHERE $suche_in LIKE '$suche%' ";
$ergebnis = mysql_query($sql);
while($row = mysql_fetch_object($ergebnis))
{
echo (htmlspecialchars($row->$suche_in));
echo '<a href="details.php?id=';
echo (htmlspecialchars($row->id));
echo '>';
echo (htmlspecialchars($row->Titel));
echo '</a>';
}
}
else {
echo 'keine treffer';
}
Und hier funktioniert das Else nicht, also wenn es keine treffer gibt bekomme ich die else nicht angezeigt,
wo liegt hier der fehler?
Auf meiner suche habe ich diesen interessanten Artikel gefunden, vielleicht hilft es ja wem.
Grüße aus H im R,
Engin
Hi,
Bastel grad an einem Login mit registrierung, diese Daten kommen in die DB, die muss
ich wohl auch mitmysql_real_escape_string
übergeben oder?
Zum x-ten Mal: Wenn du Daten in einen bestimmten Kontext ueberfuehrst, dann *musst* du die Daten diesem Kontext entsprechend behandeln.
Ob du einen Usernamen, ein Passwort, die Fellfarbe deines Hundes, oder die Todesanzeige von Oma in den Kontext MySQL ueberfuehrst - scheissegal. *Alle* erfordern natuerlich die entsprechende Behandlung.
Hab ein Tut dazu gefunden, wo es ohne gemacht wird,
ich mach es einfach mit.
A) Man findet viel Mist im Netz.
B) Da du ja herkommst, um dazuzulernen, kannst du dir deine eigenen Gedanken zu dem Mist, den du findest, machen, und ihn entsprechend einordnen.
Aber wie ist das beim fertigen Login, wenn der User seine Daten hat und sich einloggen will,
da muss er ja nur sein Benutzernamen und sein Passwort eingeben, muss ich diese Eingaben auch bearbeiten?
Ja natuerlich - was hammer den oben gerade gesagt, hm?
Wenn ja, mit was?
Na mit was wohl? Dem ueblichen.
Bzw. Passwort wird mittels md5 übergeben, also man sieht nur Sterne, aber der Benutzername.
Die Sterne siehst du nicht, weil das Passwort mit MD5 gehasht wird, sondern weil das input-Feld vom type password ist.
Und natürlich noch die Suchfunktion, ich hab mir da was provisorisch aus GET
gebastelt, müssen auch hier die Eingaben gesondert behandelt werden?
Siehe oben ...!
if (($_GET['suche_in']) && ($_GET['suche'])){
$sql = "SELECT * from songtexte WHERE $suche_in LIKE '$suche%' ";
$ergebnis = mysql_query($sql);
while($row = mysql_fetch_object($ergebnis))
{
echo (htmlspecialchars($row->$suche_in));
echo '<a href="details.php?id=';
echo (htmlspecialchars($row->id));
echo '>';
echo (htmlspecialchars($row->Titel));
echo '</a>';
}
}
else {
echo 'keine treffer';
}
>
> Und hier funktioniert das Else nicht, also wenn es keine treffer gibt bekomme ich die else nicht angezeigt,
> wo liegt hier der fehler?
Das else interessiert sich ueberhaupt nicht dafuer, ob du von der DB Ergebnisse bekommst oder nicht.
Es ist das Gegenstueck zum if - und nimmt das etwa Bezug darauf, ob und was die Datenbank liefert? Noe, nicht im Geringsten.
MfG ChrisB
Hi ChrisB,
die Fellfarbe deines Hundes, oder die Todesanzeige von Oma in den Kontext MySQL ueberfuehrst - scheissegal. *Alle* erfordern natuerlich die entsprechende Behandlung.
<ich abe gar keine Hund> :) Aber stimmt, hast natürlich Recht, werde einfach mein
eintrags Formular, das ich habe auch für die Registrierung umbauen/benutzen, das überprüft ja alle Eingaben.
A) Man findet viel Mist im Netz.
B) Da du ja herkommst, um dazuzulernen, kannst du dir deine eigenen Gedanken zu dem Mist, den du findest, machen, und ihn entsprechend einordnen.
Stimmt, ich habe bis jetzt schon viel Mist gefunden, nur als Grundlage kann man das
ein oder andere ja benutzen. Und durch erweiterungen der gefundenen Dinge kann man ja
auch schritt für schritt lernen.
da muss er ja nur sein Benutzernamen und sein Passwort eingeben, muss ich diese Eingaben auch bearbeiten?
Wenn ja, mit was?
Na mit was wohl? Dem ueblichen.
mysql_real_escape_string? Beim Login?
gebastelt, müssen auch hier die Eingaben gesondert behandelt werden?
Siehe oben ...!
Das Login und die suche sind doch auf GET Basis, gut, die variablen, "wo" in der Datenbank
gesucht werden soll, werde ich in ein Array packen, so wie von Sven vorgeschlagen,
aber die eingabe im Textfeld, muss ich die noch irgendwie bearbeiten.
Denn ich denke mir das so, wenn ich eine suchanfrage mache und die ergebnisse bekomme, steht in der Adresszeile ja z.b.
ergebnis.php?suche_in=Interpret&suche=ko
hier könnte man doch auch reinschreiben, was man will.
Und hier funktioniert das Else nicht,
Das else interessiert sich ueberhaupt nicht dafuer, ob du von der DB Ergebnisse bekommst oder nicht.
Es ist das Gegenstueck zum if - und nimmt das etwa Bezug darauf, ob und was die Datenbank liefert? Noe, nicht im Geringsten.
Da muss ich die egebnisse erst auf true/false testen oder?
Grüße aus H im R,
Engin
Moin!
Und natürlich noch die Suchfunktion, ich hab mir da was provisorisch aus GET
gebastelt, müssen auch hier die Eingaben gesondert behandelt werden?
Aber auf jeden Fall!
Alles, was im endgültigen SQL-Query dynamisch hineinkommt, muß behandelt werden!
Dummerweise nicht alles gleich.
Das Syntaxhighlighting zeigt im String ja die beiden Variablen schön deutlich an. Und wo Variablen in SQL reinkommen, droht Gefahr.
$sql = "SELECT * from songtexte WHERE $suche_in LIKE '$suche%' ";
Dummerweise hast du hier nun ausgerechnet zwei Spezialsonderfälle ausgegraben, bei denen dir mysql_real_escape_string() beidesmal nicht exakt helfen kann.
Beginnen wir mit $suche_in. Der Variableninhalt ist eine in der Tabelle existierende Spalte, die durchsucht werden soll.
Den Spaltennamen mit mysql_real_escape_string() zu escapen hilft absolut nicht, weil diese Funktion nur dafür vorgesehen ist, "Daten" innerhalb von einfachen 'Anführungszeichen' zu escapen.
Wenn du die Spaltennamen flexibel haben willst, mußt du anders vorgehen: Ein im Programmcode definiertes Array enthält alle erlaubten, gültigen Spaltennamen, und dein Radiobutton wählt aus diesem Array über den Index nur noch eine der erlaubten Namen aus. Auf diese Weise wird verhindert, dass
a) der Angreifer sich beliebige (auch nichtexistierende) Spaltennamen ausdenken kann (er kann das Formular ja beliebig verändern und dir Blödsinn schicken),
b) der Angreifer bösen SQL-Code in dein Query reinkriegt.
Abgesehen davon wird dein Code dadurch ein Tickchen flexibler, weil die Bezeichner im HTML-Formular nicht mehr mit den Bezeichnern der DB-Spalte übereinstimmen müssen, sondern durch das Array ineinander konvertiert werden.
Das zweite Problem bildet die Variable $suche. Im Prinzip hilft dir mysql_real_escape_string() hier schon, weil es sich, wie auch in allen anderen Anwendungsfällen, um einen String innerhalb von einfachen Anführungszeichen dreht.
Allerdings gibt es hier einen kleinen Unterschied: Du nutzt die Suchfunktion mit LIKE, und das sorgt dafür, dass zwei Zeichen plötzlich Sonderbedeutung erhalten: '%' und '_'. Diese beiden Zeichen sind normal nichts ungewöhnliches und werden daher auch nicht escaped. Müssen sie auch nicht. Aber was ist, wenn der Benutzer in der Datenbank einen Begriff sucht, der ein Prozentzeichen oder einen Unterstrich enthält - aber damit nicht das LIKE-Platzhalterzeichen gemeint ist, sondern ein real in der Datenbank gespeichertes Prozent oder Unterstrich?
Du mußt dich an dieser Stelle also entscheiden, was du willst (Suchen sind hinsichtlich der "korrekten Suchergebnisse" ja durchaus Auslegungssache): Gibt der Benutzer einen String ein, der exakt so gefunden werden soll, oder soll die Nutzung von Datenbank-Wildcardzeichen für die Suche erlaubt sein? Und wäre es in so einem Fall nicht schlauer, wenn man die typischeren Zeichen wie "*" dafür einsetzen würde?
Das Escaping für Wildcardzeichen in MySQL ist jedenfalls relativ simpel: Backslashes sind der Standard, man kann aber im Prinzip jedes beliebige Zeichen verwenden, wenn man es im Query angibt.
Allerdings ist die Backslashverdopplung zu beachten, denn bereits im String enthaltene Backslashes müssen natürlich nochmal escaped werden, damit sie als tatsächliches Zeichen "durchkommen", und nicht zwischendurch als Escape-Zeichen eliminiert werden. Das gilt auch für die durch mysql_real_escape_string() eingeführten Backslashes.
Siehe auch http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like.
- Sven Rautenberg
Hi Sven,
erstmal Danke für deine ausführliche Antwort.
Wenn du die Spaltennamen flexibel haben willst, mußt du anders vorgehen: Ein im Programmcode definiertes Array enthält alle erlaubten, gültigen Spaltennamen, und dein Radiobutton wählt aus diesem Array über den Index nur noch eine der erlaubten Namen aus.
Das ist schonmal ein guter Vorschlag, wie gesagt, meine suche war nur provisorisch.
Ich wollte erstmal ein Paar erfolgserlebnisse, jetzt mach ich mich ans aufräumen.
Du mußt dich an dieser Stelle also entscheiden, was du willst (Suchen sind hinsichtlich der "korrekten Suchergebnisse" ja durchaus Auslegungssache): Gibt der Benutzer einen String ein, der exakt so gefunden werden soll, oder soll die Nutzung von Datenbank-Wildcardzeichen für die Suche erlaubt sein?
Mit Wildcardzeichen ist doch gemeint, das auch "ähnliche" Worte wie der eigentliche
suchbegriff gefunden werden oder hab ich das falsch verstanden.
Das wäre natürlich nützlich, wenn die suchfunktion Flexibel ist, nur zeichen wie % oder _ hätten für
mein Projekt keine relevanz in den suchergebnissen.
Wobei ich in der Richtung noch viel vor mir hab, muss mich auch noch mit Joins
auseinandersetzen, so wie ich an anderer stelle erfahren hab.
Dann mach ich mich mal wieder an die arbeit.
Grüße aus H im R,
Engin