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)
- zagrożenia dla formularzy (np. SQL Injection, XSS);
- podszywanie się pod użytkownika (phishing, przejęcie sesji);
- konfiguracja zabezpieczeń serwera (HTTPS, aktualizacje, uprawnienia).
- 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”.
- Używam różnych haseł do różnych serwisów
- Mam włączone uwierzytelnianie dwuskładnikowe (2FA)
- Aktualizuję system i oprogramowanie
- Nie klikam podejrzanych linków z maili i komunikatorów
<!-- 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:
- Moduł 1 + 5: omówienie siły haseł i ataków brute‑force, uczniowie testują własne pomysły na hasła.
- Moduł 2 + 3: SQL Injection i wyciek danych – analiza „co poszło źle” i jak to naprawić w kodzie.
- Moduł 4: checklista na koniec – refleksja, co już robią dobrze, a co mogą poprawić.
- Na koniec: zachęć uczniów, żeby skopiowali fragmenty kodu „pokaż/ukryj” i wkleili je do swoich mini‑projektów WWW.