Hoe kan ik het beste HTML data met PHP naar een MySQL tabel wegzetten?

Hoe kan ik het beste HTML data met PHP naar een MySQL tabel wegzetten?

Heeft iemand hier een good practice voor?

Ik heb namelijk een aantal html formulieren waar een WYSIWYG editor overheen zit die HTML code genereert.

Vaak zit je namelijk met problemen dat slashes en dergelijke problemen veroorzaken met uitvoeren van de query.

Weet jij het antwoord?

/2500

Het beste antwoord

Alle data die je met SQL wegschrijft naar een database moet ge-escaped worden volgens de regels die gelden voor die database, in dit geval MySQL. Hiermee voorkom je ten eerste dat ongeldige SQL queries kunnen ontstaan (het probleem waar jij nu tegenaan loopt), maar veel belangrijker nog, voorkom je hiermee ook potentiële SQL injectie. SQL injectie is het injecteren van SQL in jouw SQL queries door kwaadwillenden. Beschouw dit voorbeeld: $sql = 'SELECT username FROM users WHERE username = "' . $_POST[ 'username' ] . '" AND password = "' . $_POST[ 'password' ] . '"'; $result = mysql_query( $sql ); var_dump( mysql_num_rows() ); Wat gebeurt er als ik als kwaadwillende het volgende waarden stuur aan jouw script: $_POST = array( 'username' => 'admin', 'password' => 'bogus" OR 1=1' ); De query wordt dan: SELECT username FROM users WHERE username = "admin" AND password = "bogus" OR 1=1 Boom!! Het resulteert dus in een geldig resultaat! En iemand is bij wijze van spreke ingelogd als admin. Nou zou je zelf iets kunnen schrijven om de invoer te escapen, maar dit wordt ten zeerste afgeraden. Als je de mysql_* functies gebruikt kun je mysql_real_escape_string() gebruiken om de data te escapen. Maar zelfs dat is niet meer van deze tijd. Ik raad je daarom aan om een andere extensie te gebruiken, namelijk PDO. Met PDO kun je gebruik maken van zogenaamde 'prepared statements'. Dit zijn SQL queries die eerst voorbereid worden op het insluiten van variabelen met placeholders, waarna je vervolgens de placeholders vult met waarden. Zie dit voorbeeld: $db = new PDO( 'mysql:host=127.0.0.1;dbname=jouwdatabase', $username, $password ); $sql = 'SELECT username FROM users WHERE username = :username AND password = :password'; $statement = $db->prepare( $sql ); $statement->execute( array( ':username' => $_POST[ 'username' ], ':password' => $_POST[ 'password' ], ) ); foreach( $sth->fetch(PDO::FETCH_ASSOC) as $row ) { etc.. } De placeholders zijn hier de strings met een : ervoor. Je kan, nadat je de SQL ge-prepared hebt, dan de waarden op verschillende manieren toekennen aan de query. Hierboven deed ik dat door het door te geven aan de execute() methode. Het voordeel van PDO met prepared statements, is dat je je geen zorgen meer hoeft te maken om het eigenhandig escapen van SQL input. Dat doet PDO nu voor je, volgens de regels die gelden voor de database die je gebruikt (MySQL in dit geval). PDO kan met meerdere databases overweg namelijk.

Bronnen:
http://en.wikipedia.org/wiki/SQL_injection
http://nl.wikipedia.org/wiki/SQL-injectie
http://php.net/manual/en/book.pdo.php
http://php.net/manual/en/function.mysql-re...
http://www.php.net/manual/en/pdo.prepared-...

Omdat het antwoord nogal uitgebreid is, neem ik de vrijheid je een aantal links naar goede, duidelijke tutorials te presenteren: Eentje in het engels: http://www.w3schools.com/PHP/php_mysql_insert.asp en eentje in het Nederlands: http://www.sitemasters.be/tutorials/2/1/78/MySQL/Formulier Ik denk dat je er hiermee wel uit moet komen.

Stel zelf een vraag

Ben je op zoek naar het antwoord die ene vraag die je misschien al tijden achtervolgt?

/100