en pt nl nl nl de et nl nl en nl nl nl nl af it nl nl nl en nl nl nl nl nl nl nl af de fy nl nl nl de nl en nl en af nl
Totdat ik vandaag hoorde over prepared statements en dat mijn databases nu heel makkelijk te injecteren waren.
Ik ben toen op zoek gegaan en prepared statements met insert into lukt me prima maar nu wil ik mijn login scripts gaan verbeteren en daar dus ook anti MySQLi injectie toevoegen alleen ik weet niet hoe.
Zou iemand voor mij een voorbeeldje kunnen typen hier met wat uitleg erbij?
Ik persoonlijk gebruik geen prepared statement in Mysqli. Ik gebruik de functie mysqli_real_escape_string(). Ook zie ik dat je md5 gebruikt. Dit is sterk af te raden. Dus ik heb die md5 functie even verbeterd naar SHA512 (Nog niet 100% veilig). Het best sla je het wachtwoord in bcrypt op maar om je niet in de war te helpen met je huidige code gebruik ik SHA512.
$username = $_POST['username']; // Zet het wachtwoord om naar sha512 $password = hash('sha512', $_POST['password']); $result = $conn->query("SELECT * FROM users WHERE username=' ".$conn->escape($username)." ' AND password=' ".$conn->escape($password)." ' "); if($result->num_rows > 0) { while($row = $result->fetch_assoc()) { // Sessies aanmaken, header naar homepage/mijnaccount etc } } else { echo 'Er is iets fout!'; }
Ok, zoals je ziet heb ik je query even aangepast naar:
$result = $conn->query("SELECT * FROM users WHERE username=' ".$conn->escape($username)." ' AND password=' ".$conn->escape($password)." ' ");
Deze escaped de value. $conn->escape();
Je moet nu in de class waar die $conn vandaan komt deze functie toevoegen.
//Deze moet je toevoegen public function escape($query) { //Deze zorgt ervoor dat de ' en " \ er uit worden gefilterd. return mysqli_real_escape_string($joudatabase,$query); }
Opzich hoef je het wachtwoord niet te escape aangezien die in een hash wordt gezet. Maar voor de zekerheid doen we dit toch.
Ik hoop dat ik jou vragen beantwoord heb.
Misschien leg ik het moeilijk uit of leg ik iets verkeerd uit. Maar ik heb mijn best gedaan.
Dat bcrypt beter is ben ik van op de hoogte alleen mensen moeten zich via een game registreren met een commando /register (Die plugin die ik daarvoor gebruik ondersteund geen bcrypt e.d).
Maar nogmaals, heel erg bedankt voor de uitleg en de oplossing!
Met MySQLi kun je prepared statements op de volgende manier uitvoeren:
$stmt = $mysqli->prepare("SELECT id FROM users WHERE username = ?"); $stmt->bind_param('s', $username); // s: string, i: int, d: float/double $stmt->execute();
Of je maakt een functie:
function prepareStmt($mysqli, $sql, $params) { $stmt = $mysqli->prepare($sql); foreach($params as $param) { if (is_int($param)) $stmt->bind_param('i', $param); elseif (is_double($param)) $stmt->bind_param('d', $param); else $stmt->bind_param('s', (string)$param); } return $stmt; } $stmt = prepareStmt($conn, 'SELECT id FROM users WHERE username = ?', [$username]); $stmt->execute(); // fetch enz