Dzień Bezpiecznego Internetu 2026

Inicjatywa klasy 4 – technik informatyk

cyberbezpieczeństwo bezpieczne programowanie API DBI 2026

1. Cel inicjatywy

Bezpieczeństwo w sieci zaczyna się już na etapie projektowania aplikacji, obsługi danych użytkowników oraz budowy API.

W ramach Dnia Bezpiecznego Internetu uczniowie nie tylko słuchają prelekcji, ale też testują ataki i zabezpieczenia w bezpiecznym CyberLabie, a następnie przenoszą dobre praktyki do własnych projektów WWW.

2. Zakres merytoryczny (toloki.pl)

Bezpieczeństwo stron
  • zagrożenia dla formularzy (np. SQL Injection, XSS);
  • podszywanie się pod użytkownika (phishing, przejęcie sesji);
  • konfiguracja zabezpieczeń serwera (HTTPS, aktualizacje, uprawnienia).
Bezpieczeństwo danych w PHP
  • walidacja i filtrowanie danych wejściowych;
  • bezpieczne sesje i przechowywanie haseł (hashowanie, salting);
  • wzorce bezpiecznego logowania i pracy z bazą danych.

Moduł 1 – Tester siły hasła

Instrukcja: wpisz przykładowe hasło tak, jak zwykle to robisz. Zwróć uwagę, jak zmienia się ocena po dodaniu wielkich liter, cyfr i znaków specjalnych.

Krok 1. Wpisz hasło

<!-- HTML -->
<input id="passwordInput" onkeyup="checkStrength()">
<div id="strengthBar"></div>
<p id="strengthText"></p>

