MYSQL Spalteninhalt in Variable übertragen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
aktivieren
aktiviert code
befehl
code
dank
datenbank
fehler
folgendem code
formular
genannten zeile
inhalt
injektion
meldung
parameter
software
status
string
url
verbindung
-
Ich möchte den Inhalt der Spalte "activation" aus der Tabelle "account" von einem bestimmten User auslesen und den Inhalt dieser Spalte an eine Variable (php) übergeben um diese dann zu vergleichen ob der Inhalt gleich "active" ist.
Mein Code sieht momentan so aus:
$status = "SELECT activation FROM account WHERE name = '".$_GET["name"]."'# AND akey = '".$_GET["akey"]."' "; if($status == 'active') { echo 'Ihr Account ist bereits aktiviert.'; }
Doch aus irgendeinem Grund bleibt die Seite beim Aufruf einfach komplett weiß.
Das ganze soll eine Accountaktivierung via EMail sein.
Ohne diese Abfrage funktioniert der restliche Code um den Account von "waiting" auf "active" zu stellen.
Aber es soll nun eben diese Meldung bringen fals der Account bereits aktiviert ist, doch nun tut sich einfach garnichts mehr.
Kann mir da jemand weiterhelfen?
Danke schonmal im voraus. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hier fehlt das:
$status = mysql_result(mysql_query($status), 0);
Es sollte also das stehen:$sql = "SELECT activation FROM account WHERE name = '".mysql_real_escape_string($_GET["name"])."' AND akey = '".mysql_real_escape_string($_GET["akey"])."' "; $status = mysql_result(mysql_query($sql), 0); if($status == 'active') echo 'Ihr Account ist bereits aktiviert.';
Beitrag zuletzt geändert: 12.4.2012 16:01:57 von hackyourlife -
Das kann so überhaupt nicht funktionieren. Falls du ein wenig Ahnung von PHP hast müsstest du wissen das du den SQL-Befehl noch ausführen musst (dies wird nicht automatisch erledigt). Mit folgendem Code sollte es aber gehen:
<?php $sql = "SELECT activation FROM account WHERE name = '".$_GET["name"]."' AND akey = '".$_GET["akey"]."' "; //Verbindung zum Datenbank-Server herstellen. $link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); //pruefen ob eine Verbindung hergestellt werden konnte. if (!$link) { die('Keine Verbindung möglich: ' . mysql_error()); } //Auswaehlen der Datenbank und pruefen ob diese ausgewaehlt werden konnte. if (!mysql_select_db('database_name')) { die('Konnte Schema nicht selektieren: ' . mysql_error()); } //SQL-befehl ausfuehren. $result = mysql_query($sql); //Pruefen ob der Befehl ausgefuehrt werden konnte. if (!$result) { die('Konnte Abfrage nicht ausführen:' . mysql_error()); } //Status aus der Ergebnismenge ermitteln. $status = mysql_result($result, 0); //Pruefen ob der Status aktiv ist. if($status == 'active') { echo 'Ihr Account ist bereits aktiviert.'; } ?>
Die Datenbankeinstellungen musst du natürlich noch anpassen sowie auch den Namen der Datenbank.
Gruß S.Brosch -
Das mit dem Datenzugriff ist alles erledigt, ich habs nur noch für nötig gehalten dass da mit reinzuschreiben, dachte das erklärt sich eig von alleine dass es da dabei war :D Schließlich funktioniert der restliche Code ja, erst seit die Abfrage drin ist ob activation bereits auf active steht bleibt die seite weiß.
Habe den Lösungsansatz von [hackyourlife] verwendet, jedoch bleibt die Seite nach wie vor weiß.
Hier nochmal der komplette Coder der activation.php.
Der Datenbankzugriff geschieht über die common.php.
<?php require_once "common.php"; $check = "SELECT uid FROM account WHERE name = '".$_GET["name"]."' AND akey = '".$_GET["akey"]."' "; $qry = mysql_query($check) or die ("FEHLER: User nicht vorhanden. ".mysql_error()); $sql = "SELECT activation FROM account WHERE name = '".mysql_real_escape_string($_GET["name"])."' AND akey = '".mysql_real_escape_string($_GET["akey"])."' "; $status = mysql_result(mysql_query($sql), 0); if($status == 'active') { echo 'Ihr Account ist bereits aktiviert.'; } else { $result = mysql_query("UPDATE account SET activation = 'active' WHERE name = '".$_GET["name"]."' AND akey = '".$_GET["akey"]."' "); if($result) { echo 'Ihr Account ist nun aktiviert.<br> Wir wünschen Ihnen viel Vergnügen bei Burning Wheels'. } else { echo 'Es ist ein Fehler aufgetreten beim Aktivieren Ihres Accounts.<br> Bitte wenden Sie sich an einen Administrator.'; } } footer(); ?>
-
burningwheels schrieb:
Dann könnte es helfen Fehlermeldungen zu aktivieren.
Habe den Lösungsansatz von [hackyourlife] verwendet, jedoch bleibt die Seite nach wie vor weiß.
Beitrag zuletzt geändert: 12.4.2012 16:09:08 von hackyourlife -
Hast du die Fehlerausgabe aktviert?
<?php error_reporting(E_ALL); ?>
Falls nicht was gibt diese aus?
Es sollte laut dem Code immer etwas ausgegeben werden egal ob ein Fehler auftritt oder nicht. Ansonsten wenn mit der oben genannten Zeile kein Fehler ausgegeben wird, füge doch einfach ein die("HALLO"); vin oben nach unten ein und prüfe ab wann diese Meldung nicht mehr kommt. So mach ich es wenn ich komische Fehler habe (Debbuging für Arme ).
Gruß S.Brosch -
software-brosch schrieb:
Hier wird sicher ein Fehler/Warning ausgegeben, da sonst das Script nicht abbrechen würde (was ja der Fall ist).
Ansonsten wenn mit der oben genannten Zeile kein Fehler ausgegeben wird, füge doch einfach ein die("HALLO"); vin oben nach unten ein und prüfe ab wann diese Meldung nicht mehr kommt. So mach ich es wenn ich komische Fehler habe (Debbuging für Arme ). -
Alles klar habs gefunden. Fehler wurde angezeigt in folgendem Code:
if($result) { echo 'Ihr Account ist nun aktiviert.<br> Wir wünschen Ihnen viel Vergnügen bei Burning Wheels'. }
Man siehe der Punkt hinter dem ' ...
Typischer ; Fehler ^^
Vielen dank für die Hilfe und danke für die Tipps wegen der SQL Injektion.
Die Fehlerausgabe zu aktivieren sollte ich mir für später merken :D
Beitrag zuletzt geändert: 12.4.2012 16:35:40 von burningwheels -
burningwheels schrieb:
Typischer Anfängerfehler...
Typischer ; Fehler ^^
burningwheels schrieb:
Die Funktion
Vielen dank für die Hilfe und danke für die Tipps wegen der SQL Injektion.
musst du allerdings überall einsetzen wo dumysql_real_escape_string()
oder$_GET
für eine SQL-Abfrage verwendest. Erst wenn das überall gefiltert wird ist deine Seite sicher.$_POST
-
hackyourlife schrieb:
Die Funktion
musst du allerdings überall einsetzen wo dumysql_real_escape_string()
oder$_GET
für eine SQL-Abfrage verwendest. Erst wenn das überall gefiltert wird ist deine Seite sicher.$_POST
Du kannst dir auch eine Datenbankklasse schreiben und dabei immer den gesamten SQL-Befehl mit
maskieren. So sparst du dir jedesmal diese langen SQL-Abfragen.mysql_real_escape_string()
Gruß S.Brosch -
Glaub das is bei mir in der aktivierungs php nicht wirklich von nöten, da ich die Variablen via URL übergebe ... Dient wie gesagt zur aktivierung des accounts nach der registration via email über nen link der dann so aussieht: www.burningwheels.lima-city.de/activation.php?name=username&akey=123456789
oder kann man eine SQL Injektion auch über die URL ausüben? -
Natürlich! Den die Parameter welche du hinter dem ? übergibst sind die globale Parameter in der Variablen
. Es kann also jemand die Werte der Parameter hinter der URL ändern und so eine SQL-Injection vornehmen. Von daher ist eine Überprüfung dieser Werte eigentlich zwingend notwendig wenn man einigermaßen sicher programmieren möchte.$_GET
Der Parameter akey in der URL ist in PHP die superglobale Variable
.$_GET['akey']
Gruß S.Brosch -
Ah okay alles klar. Wusste zwar dass man über Formulare und ähnliches eine SQL Injektion vornehmen kann, habe jedoch nicht gesagt dass das auch über die URL funktioniert. Naja bin eben noch relativ neu in Sachen PHP. Hab das leider in meiner schulischen Ausbildung als technischer Assistent für Informatik nur grob gelernt.
Gut, da das ganze irgendwann mal ein Browsergame werden soll, muss ich da natürlich auch darauf achten dass alles möglichst sicher ist =) -
burningwheels schrieb:
SQL-Injections lassen sich ausführen, sobald Benutzereingaben (egal ob von
oder kann man eine SQL Injektion auch über die URL ausüben?
oder$_GET
) direkt und ungefiltert in den SQL-String übertragen werden.$_POST
software-brosch schrieb:
Wie darf man sich das vorstellen?
Du kannst dir auch eine Datenbankklasse schreiben und dabei immer den gesamten SQL-Befehl mit
maskieren.mysql_real_escape_string()
Etwa so:
Das wird nicht das Ergebnis bringen das du dir erwartest!$sql = "SELECT * FROM tabelle WHERE xyz = '{$_GET['parameter']}'"; $result = mysql_query(mysql_real_escape_string($sql));
burningwheels schrieb:
Stell dir mal vor du hast bei deinem Formular das Attribut
Wusste zwar dass man über Formulare und ähnliches eine SQL Injektion vornehmen kann, habe jedoch nicht gesagt dass das auch über die URL funktioniert.
.method="get"
Dann werden die Formulardaten in die URL übertragen... -
hackyourlife schrieb:
burningwheels schrieb:
SQL-Injections lassen sich ausführen, sobald Benutzereingaben (egal ob von
oder kann man eine SQL Injektion auch über die URL ausüben?
oder$_GET
) direkt und ungefiltert in den SQL-String übertragen werden.$_POST
D.h. auch wenn es nur ein SQL-String zum auslesen der Informationen ist und keiner um dort etwas zu verändern ist trotzdem ein SQL Injekt möglich? -
Hier ist etwas Lesestoff zum Thema: http://www.unixwiz.net/techtips/sql-injection.html
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage