Ćwiczenie – Bezpieczeństwo danych i raporty w PHP (INF.03)

1. Filtrowanie i walidacja danych wejściowych

Cel: Uczeń potrafi filtrować dane wprowadzane przez użytkownika.
Opis: W PHP dane z formularzy mogą być niebezpieczne, dlatego należy je filtrować i sprawdzać zanim zostaną użyte.
<?php
$imie = filter_input(INPUT_POST, 'imie', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
$wiek = filter_input(INPUT_POST, 'wiek', FILTER_VALIDATE_INT);

if ($imie && $email && $wiek) {
    echo "✅ Dane poprawne!";
} else {
    echo "❌ Wprowadź poprawne dane!";
}
?>

<form method="POST">
Imię: <input type="text" name="imie"><br>
Email: <input type="email" name="email"><br>
Wiek: <input type="number" name="wiek"><br>
<button type="submit">Sprawdź dane</button>
</form>
  
Filtrowanie danych chroni aplikację przed niepoprawnym i szkodliwym wejściem.

2. Zabezpieczenie przed SQL Injection

Cel: Uczeń potrafi zabezpieczyć zapytania SQL przed wstrzyknięciem danych.
<?php
$conn = new mysqli("localhost", "root", "", "baza_bezpieczenstwo");

$stmt = $conn->prepare("INSERT INTO uzytkownicy (imie, email) VALUES (?, ?)");
$stmt->bind_param("ss", $imie, $email);

$imie = filter_input(INPUT_POST, 'imie', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
$stmt->execute();

echo "✅ Użytkownik został dodany bezpiecznie!";
?>
  
Przygotowane zapytania eliminują ryzyko SQL Injection.

3. Bezpieczne logowanie i haszowanie haseł

Cel: Uczeń potrafi bezpiecznie zapisywać i sprawdzać hasła użytkowników.
<?php
if (isset($_POST['register'])) {
    $login = $_POST['login'];
    $haslo = password_hash($_POST['haslo'], PASSWORD_DEFAULT);
    $conn->query("INSERT INTO loginy (login, haslo) VALUES ('$login', '$haslo')");
}

if (isset($_POST['login_submit'])) {
    $login = $_POST['login'];
    $haslo = $_POST['haslo'];
    $res = $conn->query("SELECT * FROM loginy WHERE login='$login'");
    $row = $res->fetch_assoc();
    if ($row && password_verify($haslo, $row['haslo'])) {
        echo "🔓 Zalogowano pomyślnie!";
    } else {
        echo "❌ Błędne dane logowania.";
    }
}
?>
  
Hasła nigdy nie powinny być przechowywane w formie jawnej!

4. Tworzenie dynamicznego raportu z filtrowaniem

Cel: Uczeń potrafi tworzyć raporty z możliwością wyszukiwania danych bezpiecznie.
<?php
$filter = filter_input(INPUT_GET, 'szukaj', FILTER_SANITIZE_STRING);

$sql = "SELECT * FROM uzytkownicy WHERE imie LIKE ?";
$stmt = $conn->prepare($sql);
$param = "%".$filter."%";
$stmt->bind_param("s", $param);
$stmt->execute();
$result = $stmt->get_result();

echo "<table class='effect-table'>";
echo "<tr><th>ID</th><th>Imię</th><th>Email</th></tr>";
while ($row = $result->fetch_assoc()) {
    echo "<tr><td>{$row['id']}</td><td>{$row['imie']}</td><td>{$row['email']}</td></tr>";
}
echo "</table>";
?>
<form method="GET">Szukaj: <input type="text" name="szukaj"><button type="submit">Filtruj</button></form>
  
IDImięEmail
1Janjan@wp.pl
2Agnieszkaaga@onet.pl

5. Prosty raport z tabeli produktów

Cel: Uczeń potrafi wygenerować raport z tabeli produktów w HTML.
<?php
$result = $conn->query("SELECT * FROM produkty");
echo "<table class='effect-table'><tr><th>ID</th><th>Nazwa</th><th>Cena</th></tr>";
while ($row = $result->fetch_assoc()) {
    echo "<tr><td>{$row['id']}</td><td>{$row['nazwa']}</td><td>{$row['cena']}</td></tr>";
}
echo "</table>";
?>
  

6. Raport z agregacją (SUMA i ŚREDNIA)

Cel: Uczeń potrafi tworzyć raporty z podsumowaniami.
<?php
$sql = "SELECT kategoria, COUNT(*) AS liczba, SUM(cena) AS suma, AVG(cena) AS srednia FROM produkty GROUP BY kategoria";
$result = $conn->query($sql);
echo "<table class='effect-table'><tr><th>Kategoria</th><th>Liczba</th><th>Suma</th><th>Średnia</th></tr>";
while ($row = $result->fetch_assoc()) {
    echo "<tr><td>{$row['kategoria']}</td><td>{$row['liczba']}</td><td>{$row['suma']}</td><td>{$row['srednia']}</td></tr>";
}
echo "</table>";
?>
  

7. Zadanie końcowe – Pełny raport

Po ukończeniu tego ćwiczenia uczeń potrafi tworzyć bezpieczne, dynamiczne raporty w PHP i MySQL.