Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

Datenbankabfrage ob username existiert

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
WA24
PostRank 2
PostRank 2
Beiträge: 33
Registriert: 27.01.2008, 13:47

Beitrag von WA24 » 06.11.2009, 01:09

Hallo,

häng grad an einem für manche simplen Problem.

Den Usernamen www.domain.de/datei.php?u=walter hole ich mir aus der URL mit:

Code: Alles auswählen

$username = htmlspecialchars($_GET["u"]);
Wie kann ich in der Datenbank-Tabelle "smf_members" prüfen, ob es sich um einen angemeldeten User handelt?
Wenn ja, weiter im Script, wenn nein Script beenden.

Versuch bis jetzt bei www.domain.de/datei.php?u=walter

Code: Alles auswählen

$username = htmlspecialchars($_GET["u"]);
$query = mysql_query("SELECT memberName FROM smf_members WHERE memberName = ".$username) or die (mysql_error());
if(mysql_num_rows($query) > 0) { 
  echo "Benutzer nicht vorhanden"; 
}  
mysql_free_result($query);
gibt
Unknown column 'walter' in 'where clause'
zurück

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


TheRob
PostRank 5
PostRank 5
Beiträge: 274
Registriert: 10.06.2008, 11:44
Wohnort: Wetzikon

Beitrag von TheRob » 06.11.2009, 08:05

Da fehlen die ''
Ist ja ein String den du vergleichen willst.

mysql_query("SELECT memberName FROM smf_members WHERE memberName = '".$username."'")

Anonymous

Beitrag von Anonymous » 06.11.2009, 13:22

und dahinter immer noch nen LIMIT 1, also

mysql_query("SELECT memberName FROM smf_members WHERE memberName = '".$username."' LIMIT 1")

so kann die db aufhören zu suchen sobald sie ihn 1 mal gefunden hat...

WA24
PostRank 2
PostRank 2
Beiträge: 33
Registriert: 27.01.2008, 13:47

Beitrag von WA24 » 06.11.2009, 21:25

sehr geil. Vielen Dank. Das > war auch nicht korrekt.
So sieht das jetzt aus und funktioniert:

Code: Alles auswählen

$username = htmlspecialchars($_GET["u"]);
$query = mysql_query("SELECT memberName FROM smf_members WHERE memberName = '".$username."' LIMIT 1") or die (mysql_error());
if(mysql_num_rows($query) == 0) { 
  exit; 
}  
mysql_free_result($query);

Anonymous

Beitrag von Anonymous » 06.11.2009, 21:38

noch nen Hinweis... ich weis je nu nicht wie deine DB ausschaut, aber das Feld memberName sollte ein Index haben, so wie jedes Feld das in einer where Klausel verwendet wird.... ansonsten könnte es bei größeren Datenbanken zu erheblichen verzögerungen kommen und auch der DB Server unnötig belastet werden...

WA24
PostRank 2
PostRank 2
Beiträge: 33
Registriert: 27.01.2008, 13:47

Beitrag von WA24 » 06.11.2009, 21:47

wie was wo index? meinst Du das?
https://de.wikipedia.org/wiki/Datenbankindex

hab ich im Galerie und Forum Script noch nirgends gesehen,
obwohl da viele Datenbankabfragen passieren. :-?

Anonymous

Beitrag von Anonymous » 06.11.2009, 22:25

wird bei der Erstellung der Tabellen normalerweise mitdefiniert... schau mal in die CREATE TABLE Anweisungen...

WA24
PostRank 2
PostRank 2
Beiträge: 33
Registriert: 27.01.2008, 13:47

Beitrag von WA24 » 06.11.2009, 22:51

Ein Index wurde in memberName erzeugt (die Abfrage dauerte 0.0600 sek.)

ALTER TABLE `smf_members` ADD INDEX ( `memberName` )

unten gibts ne Tabelle Indizes: mit
Name Typ Kardinalität Aktion Feld :-?

Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 06.11.2009, 22:58

