[PHP & MySQL]Login Script fehler aber wo?!

03/16/2014 23:37 .SenSatioNx3'#1
Hey leute dieser Login Loginscript müsste eig funktionieren bis ich eine neue datenbank erstellt habe... seit dem geht es überhaupt nicht mehr. Registrieren kann man sich aber alles was mit Login zutun hat ist faily...

PHP Code:
<?php
// *** LOGIN ***

require_once('db_config.php');

mysql_connect($host$user$pass);

mysql_select_db($dbase);


$Benutzername mysql_real_escape_string($HTTP_GET_VARS['benutzername']);

$Passwort mysql_real_escape_string($HTTP_GET_VARS['passwort']);

$result mysql_query("SELECT * FROM Users WHERE Benutzername='"$Benutzername ."'");

$row mysql_fetch_row($result);


if (
$row) {

    
$Dbmd5Passwort $row[1];

        if (
md5($Passwort) == $Dbmd5Passwort)
      
        {
            

            echo 
1;
            
        }
        else
       
        {
           

            echo 
2;
            
        }

else

{
   

    echo 
0;
    
}
}

?>
Alles ist mit AutoIt verbunden und Autoit empfängt diese Echos. Im autoit script ist kein fehler sonnst würd er nicht laufen und wo ist das problem jetzt hier?

Danke schon mal :) mfg SSNx3
03/16/2014 23:41 .StarSplash#2
So auf Anhieb ist die Klammersetzung falsch.

Vor dem unteren Else muss noch eine Klammer hin und die letzte Klammer muss weg.
03/16/2014 23:43 MrSm!th#3
#moved
03/17/2014 00:18 s7alker2#4
was kommt für ne fehlermeldung ?
03/17/2014 00:37 .SenSatioNx3'#5
Im AutoIt.exe wird angezeigt: "Benutzername nicht Registriert!"
obwohl ja einer existiert...

EDIT: _______________________
Fail haha....
Das mit der Klammer stimmt jetzt geht wieder alles lol :D aber danke für die hilfe von euch... bekommt jeder thx :)
03/17/2014 14:22 .Marcel'#6
Kleiner Tipp am rande: mysql_* ist veraltet !
03/17/2014 16:14 NotEnoughForYou#7
$HTTP_GET_VARS ist veraltet und sollte nicht mehr verwendet werden. Verwende stattdessen $_GET bzw. $_POST jenach übertragsungsart.

Du kannst dir auch erstmal deinen Benutzernamen ausgeben lassen (anfänge des Debugging sollte eigentlich immer passieren bevor man etwas fragt), damit man weiss, ob überhaupt ein Benutzername am Script ankommt. Wie rufst du das script denn auf? Per Post-Request oder einfach die Url mit entsprechendem GET Parameter?
03/17/2014 21:56 .StarSplash#8
Wenn wir schon bei den Verbesserungsvorschlägen sind: Bei einem Passwort solltest du beim Hashen noch einen Salt einbauen, damit machst du Angriffe mittels Hashtabellen schwieriger oder gar unmöglich.
03/19/2014 01:14 _robox#9
PHP Code:
$result mysql_query("SELECT * FROM Users WHERE Benutzername='"$Benutzername ."'"); 
deine SELECT abfrage ist für dienen Fall nicht geeignet den je nach schreib weise des Benutzername kann es vorkommen das du keine Ergebnis zurück bekommst.

außer dem musst alle post und get vor Verwaltung überprüfen sonst wird kein wert übergeben.

so in etwa wurde ich es machen
PHP Code:
 <?php
// *** LOGIN ***
require_once('db_config.php');

