Przejdź do treści
INF.03 · część pisemna

Programowanie po stronie serwera (PHP)

Przed Tobą 10 pytań w formule egzaminu CKE.

Pytanie 1 / 10Programowanie
Wyszukiwarka w sklepie ma pozwalać na przesłanie znajomemu linku z gotowymi wynikami, a osobny formularz logowania przesyła hasło. Jak poprawnie dobrać metody przesyłania danych?
Wszystkie 10 pytań z wyjaśnieniamiRozwiń, jeśli wolisz przejrzeć zestaw bez rozwiązywania testu.

Formularze GET i POST, sesje i ciasteczka, praca z bazą MySQL oraz bezpieczeństwo: SQL injection, XSS i hashowanie haseł.

1.Wyszukiwarka w sklepie ma pozwalać na przesłanie znajomemu linku z gotowymi wynikami, a osobny formularz logowania przesyła hasło. Jak poprawnie dobrać metody przesyłania danych?

  • A.Oba formularze metodą POST, ponieważ POST szyfruje przesyłane dane
  • B.Wyszukiwarka metodą POST, a formularz logowania metodą GET
  • C.Wyszukiwarka metodą GET, a formularz logowania metodą POST— poprawna
  • D.Oba formularze metodą GET, ponieważ tylko GET zapełnia tablicę superglobalną
Dlaczego: Metoda GET umieszcza parametry w adresie URL po znaku zapytania, więc adres z wynikami można skopiować, wysłać komuś i dodać do ulubionych. Metoda POST przenosi dane w treści żądania, dzięki czemu hasło nie trafia do paska adresu, historii przeglądarki ani logów serwera. Kusi odpowiedź o szyfrowaniu, ale POST niczego nie szyfruje - dane chroni dopiero HTTPS.

2.Aplikacja ma pamiętać fakt zalogowania użytkownika, a niezależnie od tego zapamiętać na 30 dni wybrany motyw kolorystyczny. Które stwierdzenie o sesji i ciasteczku jest prawdziwe?

  • A.Dane sesji leżą na serwerze, a przeglądarka dostaje tylko identyfikator sesji; dane ciasteczka leżą u klienta— poprawna
  • B.Dane sesji i dane ciasteczka leżą na serwerze, a różni je wyłącznie domyślny czas wygaśnięcia
  • C.Dane sesji trzyma przeglądarka użytkownika, a treść ciasteczka jest zapisywana w bazie danych serwera
  • D.Ciasteczko istnieje tylko do zamknięcia przeglądarki, a sesja żyje tak długo, jak ustawi to programista
Dlaczego: Protokół HTTP jest bezstanowy, więc serwer musi jakoś rozpoznać kolejne żądania tego samego użytkownika. Sesja przechowuje dane po stronie serwera, a przeglądarka otrzymuje wyłącznie identyfikator sesji. Ciasteczko przechowuje samą wartość u klienta, ma limit rzędu 4 kB i przetrwa zamknięcie przeglądarki. Ostatnia odpowiedź kusi, bo zamienia role obu mechanizmów miejscami.

3.Skrypt wylogowania czyści tablicę sesyjną, wywołuje funkcję session_destroy, a na końcu przekierowuje na stronę logowania. Skrypt zgłasza błąd, a sesja nie zostaje usunięta. Czego w nim brakuje?

  • A.Wywołania funkcji session_start na końcu pliku, już po zniszczeniu sesji
  • B.Wywołania funkcji session_start na samym początku pliku, przed jakimkolwiek wyjściem— poprawna
  • C.Wyczyszczenia tablicy superglobalnej _COOKIE bezpośrednio przed zniszczeniem sesji
  • D.Ustawienia kodowania utf8mb4 dla połączenia z bazą przed zniszczeniem sesji
Dlaczego: Aby zniszczyć sesję, trzeba ją najpierw wczytać - dopiero funkcja session_start udostępnia bieżącą sesję skryptowi. Musi ona wystąpić przed wysłaniem czegokolwiek do przeglądarki, bo operuje na nagłówkach HTTP; nawet pusta linia albo spacja przed znacznikiem otwierającym PHP daje komunikat headers already sent. Ta sama zasada dotyczy funkcji setcookie oraz header.

