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');
// <script>alert(1)</script>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é</b> & "bar"';
// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
// htmlentities: also converts é → é
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
// Prefer htmlspecialchars — htmlentities can break UTF-8filter_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_.jpgRzutowanie 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()lubrawurlencode() - 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
- GET a POST: kiedy używać każdej metody
- Odczytywanie danych formularza za pomocą superglobalnych
- Techniki walidacji danych wejściowych
- Oczyszczanie danych wejściowych użytkownika