Hét vraag- en antwoordplatform van Nederland

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.

Verwijderde gebruiker
13 jaar geleden
964

Heb je meer informatie nodig om de vraag te beantwoorden? Reageer dan hier.

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.
(Lees meer...)
Verwijderde gebruiker
13 jaar geleden

Andere antwoorden (1)

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.
(Lees meer...)
rose
13 jaar geleden

Weet jij het beter..?

Het is niet mogelijk om je eigen vraag te beantwoorden Je mag slechts 1 keer antwoord geven op een vraag Je hebt vandaag al antwoorden gegeven. Morgen mag je opnieuw maximaal antwoorden geven.

0 / 5000
Gekozen afbeelding