Ontsnappen aan een tekenreeks betekent het verminderen van dubbelzinnigheid in aanhalingstekens (en andere tekens) die in die tekenreeks worden gebruikt. Als u bijvoorbeeld een tekenreeks definieert, plaatst u deze meestal tussen dubbele aanhalingstekens of enkele aanhalingstekens:
"Hello World."
Maar wat als mijn string dubbele aanhalingstekens bevat?
"Hello "World.""
Nu heb ik ambiguïteit - de tolk weet niet waar mijn string eindigt. Als ik mijn dubbele aanhalingstekens wil behouden, heb ik een paar opties. Ik zou enkele aanhalingstekens rond mijn tekenreeks kunnen gebruiken:
'Hello "World."'
Of ik kan ontsnappen aan mijn aanhalingstekens:
"Hello \"World.\""
Elk aanhalingsteken dat wordt voorafgegaan door een schuine streep is escaped , en wordt begrepen als onderdeel van de waarde van de string.
Als het gaat om zoekopdrachten, heeft MySQL bepaalde trefwoorden waar het op let die we niet in onze zoekopdrachten kunnen gebruiken zonder enige verwarring te veroorzaken. Stel dat we een tabel met waarden hadden waarin een kolom de naam "Selecteren" had, en we wilden dat selecteren:
SELECT select FROM myTable
We hebben nu enige dubbelzinnigheid in onze query geïntroduceerd. Binnen onze zoekopdracht kunnen we die dubbelzinnigheid verminderen door back-ticks te gebruiken:
SELECT `select` FROM myTable
Dit neemt de verwarring weg die we hebben geïntroduceerd door slecht beoordelingsvermogen te gebruiken bij het selecteren van veldnamen.
Veel hiervan kan voor u worden afgehandeld door eenvoudig uw waarden door te geven via mysql_real_escape_string()
. In het onderstaande voorbeeld kunt u zien dat we door gebruikers ingediende gegevens via deze functie doorgeven om ervoor te zorgen dat dit geen problemen oplevert voor onze zoekopdracht:
// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
Er zijn andere methoden om strings te escapen, zoals add_slashes
, addcslashes
, quotemeta
, en meer, hoewel u zult merken dat wanneer het doel is om een veilige zoekopdracht uit te voeren, ontwikkelaars over het algemeen de voorkeur geven aan mysql_real_escape_string
of pg_escape_string
(in de context van PostgreSQL.