Freitag, 20. März 2015

(Sicheres) PHP Loginsystem (geschützt gegen SQL-Injections)

In einem vorigen Post habe ich ein Loginsystem mit PHP vorgestellt. Dieses war durch die Verwendung der einfachen Queries aus der mysql Klasse anfällig gegen SQL-Injections. Diese Lücke möchte ich nun heute schließen, in dem ich die im vorigen Post vorgestellte Klasse mysqli und Prepared Statements verwende.
Da das Prinzip des Loginsystems gleich geblieben ist und die Prepared Statements im verlinkten Post erklärt wurden, hier einfach der Code:

register.php (http://bloggeroliver.bplaced.net/PHPExamples/LoginV2/register.php):

<?php
$conn = new mysqli("db4free.net", "csharptricks", "12345678", "csharptricks");

$username = $_POST["username"];
$password = $_POST["password"];
$hashedpw = md5($password);

$stmt = $conn->prepare("SELECT username FROM Users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->store_result();

if ($stmt->num_rows > 0) {
     echo "Existing";
}
else {
     $stmt = $conn->prepare("INSERT INTO Users (username, password) VALUES (?, ?);");
     $stmt->bind_param("ss", $username, $hashedpw);
     $stmt->execute();
     echo "Success";
}
?>

login.php (http://bloggeroliver.bplaced.net/PHPExamples/LoginV2/login.php):

<?php
session_start();

$conn = new mysqli("db4free.net", "csharptricks", "12345678", "csharptricks");

$username = $_POST["username"];
$password = $_POST["password"];
$hashedpw = md5($password);

$stmt = $conn->prepare("SELECT username, password FROM Users WHERE username = ? LIMIT 1");
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->bind_result($output1, $output2);
$row = $stmt->fetch();

if($output2 == $hashedpw) {
    $_SESSION["username"] = $username;
    echo "LoginGood";
}
else {
    echo "LoginBad";
}
?>

Da die Schnittstelle nach außen gleich geblieben ist, kann natürlich auch der C# Code für die Loginanwendung aus dem vorigen Post wieder verwendet werden.

Keine Kommentare:

Kommentar veröffentlichen