4.Skrypt logowania skleja treść zapytania SQL z tekstem wpisanym w pole formularza. Atakujący wpisuje w polu loginu apostrof, a po nim dwa myślniki. Na czym polega atak i co jest właściwą obroną?

  • A.Apostrof jest ignorowany przez serwer bazy, a wystarczy ograniczyć długość pola atrybutem maxlength
  • B.Wpisany ciąg przepełnia bufor zapytania, a wystarczy sprawdzać poprawność pól w JavaScripcie
  • C.Apostrof zamyka tekst w zapytaniu, myślniki komentują resztę warunku, a obroną jest ukrycie komunikatów
  • D.Apostrof zamyka tekst w zapytaniu, myślniki komentują warunek na hasło, a obroną jest zapytanie z parametrami— poprawna
Dlaczego: Dane od użytkownika sklejone z treścią zapytania stają się jego częścią, więc mogą zmienić strukturę warunku i pominąć sprawdzenie hasła. Zapytanie z parametrami działa dwuetapowo: najpierw do serwera bazy trafia szkielet ze znakami zapytania, potem osobno wartości, których serwer nigdy nie interpretuje jako kodu SQL. Walidacja w JavaScripcie i atrybut maxlength działają u klienta i da się je ominąć.

5.Aplikacja przechowuje konta użytkowników w bazie MySQL. Który sposób zapisu i późniejszego sprawdzania hasła jest poprawny?

  • A.Zapis skrótem md5, a przy logowaniu porównanie obu skrótów operatorem trzech znaków równości
  • B.Zapis funkcją password_hash, a przy logowaniu sprawdzenie funkcją password_verify— poprawna
  • C.Zapis jawny w kolumnie tekstowej, a przy logowaniu porównanie haseł w warunku WHERE zapytania
  • D.Zapis funkcją password_hash, a przy logowaniu porównanie wyniku ponownego hashowania z wartością z bazy
Dlaczego: Funkcja password_hash sama dokłada losową sól, więc to samo hasło daje za każdym razem inny skrót o długości około 60 znaków - dlatego ponowne zahashowanie i porównanie napisów zawsze zawiedzie, a sól z gotowego skrótu wyciąga dopiero funkcja password_verify. Skrót md5 jest szybki i łamany z gotowych tablic, więc nie nadaje się do haseł.

6.Użytkownik wpisał w polu komentarza tekst zawierający znacznik script z kodem JavaScript, a komentarz jest następnie wypisywany na stronie widocznej dla wszystkich. Co robi funkcja htmlspecialchars użyta przy wypisywaniu?

  • A.Zamienia znaki mniejszości, większości, cudzysłowu i ampersandu na encje, więc pokażą się jako tekst— poprawna
  • B.Usuwa z tekstu wszystkie znaczniki HTML i zostawia wyłącznie czystą treść wpisaną przez użytkownika
  • C.Blokuje zapis komentarza do bazy danych w momencie wykrycia w nim jakiegokolwiek kodu JavaScript
  • D.Dodaje znaki ucieczki przed apostrofami w tekście, dzięki czemu zapytanie SQL pozostaje bezpieczne
Dlaczego: Atak XSS polega na tym, że przeglądarka odbiera wstrzyknięty tekst jako kod i go wykonuje. Zamiana znaków specjalnych na encje sprawia, że przeglądarka traktuje je jako zwykłe znaki do wyświetlenia, a treść w bazie pozostaje nietknięta. Usuwanie znaczników to zadanie funkcji strip_tags, a ucieczka apostrofów w zapytaniu to real_escape_string - to inne narzędzia i inne zagrożenie.

7.Zmienna tekstowa przechowuje napis 3A;Nowak;Anna. Wywołano na nim funkcję explode z separatorem w postaci średnika. Co znajdzie się w elemencie o indeksie 1 powstałej tablicy i co zwróci dla niej funkcja count?

  • A.Element o indeksie 1 to 3A, a funkcja count zwróci wartość 3
  • B.Element o indeksie 1 to Nowak, a funkcja count zwróci wartość 2
  • C.Element o indeksie 1 to 3A, a funkcja count zwróci wartość 2
  • D.Element o indeksie 1 to Nowak, a funkcja count zwróci wartość 3— poprawna
