PHP Problem mit Session!
Daniel Haider
- php
2 suit0 dedlfix0 tinita
Tag,
und zwar hab ich folgendes Problem:
Ich möchte ein Ausgabentaschenbuch als Schulprojekt machen.
Ich hab das Login, das register, die mainpage .. blablabla.
Nun möchte ich eine Neue Ausgabe in die Datenbank eintragen.
Hierfür möchte ich den Benutzer in die gleiche Table eintragen wie den Betrag, um die Ausgaben später leichter wieder abrufen zu können mittels mysql_row usw..
Hier der Code:
<?php
session_start();
if(isset($_SESSION['username'])) {
$submit = $_POST['submit'];
$betrag = $_POST['betrag'];
$zweck = $_POST['zweck'];
$assocuser = $_SESSION['username'];
if($submit) {
if($betrag&&$zweck){
mysql_connect("dbserver","user","")or die("Datenbankserver offline oder nicht erreichbar!");
mysql_select_db("site")or die("Datenbankserver offline oder nicht erreichbar!");
mysql_query("INSERT INTO users(id, betrag, zweck, assocuser) VALUES ('','$betrag','$zweck','$assocuser')");
echo "Erfolg";
}
}
} else {
echo "Sie müssen eingeloggt sein um diese Funktion zu nutzen! Sie werden in 5 Sekunden zur Hauptseite umgeleitet!";
header("Refresh:5, URL=index.php");
}
?>
<html>
<h1>Neuer Eintrag:</h1>
<form name="newentryform" method="POST">
<table>
<tr>
<td>Zweck</td>
<td>Betrag</td>
</tr>
<tr>
<td><input type="text" maxlength="25" name="zweck"></td>
<td><input type="text" maxlenght="10" name="betrag"></td>
</tr>
</table><br>
<input type="submit" value="Eintragen" name="submit">
</form>
</html>
Wie kann ich den Username über $_SESSION['username'] wieder auslesen um ihn dann in die DB eintragen zu kömnen?
Tut mir leid falls ich etwas verwirrend schreibe. Ich bitte um rasche Hilfe :)
MFG Daniel
Wie kann ich den Username über $_SESSION['username'] wieder auslesen um ihn dann in die DB eintragen zu kömnen?
$_SESSION['username'];
Ich verstehe dein Frage nicht - dein Code selbst weist aber eine signfikante Sicherheitslücke auf:
Stichwort: SQL-Injection
http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel
``Naja, wie kann ich des $_SESSION['username'] in des INSERT INTO integrieren? ;)
Wnn ich $_SESSION['username'] schreib geht nix! :/
``Naja, wie kann ich des $_SESSION['username'] in des INSERT INTO integrieren? ;)
Wnn ich $_SESSION['username'] schreib geht nix! :/
Dann steht in $_SESSION['username'] nix drin - das kannst du ja mit einer debug-Ausgabe wie var_dump() verifizieren.
Na kla steht was drinnen. wenn ich eingebe echo $_SESSION['username'] ;
Dann zeigts mir ja "testuser" an!
Na kla steht was drinnen. wenn ich eingebe echo $_SESSION['username'] ;
Dann zeigts mir ja "testuser" an!
Du machst vier Fehler in einer einzigen Zeile:
mysql_query("INSERT INTO users(id, betrag, zweck, assocuser) VALUES ('','$betrag','$zweck','$assocuser')");
1. Du sicherst die Daten nicht ab. Benutze mysql_escape_string() oder wundere dich nicht, wenn irgendwann irgendwer deine kompletten Daten löscht. Und so scheissegal es dir ist, so beschissen ist dann auch dein Code.
2. Unterlasse es besser, Variablen in Zeichenketten einzubetten. Das ist grundsätzlich unklug und in obigem Falle komplett unnötig, denn da hast nicht einmal eine Zeichenkette, du hast lediglich die Variablen in Anführungszeichen gesetzt. Was soll das? Warum schreibst du statt eines einfachen $variable lieber '$variable'?
3. Wenn es dir ein so übermäßiges Bedürfnis ist, Variablen in Zeichenketten einzubetten, dann benutze die Zeichenkettennotation, in der das auch möglich ist. Es funktioniert nur mit doppelten Anführungszeichen, nicht mit einfachen.
Würdest du 2. beherzigen und Variablen sauber von anderen Daten (hier: Zeichenketten) trennen, wärest du über dieses Problem gar nicht erst gestolpert.
4. Du verwendest PHP.
Tach!
mysql_query("INSERT INTO users(id, betrag, zweck, assocuser) VALUES ('','$betrag','$zweck','$assocuser')");
- Unterlasse es besser, Variablen in Zeichenketten einzubetten. Das ist grundsätzlich unklug und in obigem Falle komplett unnötig, denn da hast nicht einmal eine Zeichenkette, du hast lediglich die Variablen in Anführungszeichen gesetzt. Was soll das? Warum schreibst du statt eines einfachen $variable lieber '$variable'?
Die '' zählen hier anders also du anscheinend gerade denkst, weil das Ganze ein SQL-Statement in einem ""-String ist. Die '' werden als Stringbegrenzer im SQL-Statement benötigt. (Jedenfalls solange man nicht Prepared Statements nimmt.)
Der Rest deiner Auführungen sind nun teilweise Folgefehler.
dedlfix.
Vor allem Punkt 4 ist brilliant, sowohl in der Beschreibung des Fehlers als auch in einer Lösungsmöglichkeit.
Tach!
Wnn ich $_SESSION['username'] schreib geht nix! :/
Es kommt darauf an, ob du es mit String-Verknüpfung notierst oder im ""-String eingebettet. Da gibt es Unterschiede, die das PHP-Handbuch im String-Kapitel (oder war es Arrays?) anführt.
dedlfix.
Tach!
if(isset($_SESSION['username'])) {
$assocuser = $_SESSION['username'];
Wie kann ich den Username über $_SESSION['username'] wieder auslesen um ihn dann in die DB eintragen zu kömnen?
Du greifst doch bereits zweimal lesend darauf zu, das zweite Mal in einer unnötigen Umkopieraktion.
Um die von suit angesprochene SQL-Injection zu verhindern, und gleichzeitig die als deprecated markierten mysql-Funktionen zu vermeiden, schau dir mal PDO und dessen Prepared Statements an.
dedlfix.
Danke erstmal für die schnelle Hilfe! :)
bezüglich der sql injection: des is mir doch scheißegal . das ist ein schulprojekt und kein bewerbungsprojekt für facebook. trotzdem danke für den hinweis :) ich werd aber alsrstes mal zusehn dass des läuft. dann kümmer ich mich
um die sicherheit :)
bezüglich der sql injection: des is mir doch scheißegal . das ist ein schulprojekt und kein bewerbungsprojekt für facebook.
Na hoffentlich kassierst du für diese Einstellung einen Fetzen - das ist eine absolut nicht vertretbare Einstellung.
trotzdem danke für den hinweis :) ich werd aber alsrstes mal zusehn dass des läuft. dann kümmer ich mich um die sicherheit :)
Bei Kontextwechseln geht es nicht nur um Sicherheit sondern um fehlerfreie Funktion ("es läuft") - in deinem Beispiel braucht nur ein Schweizer kommen und als Betrag 1500 Franken eingeben, in der ihm gebräuchlichen Schreibweise 1'500.00 - und schon fliegt dir der Kram um die Ohren.
Tut mir leid für meine unförmliche ausdrucksweise . eigentlich wollte ich damit sagen dass mir nicht bekannt ist wie dies funktioniert. bitte um einen link :)
Tut mir leid für meine unförmliche ausdrucksweise . eigentlich wollte ich damit sagen dass mir nicht bekannt ist wie dies funktioniert. bitte um einen link :)
Den hab' ich dir bereits in meinem ersten Posting gegeben.
Tach!
Tut mir leid für meine unförmliche ausdrucksweise . eigentlich wollte ich damit sagen dass mir nicht bekannt ist wie dies funktioniert. bitte um einen link :)
Du kannst zwar im PHP-Handbuch nachlesen, wie man Array-Zugriffe in ""-Strings einbettet. Aber das brauchst du an der Stelle nicht anzuwenden, weil du entweder durch die Anwendung der SQL-Escape-Funktion sowieso String-Verknüpfung statt -Einbettung benötigst oder du Prepared Statements verwendest und dort auch die Werte direkt und nicht im String übergibst. Für Prepared Statements musst du allerdings generell die alte mysql-Extension aufgeben und mysqli oder das anwenderfreundlichere PDO verwenden.
dedlfix.
@@Daniel Haider:
nuqneH
bezüglich der sql injection: des is mir doch scheißegal . das ist ein schulprojekt
Und ein Schulprojekt dient nicht dazu zu lernen, wie man’s richtig macht?
Wenn du grundlegende Dinge nicht lernen willst: Sechs, setzen.
ich werd aber alsrstes mal zusehn dass des läuft. dann kümmer ich mich
um die sicherheit :)
Falsch. „Dass des läuft“ *beinhaltet* Sicherheit. Sicherheit ist kein zusätzliches Feature, das später nachgereicht werden könnte.
Qapla'
$submit = $_POST['submit'];
$betrag = $_POST['betrag'];
$zweck = $_POST['zweck'];
...
mysql_query("INSERT INTO users(id, betrag, zweck, assocuser) VALUES ('','$betrag','$zweck','$assocuser')");
bitte unbedingt lesen:
[http://bobby-tables.com/](http://bobby-tables.com/)