Repository navigation
Expand file tree
/
Copy path25.html
More file actions
256 lines (235 loc) · 12.4 KB
/
Copy path25.html
File metadata and controls
256 lines (235 loc) · 12.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="AnnaWiktoria">
<meta name="copyright" content="AnnaWiktoria">
<meta name="description" content="Interaktywny kurs bezpieczeństwa aplikacji webowych. Licencja CC BY-NC-SA.">
<meta http-equiv="Content-Security-Policy" content="default-src 'self';
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
font-src 'self' https://fonts.gstatic.com;
script-src 'self' 'unsafe-inline';
img-src 'self' data:;">
<title>Kurs bezpieczeństwa aplikacji webowych - Lekcja 25: Secure Architecture</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="style.css">
<style>
/* Akcent: Shield Cyan (Defense / Protection) */
:root {
--accent: #00bcd4;
--accent-glow: rgba(0, 188, 212, 0.3);
--good: #00e676;
--bad: #ff1744;
}
.header-name { color: #00bcd4; font-weight: bold; }
.header-value { color: #ccc; font-family: monospace; }
.secure-tag { background: rgba(0, 230, 118, 0.1); color: var(--good); padding: 2px 6px; border-radius: 4px; font-size: 0.8em; border: 1px solid var(--good); }
.insecure-tag { background: rgba(255, 23, 68, 0.1); color: var(--bad); padding: 2px 6px; border-radius: 4px; font-size: 0.8em; border: 1px solid var(--bad); }
</style>
</head>
<body>
<div class="container">
<header>
<h1>SECURE ARCHITECTURE</h1>
<p>MODUŁ 25: Defense in Depth, CSP Hardening i HSTS Preload</p>
</header>
<!-- 1. DEFENSE IN DEPTH -->
<section>
<h2>> OBRONA W GŁĄB (DEFENSE IN DEPTH)</h2>
<p>W Blue Teamie nie wierzymy w "srebrną kulę". Zakładamy, że jedna warstwa padnie (np. programista popełni błąd XSS). Musi być druga warstwa, która zablokuje skutki tego błędu.</p>
<div class="card">
<h3>ARCHITEKTURA WARSTWOWA</h3>
<ul>
<li><strong>Warstwa 1 (Kod):</strong> Walidacja danych i Sanityzacja (o tym w lekcji 26).</li>
<li><strong>Warstwa 2 (Nagłówki):</strong> CSP, HSTS - instrukcje dla przeglądarki.</li>
<li><strong>Warstwa 3 (Sieć):</strong> WAF (Web Application Firewall).</li>
</ul>
<p>Dziś zajmiemy się Warstwą 2 – czyli jak zmusić przeglądarkę, by broniła użytkownika.</p>
</div>
</section>
<!-- 2. CSP HARDENING -->
<section>
<h2>> CSP: JAK TO ZROBIĆ DOBRZE?</h2>
<p>Większość firm wdraża CSP źle (`unsafe-inline`). Jak wdrożyć CSP, które faktycznie blokuje XSS, a nie psuje strony?</p>
<div class="card">
<h3>ZŁOTE ZASADY CSP</h3>
<pre><code>Content-Security-Policy:
default-src 'none';
script-src 'self' https://trusted.com;
img-src 'self' data:;
object-src 'none';
base-uri 'none';</code></pre>
<ul>
<li><strong>default-src 'none':</strong> Domyślnie blokuj wszystko (Deny All). Odblokuj tylko to, co niezbędne.</li>
<li><strong>object-src 'none':</strong> Blokuje stare wtyczki (Flash/Java). Zawsze to ustawiaj.</li>
</ul>
</div>
<div class="card">
<h3>JAK ŻYĆ BEZ 'UNSAFE-INLINE'? (NONCE)</h3>
<p>Programiści narzekają: <em>"Muszę użyć `unsafe-inline`, bo mam kod JS wewnątrz HTML (`<script>var x=1</script>`)"</em>.</p>
<p><strong>Rozwiązanie (Nonce):</strong></p>
<ol>
<li>Serwer generuje losowy ciąg (nonce) przy każdym odświeżeniu: <code>nonce="R4nd0m"</code>.</li>
<li>Dodaje go do nagłówka: <code>script-src 'nonce-R4nd0m'</code>.</li>
<li>Dodaje go do tagu: <code><script nonce="R4nd0m">...</script></code>.</li>
</ol>
<p>Haker nie zna nonce'a, więc jego wstrzyknięty skrypt zostanie zablokowany!</p>
</div>
</section>
<!-- 3. HSTS & HTTPS -->
<section>
<h2>> HSTS PRELOAD</h2>
<p>Samo przekierowanie 301 z HTTP na HTTPS to za mało (podatne na SSL Stripping przy pierwszym wejściu).</p>
<div class="card">
<h3>HSTS NA STERYDACH</h3>
<p>Prawidłowy nagłówek produkcyjny:</p>
<pre><code>Strict-Transport-Security: max-age=63072000; includeSubDomains; preload</code></pre>
<ul>
<li><strong>max-age:</strong> Min. 1 rok (w sekundach).</li>
<li><strong>includeSubDomains:</strong> Chroni też <code>dev.firma.pl</code>.</li>
<li><strong>preload:</strong> Magiczne słowo. Pozwala wpisać domenę na <a href="https://hstspreload.org/" style="color:var(--accent)">listę hstspreload.org</a>.</li>
</ul>
<p><span class="secure-tag">EFEKT</span> Twoja domena jest "wbudowana" w Chrome/Firefoxa jako "Tylko HTTPS". Przeglądarka nigdy nie wyśle do niej pakietu bez szyfrowania.</p>
</div>
</section>
<!-- 4. NOWOCZESNE NAGŁÓWKI -->
<section>
<h2>> INNE TARCZE (HARDENING)</h2>
<div class="card">
<table>
<tr>
<th>Nagłówek</th>
<th>Co robi?</th>
</tr>
<tr>
<td><code>Permissions-Policy</code></td>
<td>Blokuje dostęp strony do kamery, mikrofonu, USB, geolokalizacji. <br><em>Np. `camera=()` (kamera wyłączona).</em></td>
</tr>
<tr>
<td><code>Referrer-Policy</code></td>
<td><code>strict-origin-when-cross-origin</code>. Chroni przed wyciekiem tokenów w URL do zewnętrznych stron analitycznych.</td>
</tr>
<tr>
<td><code>X-Content-Type-Options</code></td>
<td><code>nosniff</code>. Zapobiega traktowaniu plików tekstowych/obrazków jako skryptów JS.</td>
</tr>
</table>
</div>
</section>
<!-- CHECKLIST -->
<section>
<h2>BLUE TEAM CHECKLIST 🛡️</h2>
<div class="card checklist-card">
<div class="checklist-item">
<span class="check-icon">🛡️</span>
<div><strong>CSP Evaluator:</strong> Zawsze wrzuć nagłówek CSP do narzędzia Google CSP Evaluator. Powie Ci, czy Twoja polityka jest dziurawa.</div>
</div>
<div class="checklist-item">
<span class="check-icon">🛡️</span>
<div><strong>Cookie Flags:</strong> Czy WSZYSTKIE ciastka mają `Secure`, `HttpOnly` i `SameSite=Strict/Lax`?</div>
</div>
<div class="checklist-item">
<span class="check-icon">🛡️</span>
<div><strong>Usuwanie nagłówków:</strong> Usuń `Server: Apache` i `X-Powered-By: PHP`. Nie pomagaj atakującemu w rekonesansie.</div>
</div>
</div>
</section>
<!-- QUIZ -->
<section id="quiz-section">
<h2>🎓 WERYFIKACJA WIEDZY OBRONNEJ</h2>
<div id="quiz-container"></div>
</section>
<footer>
<p style="text-align: center; margin-top: 50px; color: #555;">© 2026 Hack & Learn: Web Edition | Moduł 25</p>
</footer>
</div>
<!-- DANE DO QUIZU -->
<script>
const quizData = [
{
question: "Co oznacza zasada 'Defense in Depth' (Obrona w głąb)?",
options: [
"Ukrywanie serwerów głęboko pod ziemią.",
"Stosowanie wielu warstw zabezpieczeń (kod, nagłówki, sieć), tak aby przełamanie jednej nie oznaczało kompromitacji całego systemu.",
"Używanie bardzo długich haseł.",
"Obrona tylko przed atakami Deep Web."
],
correct: 1,
explanation: "Nikt nie pisze kodu idealnego. Nagłówki (Warstwa 2) są po to, by ratować sytuację, gdy programista popełni błąd w kodzie (Warstwa 1)."
},
{
type: "scenario",
question: "Programista mówi: 'Nie mogę wdrożyć CSP, bo używam skryptów inline w HTML'. Jaką bezpieczną alternatywę dla 'unsafe-inline' mu zaproponujesz?",
options: [
"Rezygnację z CSP.",
"Użycie mechanizmu 'Nonce' (kryptograficznego, jednorazowego tokena) dodawanego do nagłówka CSP i tagów <script>.",
"Przeniesienie kodu do plików .txt.",
"Użycie 'unsafe-eval'."
],
correct: 1,
explanation: "Nonce to jednorazowa przepustka. Serwer mówi: 'Ufam temu konkretnemu blokowi kodu, bo ma właściwy identyfikator'. Haker nie zna identyfikatora, więc jego kod nie zadziała."
},
{
question: "Co daje flaga 'preload' w nagłówku HSTS?",
options: [
"Szybsze ładowanie strony.",
"Umożliwia wpisanie domeny na sztywną listę w przeglądarkach (HSTS Preload List). Dzięki temu nawet PIERWSZE połączenie użytkownika z domeną jest wymuszane po HTTPS.",
"Wstępne ładowanie obrazków.",
"Blokadę portu 80."
],
correct: 1,
explanation: "Bez preloadu, pierwsze połączenie (np. wpisanie 'bank.com' w pasek adresu) idzie po HTTP i jest podatne na atak SSL Strip. Preload eliminuje to ryzyko."
},
{
question: "Dlaczego nagłówek `X-Content-Type-Options: nosniff` jest ważny?",
options: [
"Zapobiega wąchaniu pakietów.",
"Zmusza przeglądarkę do ścisłego przestrzegania zadeklarowanego typu pliku (MIME type). Zapobiega to wykonaniu pliku `avatar.jpg` jako skryptu JS, jeśli serwer pomylił nagłówki.",
"Blokuje pobieranie plików.",
"Ukrywa rozszerzenia plików."
],
correct: 1,
explanation: "Przeglądarki lubią 'zgadywać' typ pliku (MIME Sniffing). Jeśli w pliku tekstowym znajdą HTML, mogą go wykonać. `nosniff` mówi: 'Nie zgaduj, ufaj serwerowi'."
},
{
question: "Co robi dyrektywa `object-src 'none'` w CSP?",
options: [
"Blokuje obiekty JSON.",
"Blokuje ładowanie wtyczek takich jak Flash, Java Applets czy ActiveX. To dobra praktyka hardeningu, bo te technologie są przestarzałe i niebezpieczne.",
"Blokuje programowanie obiektowe.",
"Blokuje tag <img>."
],
correct: 1,
explanation: "Nawet jeśli nie używasz Flasha, haker może spróbować go załadować, by wykorzystać luki w przeglądarce. Zablokowanie obiektów zamyka ten wektor ataku."
},
{
type: "scenario",
question: "Audytujesz stronę i widzisz nagłówek `Server: nginx/1.14.0 (Ubuntu)`. Jaką rekomendację wpiszesz do raportu (kategoria Hardening)?",
options: [
"Zaktualizować Ubuntu.",
"Skonfigurować serwer tak, aby ukrywał dokładną wersję oprogramowania (np. tylko `Server: nginx`). To utrudnia rekonesans (tzw. Server Banner Grabbing).",
"Zmienić serwer na Apache.",
"To nie jest błąd."
],
correct: 1,
explanation: "Zasada minimalizacji informacji. Jeśli haker wie, że masz wersję 1.14.0, od razu sprawdzi w Google: 'nginx 1.14.0 exploits'. Nie ułatwiaj mu zadania."
},
{
question: "Jaki nagłówek pozwala kontrolować dostęp strony do kamery i mikrofonu użytkownika?",
options: [
"Content-Security-Policy",
"Permissions-Policy (dawniej Feature-Policy)",
"X-Frame-Options",
"Access-Control-Allow-Media"
],
correct: 1,
explanation: "Ustawienie `Permissions-Policy: camera=(), microphone=()` gwarantuje, że nawet jeśli ktoś wstrzyknie złośliwy kod (XSS), nie będzie mógł podglądać użytkownika."
}
];
</script>
<script src="quiz.js"></script>
</body>
</html>