en pt nl nl en nl nl nl nl en fy nl en nl nl en nl nl nl nl en nl nl nl en nl en nl nl nl en nl nl nl nl nl nl nl nl en nl nl nl en nl nl nl nl nl en nl en en nl nl en nl en nl de nl
De code voor het ophalen van het juiste product ziet er nu zo uit:
Jouw applicatie is vatbaar voor SQL injecties.
[onbekend] En wat is hiervoor de beste oplossing?
[verwijderd] Het beste kun je MySQLi of PDO prepared statements gebruiken of overstappen naar PDO. PDO is de meest voor de hand liggende oplossing en de makkelijkste variant om prepared statements te gebruiken.
Ik zal een stukje PDO code laten zien.
Connect met je database op de PDO manier: lees hier meer en gebruik de volgende code:
// Prepare $query = $conn->prepare("SELECT * FROM shop_products WHERE id = :id LIMIT 1"); // Execute $query->execute([ ':id' => $id ]); // Resultaten? if ($query->rowCount() === 0) { exit("404: Product niet gevonden"); } // Fetch resultaten naar $product $product = $query->fetch(PDO::FETCH_ASSOC);
Je kan er een try-catch omheen zetten om eventuele query fouten op te vangen (aangeraden)
Je volledige code in PDO wordt dan:
De code is getest en werkt. Maakt ook gelijk gebruik van een try-catch en heeft voorbeeld $conn variable. Als je in PDO try-catch wilt gebruiken, moet je dit aangeven nadat de connectie aangemaakt is (zoals beneden wordt weergegeven).
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if(!isset($_GET["id"]) || !is_numeric($_GET["id"])) { exit("Invalid or missing parameter"); // Doe iets om dit af te vangen } $id = $_GET["id"]; try { // Prepare $query = $conn->prepare("SELECT * FROM shop_products WHERE id = :id LIMIT 1"); // Execute $query->execute([ ':id' => $id ]); // Resultaten? if ($query->rowCount() === 0) { exit("404: Product niet gevonden"); } // Fetch resultaten naar $product $product = $query->fetch(PDO::FETCH_ASSOC); } catch (Exception $e) { exit("Foutmelding: " . $e->getMessage()); } echo $product['title'] . ' ' . $product['description'];
if(!isset($_GET["id"]) || !is_numeric($_GET["id"])) { exit("Invalid or missing parameter"); // Doe iets om dit af te vangen }
Dit is dus in principe het hele stukje om de SQL injection tegen te gaan, of heb ik dat mis? Op welk punt is PDO beter of veiliger dan het SQL dat ik gebruik en wat is überhaupt het verschil?
Is het gebruik van mysqli_real_escape_string() daarnaast niet voldoende?
Ik heb het topic gesplitst omdat het ondertussen om een ander onderwerp ging
[verwijderd] Soort van wel ja, maar op toekomstige plekken kun je dit soort stukjes code vergeten. Daarom is het belangrijk om door middel van PDO/MySQLi prepared statements je onveilige gebruikers input niet je query verpest. Als er maar een haakje, quote of gekke leestekens ervoor kan zorgen dat je query niet meer werkt, is het gewoonweg onveilig en kan het worden omzeild.
Vuistregel is: Elke input van de gebruiker is potentieel gevaarlijk
Vandaar dat je niet alleen een foutmelding moet weergeven, maar ook ervoor moet zorgen dat de query goed werkt. mysqli_real_escape_string() zou je kunnen gebruiken, maar voor grotere applicaties kun je 't zo vergeten. Vandaar prepared statements.
Overigens is het als het goed is ook zo dat prepared statements ervoor kunnen zorgen dat je queries sneller werken, dat komt omdat de queries worden gecached en alleen de values aangepast worden. Dus het zou moeten resulteren tot een sneller systeeem.
Jasper Klinkt cool maar ik weet überhaupt niet wat dat prepared statements is/inhoudt. Kan je daar meer over vertellen als je toch al bezig bent? 😬
Prepared statements houd in dat je queries schrijft die je makkelijk veilig en snel opnieuw kan uitvoeren. Ook bij enkele resultaten is het verstandig om er gebruik van te maken omdat je gebruik maakt van de efficiëntie ervan en eenheid in je code hebt. Queries worden namelijk gecached en kunnen dan sneller worden uitgevoerd.
Het zijn gewone queries, alleen dan veiliger uitgevoerd en gecached, en kan je efficiënt vaker uitvoeren als dat nodig is.
Op w3schools staat op deze pagina de volgende quote:
A prepared statement is a feature used to execute the same (or similar) SQL statements repeatedly with high efficiency.
Overigens, bekijk die pagina's in zijn geheel even die over MySQLli/PDO prepared statements gaan, er staat veel informatie daar!
Jasper Dus kan ik het kan vergelijken met een eigen function, die je hergebruikt?
Dan nog de vraag op welk punt PDO beter of veiliger is dan het MySQL?
Ik heb op internet gevonden dat prepared statements met MySQLi op deze manier zouden moeten werken. Klopt dit en is dit zo veilig?
$mysqli = new mysqli($host, $user, $password, $dbname); if($mysqli->connect_error) { die('Error connecting to database: ' . $conn->connect_error); } $stmt = $mysqli->prepare('SELECT * FROM posts WHERE id = ?'); $stmt->bind_param('i', $_GET['id']); $stmt->execute(); $result = $stmt->get_result()->fetch_assoc(); echo ' ' . $result['title'] . ' '; echo $result['content'] . '  '; $stmt->close();
[verwijderd] Niet helemaal, het idee is dat je bij veel queries snel de query opnieuw kan gebruiken. Maar door diezelfde techniek krijg je ook veilige queries, dus worden ze ook gebruikt bij enkele queries.
Lees even dit bericht van mij (4 dagen geleden) waarom 't veiliger is 😃
PDO = MySQL -> Default MySQL code is anders dan PDO, maar PDO is betrouwbaarder
[verwijderd] Code ziet er prima uit! Je gaat dus voor de php MySQLi prepared statements? 🙂
[verwijderd] De overstap naar PDO is even wennen als je mysql_ of mysqli_ gewend bent. Echter, je kunt er veel meer mee. Bovendien kun je, als je PDO gebruikt, ook fancy stuff als MyON gebruiken. (tuturial op DevNL)