WA24 hat geschrieben:$username = htmlspecialchars($_GET["u"]);
$query = mysql_query("SELECT memberName FROM smf_members WHERE memberName = '".$username."' LIMIT 1")
Ich weiß nicht, warum du da htmlspecialchars() einsetzt, aber falls das eine Sicherung für die SQL-Abfrage sein soll, hilft sie rein gar nichts. Ich brauche nur als Namen ' or ''=' angeben und kann die Abfrage überspringen, weil aus dem where-Teil dann nämlich das wird:

WHERE memberName = '' or ''=''

''='' ist offensichtlich immer wahr, womit wegen der Oder-Verknüpfung auch die gesamte where-Klausel immer zutrifft.
Ich weiß nicht, wie kritisch das in diesem Fall ist, aber deutlich sollte das Problem im Beispiel delete from member where name=$name werden: delete from member where name='' or ''='' - das löscht dir die ganze Tabelle.

Daten, die von draußen kommen, egal ob direkt oder indirekt, daher immer mit mysql_real_escape_string() entschärfen:

$query = mysql_query("SELECT memberName FROM smf_members WHERE memberName = '" . mysql_real_escape_string($GET_["u"]) . "' LIMIT 1")

htmlspecialchars() ist natürlich zwingend notwendig, um dem gleichen Sicherheitsproblem im Bereich HTML zu entgehen, aber ob man das unbedingt bereits in der Datenbank machen muss, anstatt dort, wo HTML angewendet wird, nämlich bei der Ausgabe, lasse ich mal dahingestellt.

Die Anweisung die(mysql_error()); ist davon unabhängig auch nicht unbedingt schlau, denn interne Begebenheiten, dazu gehören auch detailierte Fehlermeldungen, gehen den Besucher nichts an. Und außerdem sind sie auf diese Art sofort futsch; wenn was schief geht, bemerkst du das nicht einmal, es sei denn, du hast die Seite selbst aufgerufen. Solche Sachen gehören ins Fehlerprotokoll:

Code: Alles auswählen

if (! blabla) {
    error_log(mysql_error());
    die("Interner Fehler");
}

WA24
PostRank 2
PostRank 2
Beiträge: 33
Registriert: 27.01.2008, 13:47

Beitrag von WA24 » 06.11.2009, 23:34

vielen Dank. $GET_["u"]) hat erst nicht funktioniert bis ich $_GET["u"]) drauss
gemacht habe. Und so ist das jetzt sicher?
(soll übrigens ein Server Banner werden, den ich mir nach und nach zusammenbaue)

Code: Alles auswählen

$username = htmlspecialchars($_GET["u"]);
$query = mysql_query("SELECT memberName FROM smf_members WHERE memberName = '".mysql_real_escape_string($_GET["u"])."' LIMIT 1");
if(mysql_num_rows($query) == 0) { 
  exit; 
}  
mysql_free_result($query);

$zeit = date("H:i:s", time()); 
$datum = date("d.m.Y", time()); 
$ip = $_SERVER["REMOTE_ADDR"]; 

$pic = imagecreatefromgif("http://www.domain.com/banner/banner.gif"); 
$weiss = ImageColorAllocate($pic, 255, 255, 255); 
$schwarz = ImageColorAllocate ($pic, 0, 0, 0); 

ImageString($pic, 4, 1, 1, "Uhrzeit: ".$zeit, $schwarz); 
ImageString($pic, 4, 1, 15, "Datum: ".$datum, $schwarz); 
Imagestring($pic, 4, 1, 30, "Deine IP: ".$ip, $schwarz); 
Imagestring($pic, 4, 200, 1, "Username:".$username, $schwarz); 
ImagePNG($pic); 
ImageDestroy($pic) 
sollte ich dann unten im Imagestring das $username beibehalten oder
auch gleich auf mysql_real_escape_string zurückgreifen?

Anonymous

Beitrag von Anonymous » 07.11.2009, 00:02

WA24 hat geschrieben:sollte ich dann unten im Imagestring das $username beibehalten oder
auch gleich auf mysql_real_escape_string zurückgreifen?
die Frage kannst du dir selber beantworten wenn du die Funktion mysql_real_escape_string() im PHP Manual nachliest... :wink:

