Wat betekent het om aan een string te ontsnappen?

Ik las Does $ _SESSION[‘gebruikersnaam’] moet een escapecode worden gebruikt voordat u een SQL-query kunt starten?en er stond: “U moet elke string die u doorgeeft aan de SQL-query, ongeacht de oorsprong ervan, escapen”. Nu weet ik dat zoiets heel basaal is. Een Google-zoekopdracht leverde meer dan 20.000 resultaten op. Alleen Stackoverflow had 20 pagina’s met resultaten, maar niemand legt echt uit wat ontsnappen aan een string is of hoe het moet. Het wordt gewoon verondersteld. Kun je me helpen? Ik wil leren, want zoals altijd maak ik een web-app in PHP.

Ik heb gekeken naar:
Escape-tekens invoegen, Wat zijn alle escape-tekens in Java?,
Kan niet ontsnappen aan een string met addcslashes(),
Escape-personage,
wat doet mysql_real_escape_string() echt?,
Hoe kan ik dubbele aanhalingstekens uit een string in php?,
MySQL_real_escape_string voegt geen slashes toe?,
verwijder escape-reeksen uit string in phpIk zou kunnen doorgaan, maar ik ben zeker dat je het punt begrijpt. Dit is geen luiheid.


Antwoord 1, autoriteit 100%

Escapen aan een tekenreeks betekent het verminderen van ambiguïteit 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 string kunnen gebruiken:

'Hello "World."'

Of ik kan ontsnappen aan mijn aanhalingstekens:

"Hello \"World.\""

Elk aanhalingsteken dat wordt voorafgegaan door een schuine streep, wordt escapeden wordt beschouwd als onderdeel van de waarde van de tekenreeks.

Als het op zoekopdrachten aankomt, heeft MySQL bepaalde trefwoorden waar het op let die we niet kunnen gebruiken in onze zoekopdrachten zonder enige verwarring te veroorzaken. Stel dat we een tabel met waarden hadden waarin een kolom “Selecteren” heette, en we wilden dat selecteren:

SELECT select FROM myTable

We hebben nu enige dubbelzinnigheid in onze zoekopdracht 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 je worden afgehandeld door simpelweg je 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 bestaan andere methoden om strings te escapen, zoals add_slashes, addcslashes, quotemetaen meer, hoewel je dat zult merken wanneer de doel is om een veilige query uit te voeren, over het algemeen geven ontwikkelaars de voorkeur aan mysql_real_escape_stringof pg_escape_string(in de context van PostgreSQL.


Antwoord 2, autoriteit 16%

Sommige tekens hebben een speciale betekenis voor de SQL-database die u gebruikt. Wanneer deze tekens in een query worden gebruikt, kunnen ze onverwacht en/of onbedoeld gedrag veroorzaken, waaronder het toestaan dat een aanvaller uw database binnendringt. Om te voorkomen dat deze tekens een zoekopdracht op deze manier beïnvloeden, moeten ze worden ontsnapt, of om het op een andere manier te zeggen, moet de database worden verteld om ze niet als speciale tekens in deze zoekopdracht te behandelen.

In het geval van mysql_real_escape_string()ontsnapt het aan \x00, \n, \r,\, ', "en \x1aaangezien deze, indien niet ontsnapt, de eerder genoemde problemen kunnen veroorzaken, waaronder SQL-injecties met een MySQL-database.


Antwoord 3

Voor de eenvoud zou je je kunnen voorstellen dat de backslash “\” een commando is voor de interpreter tijdens runtime.

Voor bijv. tijdens het interpreteren van deze verklaring:

$txt = "Hello world!";

tijdens de lexicale analysefase (of bij het opsplitsen van de verklaring in individuele tokens) zouden dit de geïdentificeerde tokens zijn
$, txt, =, ", Hello world!, ", en ;

De backslash binnen de string zal echter een extra set tokens veroorzaken en wordt geïnterpreteerd als een commando om iets te doen met het teken dat er onmiddellijk op volgt:
voor bijv.

$txt = "this \" is escaped";

resulteert in de volgende tokens:
$, txt, =, ", this, \, ", is escaped, "en ;

de tolk weet al (of heeft vooraf ingestelde routes die hij kan nemen) wat hij moet doen op basis van het teken dat volgt op het \token. Dus in het geval van "behandelt het het als een teken en niet als het einde-van-tekenreeks commando.

Other episodes