Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Programowanie webowe Bazy danych Administracja serwerem i bezpieczeństwo PHP

Słowa kluczowe: Funkcja mysqli_connect() w PHP Funkcja mysqli_select_db() w PHP Funkcje w PHP mysqli_connect_errno() w PHP

Za pomocą której funkcji języka PHP można poprzedzić znaki specjalne w tekście $imie tak, aby bezpiecznie użyć go w zapytaniu SQL wysyłanym przez połączenie $polacz z bazą zwierzaki?

A.
$imie = mysqli_real_escape_string($polacz, $imie);
B.
$imie = server_escape_string($polacz, $imie);
C.
$imie = db_escape_string($polacz, $imie);
D.
$imie = sql_escape_string($polacz, $imie);
Funkcja mysqli_real_escape_string($polacz, $imie) jest właściwa, bo należy do rozszerzenia mysqli i służy do przygotowania tekstu tak, aby można go było bezpieczniej wstawić do zapytania SQL wykonywanego przez konkretne połączenie z bazą danych. Ważne jest właśnie to połączenie $polacz, bo sposób poprzedzania znaków specjalnych zależy między innymi od kodowania ustawionego dla połączenia, np. utf8mb4. Funkcja obsługuje znaki typu apostrof, cudzysłów, backslash czy znak NULL, które mogłyby popsuć składnię zapytania albo zostać wykorzystane przy SQL injection. W praktyce, jeśli użytkownik wpisze imię O'Brian, bez takiego zabezpieczenia zapytanie mogłoby się rozsypać. Po użyciu tej funkcji tekst da się poprawniej umieścić w SQL, oczywiście nadal w apostrofach, np. WHERE imie = '$imie'. Z mojego doświadczenia warto jednak pamiętać, że w nowych projektach lepszą dobrą praktyką są zapytania przygotowane, czyli prepared statements z bindowaniem parametrów. mysqli_real_escape_string jest poprawną odpowiedzią w tym pytaniu, ale nie jest magiczną tarczą na wszystko, szczególnie gdy ktoś źle buduje całe zapytanie.
W niepoprawnych wariantach problem polega głównie na tym, że wyglądają one podobnie do prawdziwej funkcji, ale nie są standardowymi funkcjami PHP używanymi z rozszerzeniem mysqli. Nazwy typu db_escape_string, sql_escape_string albo server_escape_string brzmią logicznie, bo sugerują uciekanie znaków dla bazy, SQL-a albo serwera, ale w typowym PHP takie funkcje nie istnieją. Gdyby użyć ich w kodzie, interpreter najczęściej zakończyłby działanie błędem w stylu undefined function, czyli funkcja niezdefiniowana. To jest dość częsta pułapka: ktoś zapamiętuje ogólną ideę, że trzeba coś escape'ować, ale nie pamięta konkretnej biblioteki i jej nazewnictwa. W PHP funkcje do obsługi MySQL zależą od użytego rozszerzenia. Dla mysqli poprawna jest mysqli_real_escape_string, a dla PDO zwykle stosuje się parametryzowane zapytania, a nie ręczne sklejanie tekstu. Trzeba też uważać na stare przykłady z internetu, bo dawne mysql_real_escape_string dotyczyło przestarzałego rozszerzenia mysql, usuniętego z nowszych wersji PHP. Samo dodanie słowa sql albo server w nazwie nie ma żadnego znaczenia technicznego. Bezpieczeństwo zapytań SQL opiera się na realnych mechanizmach biblioteki, poprawnym kodowaniu połączenia i najlepiej na prepared statements. Moim zdaniem to jedno z tych miejsc, gdzie dokładna nazwa funkcji naprawdę robi różnicę, bo literówka albo wymyślona funkcja nie zabezpieczy aplikacji, tylko ją po prostu zepsuje.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.