WA24
PostRank 2
PostRank 2
Beiträge: 33
Registriert: 27.01.2008, 13:47

Beitrag von WA24 » 07.11.2009, 00:08

glaub das war so im nachhinein ne blöde frage oder? :D

Natürlich nur bei SQL Anweisungen... :crazyeyes:

Mork vom Ork
PostRank 9
PostRank 9
Beiträge: 2557
Registriert: 08.07.2008, 11:07
Wohnort: Aufm Friedhof.

Beitrag von Mork vom Ork » 07.11.2009, 11:11

WA24 hat geschrieben:

Code: Alles auswählen

$username = htmlspecialchars($_GET["u"]);
[..]
Imagestring($pic, 4, 200, 1, "Username:".$username, $schwarz); 
Das ist sicher nicht das, was du möchtest. Falls du mal jemanden hast, der sich „Willi & Co.“ nennt, erscheint in deinem Bild der Text „Username:Willi & Co.“.
htmlspecialchars() ist in deinem Code nicht notwendig, du gibst nichts nach HTML aus und musst somit auch nichts für HTML maskieren.

Code: Alles auswählen

$query = mysql_query("SELECT memberName FROM smf_members WHERE memberName = '".mysql_real_escape_string($_GET["u"])."' LIMIT 1");
if(mysql_num_rows($query) == 0) { 
  exit; 
}
Da fehlt jetzt die Fehlerprüfung. Mach es zumindest so:

Code: Alles auswählen

$query = mysql_query("SELECT memberName FROM smf_members WHERE memberName = '".mysql_real_escape_string($_GET["u"])."' LIMIT 1");
if ((!$query) or (mysql_num_rows($query) == 0)) { 
  exit; 
}

Code: Alles auswählen

$pic = imagecreatefromgif("http://www.domain.com/banner/banner.gif"); 
Benutzt du eine URL, ruft PHP die Daten über das vorgesehene Protokoll ab. In diesem Fall stellt PHP bzw. dein Webserver also eine HTTP-Verbindung zu www.domain.com her, um die Grafik zu laden. Liegt die Grafik auf deinem Server, lade sie direkt mit imagecreatefromgif("banner.gif"), das ist für den Server zigmal leichter.

WA24
PostRank 2
PostRank 2
Beiträge: 33
Registriert: 27.01.2008, 13:47

Beitrag von WA24 » 09.11.2009, 09:31

bis jetzt hab ich

Code: Alles auswählen

$username = htmlspecialchars(strtoupper($_GET["u"]));
verwendet um den Usernamen in Grossbuchstaben zu bekommen.

einfach

Code: Alles auswählen

$username = strtoupper($_GET["u"]);
funktioniert auch. Is das richtig?

Graccem
PostRank 4
PostRank 4
Beiträge: 115
Registriert: 16.12.2004, 12:57
Wohnort: Berlin

Beitrag von Graccem » 09.11.2009, 12:51

Mork vom Ork hat geschrieben:
WA24 hat geschrieben:
Daten, die von draußen kommen, egal ob direkt oder indirekt, daher immer mit mysql_real_escape_string() entschärfen:

$query = mysql_query("SELECT memberName FROM smf_members WHERE memberName = '" . mysql_real_escape_string($GET_["u"]) . "' LIMIT 1")
Soweit richtig, aber dein Code produziert Grütze, wenn Magic Quotes an ist. Durch Magic Quotes kommen nämlich schon Escape-Sequenzen in die Variable. Daher muss man, wenn man Magic Quotes nicht deaktivieren kann, noch stripslashes anwenden.
SELECT foo FROM bar WHERE foobar='o\\\'reilly' <-- ohne stripslashes
SELECT foo FROM bar WHERE foobar='o\'reilly' <-- mit stripslashes
Im ersten Fall sucht er konktret nach o\'reilly, im zweiten Fall nach o'reilly. Aber der zweite Fall ist der, den man haben will, ausser die Daten sind ohnehin schon korrupt.

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag