2010-12-21 3 views
2

Pls ist dieser Code sicher?Parametrisierte Abfrage

/* Create a new mysqli object with database connection parameters */ 
$mysqli = new mysql('localhost', 'username', 'password', 'db'); 

if(mysqli_connect_errno()) { 
echo "Connection Failed: " . mysqli_connect_errno(); 
exit(); 
} 

/* Create a prepared statement */ 
if($stmt = $mysqli -> prepare("SELECT priv FROM testUsers WHERE username=? 
AND password=?")) { 

/* Bind parameters 
s - string, b - boolean, i - int, etc */ 
$stmt -> bind_param("ss", $user, $pass); 

/* Execute it */ 
$stmt -> execute(); 

/* Bind results */ 
$stmt -> bind_results($result); 

/* Fetch the value */ 
$stmt -> fetch(); 

echo $user . "'s level of priviledges is " . $result; 

/* Close statement */ 
$stmt -> close(); 
} 

/* Close connection */ 
$mysqli -> close(); 
+7

Pedantische Anmerkung: Jeder einzelne dieser Kommentare ist 100% nutzlos und sollte entfernt werden. Sie machen den Code schwieriger zu lesen und fügen keine zusätzlichen Informationen hinzu ... Ich fühle mich genauso bei Objektmethodenaufrufen ('$ stmt-> execute()', es gibt keinen Grund, die Aufrufe durch Whitespaces zu trennen) ... Einrücken Sie Ihren Code richtig, es hilft auch Lesbarkeit ... – ircmaxell

+0

Ja, es ist sicher, aber es ist auch boooooring –

Antwort

8

Was den Schutz gegen mySQL-Injektion angeht: Ja. Mysqlis parametrisierte Abfragen sind sicher gegen Injektionsangriffe.

Wenn $user von einer externen Quelle kommt, möchten Sie vielleicht htmlentities() die echo-Anweisung, um Benutzer daran zu hindern, mit einem Benutzernamen anmelden wie <script>(some malicious code)</script>

+0

Sie möchten den Rohwert in der Datenbank speichern und formatieren auf Ausgabe, einschließlich htmlentities. Auf diese Weise können Sie die Art und Weise ändern, in der Sie die Daten bearbeiten. – Malfist

3

Der Aufruf per se sicher ist. Sie können diese $mysqli = new mysql('localhost', 'username', 'password', 'db'); jedoch in eine separate Datei außerhalb Ihres öffentlichen Webverzeichnisses einfügen.

1

Zusätzlich zu Pekkas Kommentar: Verwenden Sie auch htmlspecialchars auf $ result in der echo-Anweisung.

+0

Guter Punkt, aber vermutlich ist das Array von Privilege Levels hardcoded kann nicht von außen beeinflusst werden. (A htmlentities() auf es tut jedoch nicht so oder so weh.) –

+0

Das ist eine Annahme, die Sie nicht sicher sein können..was wenn die Privilegien von einem unsicheren Admin gepflegt werden? Im Grunde, wenn es auf den Bildschirm geht, müssen Sie es gegen XSS-Angriffe entkommen. – Oli