<!-- JS -->
function checkStrength(){
    let pass = passwordInput.value;
    let strength = 0;

    if(pass.length > 8) strength++;
    if(/[A-Z]/.test(pass)) strength++;
    if(/[0-9]/.test(pass)) strength++;
    if(/[!@#$%^&*]/.test(pass)) strength++;

    let bar = document.getElementById("strengthBar");
    let text = document.getElementById("strengthText");

    let width = strength*25;
    bar.style.width = width+"%";

    if(strength==0){
        bar.style.background = "red";
        text.innerText = "";
        return;
    }
    if(strength==1){
        bar.style.background = "red";
        text.innerText="Słabe hasło";
    }
    if(strength==2){
        bar.style.background = "orange";
        text.innerText="Średnie hasło";
    }
    if(strength==3){
        bar.style.background = "#eab308";
        text.innerText="Dobre hasło";
    }
    if(strength==4){
        bar.style.background = "#22c55e";
        text.innerText="Bardzo silne hasło";
    }
}
  

Moduł 2 – Symulator SQL Injection

Instrukcja: w polu poniżej wpisz normalny login (np. admin), a potem spróbuj wprowadzić ciąg ' OR 1=1 --. Zobaczysz różnicę i komunikat o potencjalnym ataku.

Krok 1. Wpisz login

<!-- HTML -->
<input id="login">
<button onclick="unsafeLogin()">Testuj logowanie</button>
<p id="loginResult"></p>

<!-- JS -->
function unsafeLogin(){
    let login = document.getElementById("login").value;

    if(login.includes("' OR") || login.toLowerCase().includes("' or")){
        loginResult.innerHTML =
          "<div class='warning'>⚠ Wykryto SQL Injection – kod powinien używać zapytań parametryzowanych.</div>";
    }else{
        loginResult.innerText="Logowanie nieudane (symulacja).";
    }
}
  

Moduł 3 – Symulacja wycieku danych

Instrukcja: kliknij przycisk poniżej, aby zobaczyć, jak wygląda wyciek bazy, w której hasła zapisano w postaci jawnej (niezahashowanej).

<!-- HTML -->
<button onclick="dataLeak()">Uruchom symulację wycieku</button>
<div id="leakResult"></div>

<!-- JS -->
function dataLeak(){
    let users=["admin:1234","uczen:qwerty","teacher:haslo123"];
    leakResult.innerHTML="";

    users.forEach(u=>{
        let p=document.createElement("p");
        p.innerText=u;
        p.className="bad";
        leakResult.appendChild(p);
    });

    setTimeout(()=>{
        leakResult.innerHTML +=
          "<p class='good'>➡ Tak wygląda wyciek danych. Hasła powinny być hashowane (np. bcrypt).</p>";
    },1200);
}
  

Moduł 4 – Checklista bezpieczeństwa

Instrukcja: kliknij każde stwierdzenie, które dotyczy Ciebie. Na dole zobaczysz swój „poziom bezpieczeństwa”.

<!-- HTML -->
<ul class="checklist">
  <li onclick="toggleCheck(this)">Używam różnych haseł</li>
  <li onclick="toggleCheck(this)">Mam włączone 2FA</li>
  ...
</ul>
<p id="score"></p>

<!-- JS -->
function toggleCheck(el){
    el.classList.toggle("good");
    let done = document.querySelectorAll(".checklist .good").length;
    score.innerText = "Poziom bezpieczeństwa: "+done+"/4";
}
  

Moduł 5 – Brute‑Force Lab

Instrukcja: wybierz długość hasła i typ znaków, a skrypt policzy przybliżoną liczbę kombinacji oraz czas potrzebny na pełny atak brute‑force przy założeniu 1 mld prób na sekundę.

Zakres znaków w haśle:






<!-- HTML -->
<input id="bfLength" type="number" min="1" max="20" value="8">
<!-- radio buttons dla charset -->
<div id="bfResult"></div>

<!-- JS -->
function calcBruteforce() {
    const len = parseInt(document.getElementById("bfLength").value, 10);
    const radios = document.querySelectorAll('input[name="charset"]');
    let charsetSize = 26;

    radios.forEach(r => {
        if (r.checked) {
            switch (r.value) {
                case "lower": charsetSize = 26; break;
                case "lowernum": charsetSize = 36; break;
                case "mixednum": charsetSize = 62; break;
                case "full": charsetSize = 90; break;
            }
        }
    });

    if (isNaN(len) || len < 1) {
        bfResult.innerHTML =
            "<p class='bad'>Podaj poprawną długość hasła (co najmniej 1 znak).</p>";
        return;
    }

    const combinations = BigInt(charsetSize) ** BigInt(len);
    const triesPerSecond = 1_000_000_000n; 
    const seconds = combinations / triesPerSecond;

    function formatBigInt(n) {
        return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " ");
    }

    function secondsToHuman(secBig) {
        const cap = BigInt(Number.MAX_SAFE_INTEGER);
        const safe = secBig > cap ? cap : secBig;
        const sec = Number(safe);

        if (sec < 60) return sec + " s";
        const min = sec / 60;
        if (min < 60) return Math.round(min) + " min";
        const h = min / 60;
        if (h < 24) return Math.round(h) + " h";
        const d = h / 24;
        if (d < 365) return Math.round(d) + " dni";
        const y = d / 365;
        return Math.round(y) + " lat (lub więcej)";
    }

    let html = "";
    html += "<p>Rozmiar zbioru znaków: <strong>" + charsetSize + "</strong></p>";
    html += "<p>Liczba możliwych kombinacji: <strong>" + formatBigInt(combinations) + "</strong></p>";
    html += "<p>Przy 1 mld prób na sekundę teoretyczny czas pełnego brute‑force to około: ";
    html += "<strong>" + secondsToHuman(seconds) + "</strong>.</p>";

    if (len <= 6 && charsetSize <= 36) {
        html += "<p class='bad'>Takie hasło jest stosunkowo łatwe do złamania – zwiększ długość i dodaj znaki specjalne.</p>";
    } else {
        html += "<p class='good'>Dłuższe hasło z większym zestawem znaków jest znacznie trudniejsze do złamania.</p>";
    }

    bfResult.innerHTML = html;
}
  

6. Jak użyć tej strony na własnych zajęciach

Propozycja dla 2–3 godzin lekcyjnych: