poison: Daten bei mysql_connect verschlüsseln

Beitrag lesen

Hi,

"Hallo <b>{$_POST['username']}</b>,...

Aber nun zu htmlspecialchars: Wenn du den Text nicht ausgeben willst, brauchst du ihn nicht zu erstellen. Da er aber da ist, soll er doch wohl auch ausgegeben werden. Zwar nicht gleich, aber im A-Teil (von EVA). Und weil du den Text an dieser Stelle schon zusammenbaust, musst du auch jetzt schon den Kontext beachten, also

"Hallo <b>" . htmlspecialchars($_POST['username']) . "</b>,...

notieren

OK, jetzt, wo ich dein Beispiel sehe, habe ich es glaube ich endlich begriffen. Ich muss das Wort "htmlspecialchars" verwenden und in die runden Klammern den Wert einfügen, den ich damit in Verbindung bringen möchte. "htmlspecialchars ()" hat nichts mit dem Kontextwechsel zu tun, das hab ich nämlich durcheinander gebracht. Bin schon voll Panne!

Wenn ich dich richtig verstanden habe, verwende ich "htmlspecialchars ()" nur bei der Besonderheit, wenn ich eine Variable im Text ausgebe. Oder gibt es noch andere Verwendungsmöglichkeiten/-vorgaben?

ABER:
Müsste ich nicht alle Zeichen, die was mit HTML zu tun haben in meinem PHP Script mit htmlspecialchars() bearbeiten? Also:

"Hallo &lt;b&gt;{".$_POST['username']."}&lt;/b&gt;,...

... &lt;a href="anmelden.php"&gt;Anmelden&lt;/a&gt;";


> > Oder ist das falsch gedacht?  
>   
> Ja, falsch gedacht. Du willst ja HTML-Code an den Browser senden, also müssen die <> schon so bleiben, wie sie sind. Als &lt;&gt; notiert würde der Browser die Zeichen <> hinschreiben, anstatt sie als Tag-Begrenzer zu interpretieren.  
  
Nachdem du es mir in anderen Worten nochmal erklärt hast, habe ich es (hoffentlich) begriffen.  
  
  

> > Nachdem ich // mysql\_close($verbindung); // aus dem Script entfernt habe, kommt auch keine Warnung mehr. Ich dachte, bei PHP muss alles korrekt sein? Warum wird ein (indirekter) Fehler angezeigt, wenn man es korrekt machen möchte? (am Kopf kratz!!)  
>   
> Du hast irgendwo einen Fehler drin. Wenn $verbindung wirklich eine Ressourcenkennung beinhaltet, wie sie von mysql\_connect() erzeugt worden ist, darf es keinen Fehler geben. Wenn aber aus irgendeinem Grunde was anderes (oder nichts/null) enthält, dann gibt es die Warnung.  
  
Ich habe den Befehl zum Schließen der Datenbank nun direkt nach dem Schreiben in die Datenbank gesetzt und... die Fehlermeldung taucht nicht mehr auf. Weiter unten kam der Befehl "mysql\_close" wohl einfach zu spät, PHP hatte, wie die es ausgedrückt hast, schon "aufgeräumt".  
  
Wegen der Abfrage zur Mailadresse. Aus Vinzenz Beitrag (Diskussion zu dem Thema) habe ich herausgelesen, dass er keine definitiv sicher Abfrage zur gültigen Mailadresse geben kann. Zumindest nicht so einfach, wie ich es mir vorgestellt habe. Da ich meine Besucher in den Regeln und FAQ zu meiner Seite darauf hinweise, dass sie eine "funktionierende" Mailadresse brauchen, das sie sonst an manchen Spielen, Rätseln oder Abenteuern eventuell nicht teilnehmen können, denke ich, muss jeder User selbst entscheiden, ob er bei der Abfrage im Anmeldeformular Quatsch eingibt oder nicht.  
  
Muss ich dann hierzu noch was beachten, damit mir nicht jemand mit der Eingabe von einer seltsamen Mailadresse, einen Code unterjubeln kann oder ist das Thema mit "mysql\_real\_escape\_string" schon erledigt?  
  
Ich schreibe mir gerade ein Word Dokument zusammen, indem ich alles, was ich beim Schreiben eines Scripts beachten sollte (Kontextwechsel, htmlspecialchars(), Vergleiche usw.) aufführe, damit ich einen roten Faden habe, an dem ich mich entlang hangeln kann (und hoffentlich nicht wieder was wichtiges vergesse!!).  
  
Trotzdem wäre ich dankbar, ihr würdet über das Login-Script nochmal drübergucken:  
  
~~~php
  
<?php  
error_reporting(E_ALL);  
  
