In de Nieuwe PHP-code fragment, bent u nog steeds kwetsbaar voor injecties.
U gebruikt een voorbereide verklaring in het invoeggedeelte, maar u gebruikt de sterkten van de voorbereidingen niet correct.
Wanneer u een voorbereide instructie maakt, maakt u een query waarin u tijdelijke aanduidingen toevoegt in plaats van de onbewerkte waarden:
$stmt = $conn->prepare("INSERT INTO Users (email, pw) VALUES (?, ?)");
De vraagtekens zijn de tijdelijke aanduidingen en worden later vervangen door de bind_param
methode:
$stmt->bind_param('ss', $email, $pw);
De ss
een deel van de bind-aanroep vertelt de mysql db dat de twee strings die aan de database worden doorgegeven (s voor string
, ik voor int
etc).
Je bent een parameter aan het binden ($name
) maar het heeft geen tijdelijke aanduiding of enige verwijzing in de zoekopdracht..?
Je select-statement daarentegen is nog steeds onveilig en staat open voor kwetsbaarheden.
Ik zou daar waarschijnlijk een voorbereid statement voor gebruiken, net als bij het invoeggedeelte.
U wilt er altijd zeker van zijn dat de invoer van de gebruiker "veilig" is voor de database. Als u een queryreeks samenvoegt en er gebruikersinvoer aan toevoegt, zal de database niet ontsnappen aan de tekenreeksen, maar deze uitvoeren.
Gebruik alleen standaard query
methode-aanroepen wanneer u de volledige query zelf schrijft, zonder invoerparameters, en vooral zonder invoerparameters die de gebruiker heeft doorgegeven!