Adaugarea datelor in tabele MySQL
Protectii la adaugarea datelor intr-o baza de date
Cand doriti sa adaugati date intr-un tabel MySQL (cu INSERT sau UPDATE) care sunt primite de exemplu dintr-un formular HTML sau prin adresa URL, pe care le preluati prin "$_POST" sau "$_GET", inainte de a le adauga in baza de date este indicat sa le "prelucrati", sa va asigurati ca nu vor fi introduse date care pot fi folosite pentru atacuri gen "SQL injection".
Pentru aceasta puteti folosi unele din urmatoarele filtre pentru a face datele sigure inainte de a ajunge la MySQL:
- magic_quotes_gcp() - (poate fi setat ON din "php.ini") adauga caracterul "\" inaintea ghilimelelor simple sau duble
- addslashes() - o functie PHP care adauga caracterul "\" inaintea ghilimelelor simple sau duble
- mysql_real_escape_string() - adauga caracterul "\" inaintea caracterelor speciale: NULL, \n, \r, \, ', ", \x00 si \x1a
- htmlentities() - transforma caractere HTML in entitati ale acestora (de ex.: > devine > , ghilimelele duble " devin ")
In continuare sunt prezentate trei exemple din care sa intelegeti cum se folosesc aceste functii.
Vom presupune ca folosim datele trimise dintr-un formular HTML, pentru "nume" si "e-mail".
-
Cititi comentariile din coduri.
1.
Exemplu cu addslashes()
<?php
// Intai faceti conectarea la MySQL si selectarea bazei de date
// Daca sunt trimise datele pt. 'nume' si 'e-mail' din formular
if (isset($_POST['nume']) && isset($_POST['email'])) {
$nume = $_POST['nume'];
$email = $_POST['email'];
// Se verifica daca "magic_quotes_gpc()" nu este setat ON
// Daca nu e ON, se filtreaza variabilele cu addslashes()
if(!get_magic_quotes_gpc()) {
$nume = addslashes($nume);
$email = addslashes($email);
}
// Acum se adauga mai in siguranta aceste date in MySQL
$sql = "INSERT INTO `nume_tabel` (col_nume, col_email) VALUES ('$nume', '$email')";
// Se executa interogarea, daca returneaza FALSE afisaza cauza erorii, altfel, afiseaza confirmarea
if (!mysql_query($sql)) {
echo 'Eroare : '. mysql_errno(). ' - '. mysql_error();
}
else {
echo 'Datele au fost adaugate';
}
}
@mysql_close();
?>
2.
Exemplu cu mysql_real_escape_string()
-
Pentru a avea exemple variate, aici folosim o interogare pentru UPDATE
<?php
// Intai faceti conectarea la MySQL si selectarea bazei de date
// Daca sunt trimise datele pt. 'nume' si 'e-mail' din formular
if (isset($_POST['nume']) && isset($_POST['email'])) {
// Se verifica daca "magic_quotes_gpc()" este setat ON
// Daca e ON, se aplica stripslashes() pentru a nu se adauga de 2 ori "\"
if(get_magic_quotes_gpc()) {
$_POST['nume'] = stripslashes($_POST['nume']);
$_POST['email'] = stripslashes($_POST['email']);
}
// Se adauga valorile filtrate cu mysql_real_escape_string() in variabile
$nume = mysql_real_escape_string($_POST['nume']);
$email = mysql_real_escape_string($_POST['email']);
// Acum se adauga mai in siguranta aceste date in MySQL
// Conditia WHERE `id`=1 e foloseta pt. a face update exact in randul unde vrem, aici cel cu id=1
$sql = "UPDATE `nume_tabel` SET `col_nume`='$nume', `col_email`='$email' WHERE `id`=1";
// Se executa interogarea, daca returneaza FALSE afisaza cauza erorii, altfel, afiseaza confirmarea
if (!mysql_query($sql)) {
echo 'Eroare : '. mysql_errno(). ' - '. mysql_error();
}
else {
echo 'Datele au fost modificate';
}
}
@mysql_close();
?>
- Cand folositi
addslashes() sau
mysql_real_escape_string() la adaugarea datelor, pentru citirea lor folositi functia inversa
stripslashes() - aceasta anuleaza caracterele "
\" care au fost adaugate.
Iata un exemplu:
<?php
// Intai faceti conectarea la MySQL si selectarea bazei de date
$sql = "SELECT `col_nume`, `col_email` FROM `nume_tabel`";
$rezultat = mysql_query($sql) or trigger_error(E_USER_ERROR);
if (mysql_num_rows($rezultat) == 0) {
echo '0 rezultate';
}
else {
while ($rand = mysql_fetch_assoc($rezultat)) {
// Elimina caracterele "\" care au fost adaugate de "addslashes()" sau "mysql_real_escape_string()"
$nume = stripslashes($rand['col_nume']);
$email = stripslashes($rand['col_email']);
echo '<br />'. $nume. ' - '. $email;
}
}
@mysql_close();
?>
3.
Exemplu cu htmlentities()
- Cand doriti sa adaugati cod HTML intr-un tabel MySQL, pentru siguranta puteti folosi "
htmlentities()".
<?php
// Intai faceti conectarea la MySQL si selectarea bazei de date
// Variabila care contine codul HTML pe care dorim sa-l adaugam in tabelul MySQL
$sir = '<a href="http://www.marplo.net/php-mysql" title="Curs PHP-MySQL">PHP-MySQL</a>';
// Se convertesc cu htmlentities() caracterele specifice HTML
$sir = htmlentities($sir);
// Acum se pot adauga datele in MySQL
$sql = "INSERT INTO `nume_tabel` (col_html) VALUES ('$sir')";
// Se executa interogarea, daca returneaza FALSE afisaza cauza erorii, altfel, afiseaza confirmarea
if (!mysql_query($sql)) {
echo 'Eroare : '. mysql_errno(). ' - '. mysql_error();
}
else {
echo 'Datele au fost adaugate';
}
@mysql_close();
?>
- In baza de date va fi adaugat urmatorul sir:
<a href="http://www.marplo.net/php-mysql" title="Curs PHP-MySQL">PHP-MySQL</a>'
- Pentru a citi si returna corect datele care a fost adaugate in tabelul MySQL folosind "htmlentities()", aplicati functia inversa acesteia,
html_entity_decode().
Iata un exemplu:
<?php
// Intai faceti conectarea la MySQL si selectarea bazei de date
$sql = "SELECT `col_html` FROM `nume_tabel`";
$rezultat = mysql_query($sql) or trigger_error(E_USER_ERROR);
if (mysql_num_rows($rezultat) == 0) {
echo '0 rezultate';
}
else {
while ($rand = mysql_fetch_assoc($rezultat)) {
// Se transforma in caractere pt. HTML entitatile acestora, convertite de "htmlentities()"
$codhtml = html_entity_decode($rand['col_html']);
echo $codhtml;
}
@mysql_close();
?>