if(empty($_POST["passwort"]) or empty($_POST["passwort2"]) or empty($_POST["username"]) or empty($_POST["email"]))  
{  
$error = "Du hast leider nicht alle Felder ausgefüllt.  
<br>  
<br><a href=\"eintragen.html\">Zurück</a>";  
}  
else  
{  
// Alle Felder ausgefüllt, weitere Verarbeitung  
// Daten für die Ausgabe werden samt HTML-Schnipseln in $output geschrieben.  
  
  
/*Alternative  
  
if(empty($_POST["passwort"])  
{  
echo "Du hast kein Passwort angegeben. <a href=\"eintragen.html\">Zurück</a>";  
}  
  
else if(empty($_POST["passwort2"])  
{  
echo "Du hast vergessen Dein Passwort erneut einzugeben. <a href=\"eintragen.html\">Zurück</a>";  
}  
  
else if(empty($_POST["username"])  
{  
echo "Du hast keinen Benutzernamen angegeben. <a href=\"eintragen.html\">Zurück</a>";  
}  
  
else if(empty($_POST["email"])  
{  
echo "Du hast keine E-Mail-Adresse angegeben. <a href=\"eintragen.html\">Zurück</a>";  
}  
else  
{  
  
Alternative Ende*/  
  
  
  
if($_POST["passwort"] != $_POST["passwort2"])  
{  
$error = "Deine Passwörter sind leider nicht identisch. <a href=\"eintragen.html\">Zurück</a>";  
}  
else  
{  
  
  
$verbindung = mysql_connect("localhost", "Vesta" , "vesta");  
  
if(!$verbindung)  
{  
$error = "Leider ist ein Fehler bei der Registrierung aufgetreten. Bitte sende mir zur Registrierung  
eine E-Mail: <a href=\"mailto:mail@potionmaster.de\">mail@potionmaster.de</a>";  
}  
else  
{  
  
  
mysql_select_db("homepage");  
  
  
if(!mysql_select_db("homepage"))  
{  
$error = "Leider ist ein Fehler bei der Registrierung aufgetreten. Bitte sende mir zur Registrierung  
eine E-Mail: <a href=\"mailto:mail@potionmaster.de\">mail@potionmaster.de</a>";  
}  
else  
{  
  
  
$passwort = md5($_POST["passwort"]);  
  
$result = mysql_query("SELECT id FROM login WHERE username= '" . mysql_real_escape_string($_POST["username"]) . "'");  
$menge = mysql_num_rows($result);  
  
if($menge == 0)  
{  
$eintrag = "INSERT INTO login (username, passwort, email) VALUES ('" . mysql_real_escape_string($_POST["username"]) . "', '" . mysql_real_escape_string($passwort) . "', '" . mysql_real_escape_string($_POST["email"]) . "')";  
$eintragen = mysql_query($eintrag);  
}  
else  
{  
$error = "Der Benutzername ist schon vergeben. Du musst einen anderen wählen.  
echo  <a href=\"registrieren1.php\">Zurück</a>";  
}  
  
if(!$eintragen)  
{  
$error = "Deine Registrierung ist leider fehlgeschlagen. Sollte Deine Registrierung nochmals fehlschlagen,  
sende mir bitte eine E-Mail: <a href=\"mailto:mail@potionmaster.de\">mail@potionmaster.de</a>  
<a href=\"eintragen.html\">Zurück</a>";  
}  
else  
{  
mysql_close($verbindung);  
}  
//schließen der noch offenen "else" Anweisungen  
}  
}  
}  
}  
  
if (!empty($error))  
{  
echo '<div class="error"><p>'.$error.'</p></div>';  
}  
else  
{  
echo "Hallo <b>".htmlspecialchars($_POST['username'])."</b>, Du hast Dich erfolgreich registriert. <a href=\"anmelden.php\">Anmelden</a>";  
}  
?>  

So.
Fehlt noch irgendwas? Habe ich vielleicht doch noch was vergessen?
Bin trotz der ganzen Verwirrung, dankbar über weitere Anregungen/Tipps.

@dedlfix
Ich habe mir dein Beispiel angesehen und auch den Artikel gelesen. Leider muss ich gestehen, es wird immer verwirrender für mich.
Aber ich würde das Beispiel auf diese Weise verändern:

alert('foo "bar" baz');
<span onclick="alert ('foo "bar" baz');">foo</span>
echo ".<span onclick="alert('foo "bar" baz');">foo</span>.";

Wäre das so richtig? Ich habe es bei mir auf dem Rechner getestet. Fehlermeldungen kamen keine. Aber ist das korrekt, dass folgendes ausgegeben wird:

alert('foo "bar" baz'); foo echo ".foo."

Oder müsste etwas anderes ausgegeben werden und ich habe wieder falsch verstanden, was ich mit dem Beispiel tun sollte?

Liebe Grüße
Poison