Ucieczka z ciągu oznacza zmniejszenie niejednoznaczności w cudzysłowie (i innych znakach) użytych w tym ciągu. Na przykład, kiedy definiujesz ciąg, zwykle otaczasz go podwójnymi lub pojedynczymi cudzysłowami:
"Hello World."
Ale co, jeśli mój ciąg będzie zawierał podwójne cudzysłowy?
"Hello "World.""
Teraz mam niejednoznaczność - interpreter nie wie, gdzie kończy się mój ciąg. Jeśli chcę zachować swoje podwójne cudzysłowy, mam kilka opcji. Mógłbym użyć pojedynczych cudzysłowów wokół mojego ciągu:
'Hello "World."'
Lub mogę uciec od moich cytatów:
"Hello \"World.\""
Każdy cytat poprzedzony ukośnikiem jest pominięty i rozumiane jako część wartości ciągu.
Jeśli chodzi o zapytania, MySQL ma pewne słowa kluczowe, które obserwuje, a których nie możemy użyć w naszych zapytaniach bez powodowania zamieszania. Załóżmy, że mamy tabelę wartości, w której kolumna ma nazwę „Wybierz” i chcemy ją wybrać:
SELECT select FROM myTable
Wprowadziliśmy teraz do naszego zapytania pewną niejednoznaczność. W naszym zapytaniu możemy zmniejszyć tę niejednoznaczność, używając wstecznych znaczników:
SELECT `select` FROM myTable
Eliminuje to zamieszanie, które wprowadziliśmy, stosując złą ocenę sytuacji podczas wybierania nazw pól.
Wiele z tych rzeczy można załatwić, po prostu przekazując swoje wartości przez mysql_real_escape_string()
. W poniższym przykładzie widać, że przekazujemy dane przesłane przez użytkownika za pomocą tej funkcji, aby upewnić się, że nie spowoduje to żadnych problemów dla naszego zapytania:
// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
Istnieją inne metody ucieczki ciągów, takie jak add_slashes
, addcslashes
, quotemeta
i nie tylko, choć przekonasz się, że gdy celem jest uruchomienie bezpiecznego zapytania, większość programistów preferuje mysql_real_escape_string
lub pg_escape_string
(w kontekście PostgreSQL.