2016-03-20 12 views
3

Vor 2 Tagen hat ein Hacker ein Admin-Konto bekommen. Er sagte uns, dass login.php anfällig ist.Ist mein Anmeldeskript anfällig für SQL Injection?

Aber ich kann nicht herausfinden, wie ich die Eingänge entkommen:

$salt  = '78sdjs86d2h'; 
$username = mysqli_real_escape_string($DB_H, addslashes($_POST['username'])); 
$password = mysqli_real_escape_string($DB_H, addslashes($_POST['password'])); 
$hash1 = hash('sha256', $password . $salt); 
$hash = strtoupper($hash1); 

$check = mysqli_query($DB_H, "SELECT * FROM players WHERE Name='$username' && Password = '$hash'"); 

if(mysqli_num_rows($check) != 0) 
+0

Sieht für mich in Ordnung, obwohl man es verbessern kann .. php docs lesen es Sie – bader

+0

Vielleicht der Hacker erraten das Passwort viel helfen? Oder es ist ein anderer Teil des Codes –

+0

Zusätzlich zu dem, was YourCommonSense sagte, sollten Sie wahrscheinlich lernen, [wie ein Passwort sicher zu speichern] (https://paragonie.com/blog/2016/02/how-safely-store-password -in-2016). –

Antwort

-1

Anstelle dieser mysqli Funktionen gehen für PDO-Anweisungen. Hier Referenz PHP PDO Documentation

+0

Ich versuche es zu benutzen, aber es gibt immer 500 Fehler :(Ich kann nicht verwenden, dass ich keine Ahnung habe, warum ... –

+0

Ihren Code in Frage Edit zeigen. –

+0

Ich löschte es vor 1 Stunde nach vielen fehlschlägt, jetzt habe ich wirklich keine ahnung, was ich tun soll ... dieser typ hat gesagt, "das login.php-skript ist die eine angreifbare" .. aber wie ihr auch sagt "es scheint in Ordnung" ... was soll ich tun, um das zu stoppen ' sql injection '? .. –

0

-Test mit diesem:

$sHost = 'localhost'; 
$sDb = 'test'; 
$sUser = 'user'; 
$sPassword = 'password'; 

$oDb = new PDO("mysql:host={$sHost};dbname={$sDb}", $sUser, $sPassword); 

$salt = '78sdjs86d2h'; 
$username = $_POST['username']; 
$password = $_POST['password']; 

$hash1 = hash('sha256', $password . $salt); 
$hash = strtoupper($hash1); 

$sSql = 'SELECT * FROM players WHERE Name = :username AND Password = :password'; 

$oStmt = $oDb->prepare($sSql); 
$oStmt->bindParam(':username', $username, PDO::PARAM_STR); 
$oStmt->bindParam(':password', $hash, PDO::PARAM_STR); 

if($oStmt->execute()){ 
    $oRow = $oStmt->fetch(PDO::FETCH_OBJ); 
    if(false === $oRow){ 
     echo 'User or password not valid'; 
    } else { 
     echo 'Uer and password valid!!!'; 
    } 
} else { 
    echo 'Error'; 
} 
2

Sofern Sie some peculiar encoding verwenden, ist der Code, den Sie geschrieben, obwohl es sehr wenig Sinn macht, ist unverwundbar für SQL-Injection. Es wird eher keinen ehrlichen Benutzer sich anmelden lassen, aber es gibt keine Möglichkeit, es durch SQL-Injection zu hacken.

Die Sicherheitslücke war von der anderen Art, XSS zum Beispiel.

+0

Sie sind auch doppelt entkommen, was * seltsam * ist. –

2

Es ist besser, Prepare-Anweisungen zu verwenden, um SQL-Injektion zu vermeiden. Zum Beispiel

$check = mysqli_query($DB_H, "SELECT * FROM players WHERE Name='$username' && Password = '$hash'") 

es verwenden, wie dies

$check = $DB_H->prepare("SELECT * FROM players WHERE Name=? && Password = ?") 
$check->bind_param('ss',$username,$hash); 
$check->execute();