//  erst mal muss  geprüft werden ob dein Formular abgesendet wurde.
if(isset($_GET['submit'])
{
   
// hier brüfen wie ob Benutzername und Passwort abgesendet wurden außer dem wird der Datentype geprüft ob es ein string ist und der wert großer als null ist.
   
if(isset($_GET['benutzername']) && (is_string($_GET['benutzername'])) && strlen($_GET['benutzername']) > 0){
      
$benutzername mysql_real_escape_string(strtoupper($_GET['benutzername']));
   }
   
   if(isset(
$_GET['passwort']) && (is_string($_GET['passwort'])) && strlen($_GET['passwort']) > 0){
     
$passwort mysql_real_escape_string($_GET['passwort']);
   }
   
   if(isset(
$benutzername)  && isset($passwort))
   {
         
mysql_connect($host$user$pass);
         
mysql_select_db($dbase);
         
$result mysql_query('SELECT * FROM Users WHERE UPPER (Benutzername) ='.$benutzername);
         
$row mysql_fetch_row($result);
         if (
$row){
             
$Dbmd5Passwort $row[1];
             if (
md5($Passwort) == $Dbmd5Passwort){
                 echo 
2;
             }
             else{
                 echo 
3;
            } 
            echo 
0;
         }
         else{
            echo 
1;
         }
   }
   
}


?>
03/19/2014 10:03 Mostey#10
Quote:
Originally Posted by _robox View Post
PHP Code:
$result mysql_query("SELECT * FROM Users WHERE Benutzername='"$Benutzername ."'"); 
deine SELECT abfrage ist für dienen Fall nicht geeignet den je nach schreib weise des Benutzername kann es vorkommen das du keine Ergebnis zurück bekommst.
Wieso?

Groß- und Kleinschreibung werden bei Nutzernamen sehr wohl auf nahezu allen Seiten beachtet, daher ist seine Abfrage richtig und vollkommen angemessen.

Allerdings würde ich die Eingaben von Usern auf jeden Fall zusätzlich durch die Escape Funktion jagen um SQL Injections (einigermaßen) verhindern zu können.
03/19/2014 10:07 Kentika#11
Quote:
Originally Posted by Mostey View Post
Wieso?

Groß- und Kleinschreibung werden bei Nutzernamen sehr wohl auf nahezu allen Seiten beachtet, daher ist seine Abfrage richtig und vollkommen angemessen.

Allerdings würde ich die Eingaben von Usern auf jeden Fall zusätzlich durch die Escape Funktion jagen um SQL Injections (einigermaßen) verhindern zu können.
PHP Code:
$Benutzername mysql_real_escape_string($HTTP_GET_VARS['benutzername']); 

$Passwort mysql_real_escape_string($HTTP_GET_VARS['passwort']); 
macht er hier ja.

Generell sollte man das ganze entweder auf mysqli oder PDO umbauen, denn mysql_* wird bald nicht mehr unterstützt.
03/19/2014 16:46 _robox#12
Wie schon hier in Thema erwähnt Solde er an Stelle von $HTTP_GET_VARS besser $_GET verwanden außerdem ist es ratsam alle $_GET und $_POST mit htmlspecialchars oder eine andern geeigneten Methode absichern
Außerdem ist es ist mysql_real_escape_string beim $Passwort überflüssig Da es nicht an die Datenbank über mittelt wird.

Die SELECT Anweisung enthalt 2 Fehler.
Zum einen kann man nicht davon ausgehen das sich der User immer mit der gleichen Schreibweise einloggt wie bei seiner Registrierung.
Denn Mysql unter scheitet nicht Case sensitivity und Case insensitivity dafür muss ich selber sorgen eine mögliche Lösung habe ich in post 9 versucht nahe zu bringen.

Der zweite Fehler in der SELECT Anweisung betrifft die hoch Kommas sie sind zwar rein von der MySQL Syntax her korrekt nur muss man bedenken das $Benutzername schon ein fertig formatierter String ist und somit die Hoch Kommas überflüssig sind. In gegen Teil sind sie sogar kontra produktive da sie so ein neuen String erzeugen mit zusätzlichen hoch Kommas die nicht erwünscht sind.

Von md5 würde ich komplett die Finger weg lassen denn md5 ist eines der unsichersten hasche verfahren die es in Moment gibt.