Forum und email

mysql_real_escape_string

(PHP 4 >= 4.3.0, PHP 5, PECL mysql:1.0)

mysql_real_escape_string — Sikrer special karakterer i en streng, til brug i en MySQL erklæring

Beskrivelse

string mysql_real_escape_string ( string $unescaped_string [, resource $link_identifier ] )

unescaped_string
Strengen du vil sikre
link_identifier (valgfri)
MySQL forbindelsen

Funktionen vil sikre specielle karakterer, i unescaped_string , den tager det nuværende karakter sæt, for forbindelsen, i betragtning, så den er sikker at bruge sammen med mysql_query(). hvis det er binært data du vil indsætte, skal du bruge denne funktion.

mysql_real_escape_string() kalder MySQLs biblioteks funktion mysql_escape_string, hvilket tilføjer en skråstreg, til følgende karakterer: NULL, \x00, \n, \r, \, ', " og \x1a.

Example#1 Et mysql_real_escape_string() eksempel

<?php
// Connect
$link mysql_connect('mysql_host''mysql_bruger''mysql_kode')
    OR die(
mysql_error());

// Query
$query sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            
mysql_real_escape_string($user),
            
mysql_real_escape_string($password));
?>

Denne funktion, skal altis bruges (med få undtagelser), for at gøre dine data sikre, før de bliver sendt i en forespørgsel til MySQL.

Note: Hvis magic_quotes_gpc er aktiveret, bør du først køre strengen gennem stripslashes(). Brugen af denne funktion, på data der allerede er sikret, vil sikre den dobbelt.

Hvis denne funktion ikke bliver brugt, er forespørgslen, sårbar, overfor SQL Indsættelses Angreb.

Example#2 Et eksempel på SQL Indsættelses angreb

<?php
// Forespørg databasen, om der er lignende brugere
$query "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);

// Vi tjekkede ikke $_POST['password'], det kunne være hvad som helst, brugeren ønskede, f.eks.:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";

// Det betyder, at forespørgslen der bliver sendt til MySQL, er:
echo $query;
?>

Forespørgslen til MySQL:

SELECT * FROM users WHERE name='aidan' AND password='' OR ''=''

Det vil tillade alle, at logge ind, uden en gyldigt kode.

Example#3 En "God Træning" forespørgsel

Ved brug af mysql_real_escape_string() omkring hver variabel, vil det forebygge SQL Indsættelser. Det demonstrerer brugen af "God Træning" metode, for forespørgsler til en database, der er ligeglad, med Magic Quotes instillinger.

<?php
// Gør en variabel sikker
function quote_smart($value)
{
    
// Stripslashes
    
if (get_magic_quotes_gpc()) {
        
$value stripslashes($value);
    }
    
// Quote hvis det ikke er et heltal
    
if (!is_numeric($value)) {
        
$value "'" mysql_real_escape_string($value) . "'";
    }
    return 
$value;
}

// Forbind
$link mysql_connect('mysql_host''mysql_user''mysql_password')
    OR die(
mysql_error());

// Lav en sikekr forespørgsel
$query sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
            
quote_smart($_POST['username']),
            
quote_smart($_POST['password']));

mysql_query($query);
?>

Forespørgslen vil nu eksekvere korrekt, og SQL Indsættelses angreb, vil ikke virke.

Note: mysql_real_escape_string() fjerne ikke % og _. Disse er jokertegn i MySQL, hvis de er kombineret med LIKE, GRANT, eller REVOKE.

Se også mysql_client_encoding(), addslashes(), stripslashes(), magic_quotes_gpc, og magic_quotes_runtime direktivet.