0Pricing
PHP Academy · Lekcja

Oczyszczanie danych wejściowych użytkownika

Usuwaj niebezpieczne znaki za pomocą htmlspecialchars i filter_input

Oczyszczanie danych wejściowych użytkownika to bezpłatna lekcja PHP Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej PHP Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs PHP Academy zawiera 4 lekcji w sumie.

Sanityzacja a walidacja

Walidacja sprawdza, czy dane spełniają wymagania, i odrzuca je, jeśli tak nie jest.
Sanityzacja oczyszcza dane, usuwając niebezpieczne znaki lub kodując je, aby można było bezpiecznie ich użyć.

Potrzebne są oba mechanizmy — najpierw należy walidować dane, a następnie wykonać sanityzację na potrzeby danych wyjściowych.

htmlspecialchars() na potrzeby danych HTML

Przed wstawieniem danych do kodu HTML należy zawsze zabezpieczyć dane wyjściowe, aby zapobiec atakom XSS:

<?php
$name = '<script>alert(1)</script>';

// Dangerous — executes script:
// echo $name;

// Safe:
echo htmlspecialchars($name, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// &lt;script&gt;alert(1)&lt;/script&gt;

htmlentities() a htmlspecialchars()

Obie funkcje zabezpieczają kod HTML, ale htmlentities konwertuje WSZYSTKIE odpowiednie znaki, natomiast htmlspecialchars konwertuje tylko pięć najbardziej niebezpiecznych:

<?php
$str = '<b>caf&eacute;</b> & "bar"';

// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');

// htmlentities: also converts é → &eacute;
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
// Prefer htmlspecialchars — htmlentities can break UTF-8

filter_var FILTER_SANITIZE_*

Tryby sanityzacji filter_var usuwają niebezpieczną zawartość:

<?php
$rawEmail = 'user(bad)@exam<ple.com';
$clean = filter_var($rawEmail, FILTER_SANITIZE_EMAIL);
echo $clean; // user@example.com

$rawUrl = 'http://exa mple.com/pa th?q=foo bar';
$cleanUrl = filter_var($rawUrl, FILTER_SANITIZE_URL);
echo $cleanUrl;

strip_tags()

Należy usunąć znaczniki HTML z ciągu znaków, opcjonalnie zachowując dozwolone znaczniki:

<?php
$input = '<p>Hello <b>World</b> <script>alert(1)</script></p>';

// Remove all tags:
echo strip_tags($input);
// Hello World alert(1)

// Keep only <b> and <i>:
echo strip_tags($input, '<b><i>');
// Hello <b>World</b>

Sanityzacja danych na potrzeby SQL

Nigdy nie należy sanityzować zapytań SQL za pomocą funkcji do operowania na ciągach znaków — zawsze należy używać instrukcji przygotowanych. Prawidłowe podejście:

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');

// WRONG — even with addslashes this is dangerous:
// $sql = "SELECT * FROM users WHERE email = '" . addslashes($email) . "'";

// CORRECT — prepared statement:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();

addslashes() a instrukcje przygotowane

addslashes() zabezpiecza odwrotne ukośniki i cudzysłowy, ale NIE jest bezpieczna w przypadku SQL. Zamiast niej należy używać instrukcji przygotowanych PDO. addslashes() może być nadal przydatna poza SQL, na przykład podczas generowania ciągów znaków JavaScript:

<?php
// For embedding PHP string into JavaScript (still escape via json_encode):
$jsData = json_encode(['name' => $userInput], JSON_HEX_QUOT);
echo "<script>var data = $jsData;</script>";

Sanityzacja nazw plików

Należy usunąć niebezpieczne znaki z nazw przesyłanych plików:

<?php
function sanitizeFilename(string $name): string {
    // Remove path traversal chars and other dangerous ones
    $name = basename($name);                          // strip any path
    $name = preg_replace('/[^a-zA-Z0-9._-]/', '_', $name); // only safe chars
    $name = preg_replace('/_{2,}/', '_', $name);      // collapse underscores
    return strtolower($name);
}

echo sanitizeFilename('../../../etc/passwd');   // etc_passwd
echo sanitizeFilename('My Photo (1).JPG');      // my_photo_1_.jpg

Rzutowanie identyfikatorów na typ całkowity

Najprostszy sposób sanityzacji liczbowych identyfikatorów — należy rzutować je na int, co odrzuca całą zawartość nienumeryczną:

<?php
// Never do this:
$id = $_GET['id'];
$sql = "SELECT * FROM posts WHERE id = $id";

// Safe approach 1: cast to int
$id = (int) ($_GET['id'] ?? 0);
if ($id <= 0) die('Invalid ID');

// Safe approach 2: validate
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if (!$id) die('Invalid ID');

Znaczenie kontekstu danych wyjściowych

Różne konteksty danych wyjściowych wymagają różnych metod zabezpieczania:

  • treść HTML → htmlspecialchars()
  • atrybut HTML → htmlspecialchars(ENT_QUOTES)
  • JSON/JavaScript → json_encode()
  • parametr URL → urlencode()
  • SQL → instrukcje przygotowane

urlencode i rawurlencode

Wartości przeznaczone do użycia w adresach URL należy kodować:

<?php
$search = 'hello world & PHP';

echo urlencode($search);
// hello+world+%26+PHP  (+ for spaces)

echo rawurlencode($search);
// hello%20world%20%26%20PHP  (RFC 3986 — use in paths)

$url = 'https://example.com/search?q=' . urlencode($search);
echo $url;

Szybkie sprawdzenie

Jaki jest prawidłowy sposób zapobiegania wstrzykiwaniu SQL podczas używania danych użytkownika w zapytaniu do bazy danych?

Podsumowanie: sanityzacja danych wejściowych

Zasady sanityzacji:

  • kod HTML → htmlspecialchars(ENT_QUOTES, 'UTF-8')
  • SQL → instrukcje przygotowane, nigdy ucieczka znaków za pomocą funkcji do operowania na ciągach
  • adresy URL → urlencode() lub rawurlencode()
  • nazwy plików → usuwanie za pomocą wyrażenia regularnego, używanie basename()
  • identyfikatory całkowite → rzutowanie za pomocą (int)
  • znaczniki → strip_tags() do filtrowania dozwolonych znaczników

Często zadawane pytania

Czy lekcja „Oczyszczanie danych wejściowych użytkownika” jest bezpłatna?

Tak — pełny tekst „Oczyszczanie danych wejściowych użytkownika” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu PHP Academy, przejdź na CoddyKit PRO. Kurs PHP Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Oczyszczanie danych wejściowych użytkownika”?

Usuwaj niebezpieczne znaki za pomocą htmlspecialchars i filter_input Ćwiczysz PHP Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć PHP Academy?

Nie wymagamy żadnego doświadczenia. PHP Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Oczyszczanie danych wejściowych użytkownika”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji PHP Academy?

Tak. Każda lekcja PHP Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. GET a POST: kiedy używać każdej metody
  2. Odczytywanie danych formularza za pomocą superglobalnych
  3. Techniki walidacji danych wejściowych
  4. Oczyszczanie danych wejściowych użytkownika
← Powrót do PHP Academy