Dlaczego: Funkcja explode dzieli napis w miejscach separatora i tworzy tablicę indeksowaną o kluczach liczonych od zera, więc pierwszy fragment ma indeks 0, a drugi indeks 1. Separator wystąpił dwa razy, co daje trzy fragmenty, a funkcja count podaje liczbę elementów, nie liczbę separatorów. Najczęstsza pomyłka to liczenie indeksów od jedynki.

8.Zapytanie SELECT do tabeli uczniowie zwróciło kilkanaście wierszy. Programista chce wypisać w tabeli HTML kolumnę imie z każdego wiersza. Które rozwiązanie jest poprawne?

  • A.Wywołać metodę fetch_assoc jeden raz i przejść pętlą foreach po zwróconej tablicy, bo ma ona komplet wierszy
  • B.Przejść pętlą foreach po obiekcie połączenia z bazą danych, bo przechowuje on wszystkie pobrane wiersze
  • C.Wywoływać metodę fetch_assoc w pętli while, bo każde wywołanie zwraca kolejny pojedynczy wiersz wyniku— poprawna
  • D.Odczytać właściwość num_rows i pętlą for wypisywać wiersze po numerze, bo fetch_assoc podaje tylko licznik
Dlaczego: Metoda fetch_assoc zwraca jeden wiersz jako tablicę asocjacyjną, w której kluczami są nazwy kolumn, i przesuwa wskaźnik na następny wiersz; gdy wierszy zabraknie, zwraca null i warunek pętli while staje się fałszywy. Pętla foreach ma sens dopiero na gotowej tablicy wierszy, a właściwość num_rows podaje wyłącznie ich liczbę.

9.Formularz wysłano metodą POST, ale pole tekstowe o nazwie nazwisko pozostało puste. Jakie wartości zwrócą funkcje isset oraz empty dla klucza nazwisko w tablicy superglobalnej _POST?

  • A.Funkcja isset zwróci fałsz i funkcja empty zwróci fałsz, bo puste pole nie tworzy w ogóle klucza
  • B.Funkcja isset zwróci prawdę, bo klucz istnieje, a funkcja empty zwróci prawdę, bo wartość jest pusta— poprawna
  • C.Funkcja isset zwróci prawdę, a funkcja empty zwróci fałsz, bo pusty napis nie jest uznawany za pustą wartość
  • D.Funkcja isset zwróci fałsz, a funkcja empty zwróci prawdę, bo obie sprawdzają wyłącznie samą wartość
Dlaczego: Puste pole formularza z atrybutem name i tak zostaje wysłane, tylko z pustym napisem jako wartością - dlatego klucz w tablicy istnieje. Funkcja isset odpowiada na pytanie, czy klucz istnieje i nie jest nullem, a funkcja empty na pytanie, czy wartość jest pusta. Uwaga na pułapkę: dla wpisanego ciągu 0 funkcja empty również zwraca prawdę, choć użytkownik coś podał.

10.Uczeń otwiera przez adres localhost stronę lista.php generującą tabelę z bazy danych, a następnie wybiera w przeglądarce opcję pokazania źródła strony. Nie widzi tam ani jednej linijki kodu PHP. Dlaczego?

  • A.Interpreter wykonał kod na serwerze i do przeglądarki wysłany został wyłącznie gotowy wynik w HTML— poprawna
  • B.Przeglądarka pobrała kod PHP razem ze stroną, ale celowo ukrywa go w oknie podglądu źródła
  • C.Serwer szyfruje kod PHP przy wysyłaniu, a odszyfrować da się go dopiero po zalogowaniu do panelu
  • D.Kod PHP wykonuje przeglądarka i zaraz po wykonaniu usuwa go z pamięci podręcznej dla oszczędności
Dlaczego: Serwer WWW po rozpoznaniu rozszerzenia pliku nie odsyła jego zawartości, tylko przekazuje ją interpreterowi PHP. Wynikiem wykonania jest czysty HTML i tylko on wędruje do klienta, więc kod nigdy nie opuszcza serwera. Na tym polega różnica względem JavaScriptu, który jest widoczny w źródle, bo wykonuje go przeglądarka użytkownika.