diff --git a/bank/Caddyfile b/bank/Caddyfile new file mode 100644 index 0000000..90e49e4 --- /dev/null +++ b/bank/Caddyfile @@ -0,0 +1,27 @@ +# Caddyfile za MiTM demo aplikacijo +# Za HTTPS demo z avtomatskimi SSL certifikati + +# HTTP verzija - za MiTM demo (paketi vidni v Wireshark) +:8080 { + reverse_proxy localhost:8081 + log { + output file /var/log/caddy/mitm-demo-http.log + format console + } +} + +# HTTPS verzija - za primerjavo (paketi šifrirani) +# OPOMBA: Za lokalno testiranje uporabite localhost namesto domene +localhost:8443 { + reverse_proxy localhost:8081 + tls internal # Uporabi Caddy-jeve self-signed certs za localhost + log { + output file /var/log/caddy/mitm-demo-https.log + format console + } +} + +# Za resnično domeno z Let's Encrypt certifikati: +# vasa-domena.com { +# reverse_proxy localhost:8081 +# } \ No newline at end of file diff --git a/bank/README.md b/bank/README.md new file mode 100644 index 0000000..0fdef01 --- /dev/null +++ b/bank/README.md @@ -0,0 +1,154 @@ +# 🏦 SecureBank Demo - MiTM Napadalna Aplikacija + +Preprosta Go spletna aplikacija za demonstracijo razlike med HTTP in HTTPS pri prenosu občutljivih podatkov (MiTM napadi). + +## 🎯 Namen aplikacije + +Ta aplikacija je namenjena **izobraževalnim** namenom za prikaz: +- Kako so podatki vidni v HTTP prometu +- Kako HTTPS ščiti podatke pred prisluškovalci +- Praktična uporaba Wireshark-a za analizo mrežnega prometa + +## 🚀 Hitri zagon + +### 1. Zaženite Go aplikacijo +```bash +go run main.go -port 8081 +``` + +### 2. Testiraj HTTP (nezaščiten) +Odprite brskalnik: `http://localhost:8081` + +### 3. Zagon s Caddy za HTTPS +```bash +# Namestite Caddy (če še ni nameščen) +# Na Ubuntu/Debian: +sudo apt install caddy + +# Na macOS: +brew install caddy + +# Zaženite Caddy z našo konfiguracijo +caddy run --config Caddyfile + +# Aplikacija bo dostopna na: +# HTTP: http://localhost:8080 (preko Caddy proxy) +# HTTPS: https://localhost:8443 (z avtomatskimi SSL certifikati) +``` + +## 🔍 MiTM Demo navodila + +### Korak 1: HTTP analiza +1. **Zaženite Wireshark** + ```bash + sudo wireshark + ``` + +2. **Nastavite filtre:** + - Vmesnik: `Loopback: lo` + - Filter: `http and tcp.port == 8080` + +3. **Testirajte prenose:** + - Prijavite se z: `admin` / `admin123` + - Opazujte pakete v Wireshark-u + +4. **Poiščite POST request:** + - Desni klik na paket → Follow → HTTP Stream + - Videli boste geslo v običajnem besedilu! + +### Korak 2: HTTPS primerjava +1. **Nastavite Wireshark filter:** + ``` + tcp.port == 8443 + ``` + +2. **Dostopajte do HTTPS verzije:** + ``` + https://localhost:8443 + ``` + +3. **Primerjajte pakete:** + - Videli boste samo TLS handshake + - Aplikacijski podatki so šifrirani + - Gesla niso več vidna! + +## 👤 Demo uporabniki + +| Uporabniško ime | Geslo | Opis | +|-----------------|----------|------| +| `admin` | `admin123` | Administrator | +| `janez` | `geslo123` | Običajen uporabnik | + +## 📂 Struktura projekta + +``` +server/ +├── main.go # Glavna Go aplikacija +├── Caddyfile # Caddy konfiguracija +├── templates/ # HTML predloge +│ ├── home.html +│ ├── login.html +│ ├── register.html +│ └── dashboard.html +└── static/ + └── style.css # CSS styling +``` + +## 🛠️ Comandni argumenti + +```bash +go run main.go -port 8081 # Nastavi drug port +``` + +## ⚠️ Varnostna opozorila + +**Ta aplikacija je namenoma NEZAŠČITENA in vsebuje varnostne luknje:** + +- ❌ Gesla se shranjujejo v običajnem besedilu +- ❌ Ni session managementa +- ❌ Ni CSRF zaščite +- ❌ Ni proper input validacije +- ❌ Ni rate limiting-a + +**NE UPORABLJAJTE V PRODUKCIJI!** To je samo demonstracijska aplikacija. + +## 🎓 Za prezetnje + +### Ključne točke za predstavo: +1. **HTTP telovi** - pokažite kako so gesla vidna +2. **TLS Encryption** - razložite razliko v Wireshark-u +3. **Headers analiza** - pokažite HTTP vs HTTPS headers +4. **Certificate validation** - pokažite browser warnings za self-signed certs + +### Dodatni filtri za Wireshark: +``` +# Samo POST requesti +http.request.method == POST + +# Form data +urlencoded-form + +# TLS paketi +tls +``` + +## 🔧 Troubleshooting + +**Problem:** Caddy se ne zažene +**Rešitev:** Preverite če port 8080/8443 ni že zaseden: +```bash +lsof -i :8080 +lsof -i :8443 +``` + +**Problem:** Browser SSL warning +**Rešitev:** To je normalno za self-signed certifikate. Kliknite "Advanced" → "Proceed to localhost" + +**Problem:** Wireshark ne vidi paketov +**Rešitev:** Poskusite filter `tcp.port == 8081` (direct Go app port) + +## 📚 Dodatni viri + +- [Caddy dokumentacija](https://caddyserver.com/docs/) +- [Wireshark User Guide](https://www.wireshark.org/docs/wsug_html_chunked/) +- [OWASP TLS Guidelines](https://owasp.org/www-project-cheat-sheets/cheatsheets/Transport_Layer_Protection_Cheat_Sheet.html) \ No newline at end of file diff --git a/bank/build.sh b/bank/build.sh new file mode 100644 index 0000000..ae91220 --- /dev/null +++ b/bank/build.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# SecureBank - Build Script +# Ustvari standalone izvršilne datoteke z vključenimi resources + +echo "🏗️ SecureBank - Build processo" +echo "================================" + +# Preveri če obstajajo potrebni direktoriji +if [ ! -d "templates" ] || [ ! -d "static" ]; then + echo "❌ Napaka: Manjkajo templates/ vagy static/ direktoriji!" + echo " Poženite script iz /bank direktorija" + exit 1 +fi + +# Ustvari build direktorij +mkdir -p dist + +echo "📦 Building za Linux (amd64)..." +GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o dist/securebank-linux ./ +echo "✅ Linux binary: dist/securebank-linux" + +echo "📦 Building za Windows (amd64)..." +GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o dist/securebank-windows.exe ./ +echo "✅ Windows binary: dist/securebank-windows.exe" + +echo "📦 Building za macOS (amd64)..." +GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o dist/securebank-macos ./ +echo "✅ macOS binary: dist/securebank-macos" + +echo "📦 Building za macOS (ARM64 - M1/M2)..." +GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w" -o dist/securebank-macos-arm64 ./ +echo "✅ macOS ARM binary: dist/securebank-macos-arm64" + +echo "" +echo "🎉 Build process končan!" +echo "" +echo "📁 Izvršilne datoteke v dist/ direktoriju:" +ls -la dist/ +echo "" +echo "🚀 Testiranje:" +echo " ./dist/securebank-linux -port 8080" +echo "" +echo "📋 Opozorilo:" +echo " - Vsi HTML, CSS in JS fajli so vključeni v binary" +echo " - Binary lahko kopirate kjerkoli - ne potrebuje dodatnih datotek" +echo " - Za deployment samo kopirajte binary datoteko" \ No newline at end of file diff --git a/bank/go.mod b/bank/go.mod new file mode 100644 index 0000000..aa87cb2 --- /dev/null +++ b/bank/go.mod @@ -0,0 +1,3 @@ +module secure-bank-demo + +go 1.25.5 diff --git a/bank/launch_browsers.sh b/bank/launch_browsers.sh new file mode 100644 index 0000000..9bdd37d --- /dev/null +++ b/bank/launch_browsers.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +echo "🌐 Starting browsers with HTTPS certificate bypass..." +echo "" + +# Chrome with certificate bypass +if command -v google-chrome &> /dev/null; then + echo "🔧 Starting Chrome with certificate bypass..." + google-chrome --ignore-certificate-errors-on-localhost https://localhost:8443 & + echo "✅ Chrome started" +elif command -v chromium &> /dev/null; then + echo "🔧 Starting Chromium with certificate bypass..." + chromium --ignore-certificate-errors-on-localhost https://localhost:8443 & + echo "✅ Chromium started" +fi + +# Firefox (will need manual exception) +if command -v firefox &> /dev/null; then + echo "🔧 Starting Firefox..." + firefox https://localhost:8443 & + echo "ℹ️ Firefox started - you'll need to accept the security exception manually" +fi + +echo "" +echo "📋 URLs for testing:" +echo " HTTP: http://localhost:8080" +echo " HTTPS: https://localhost:8443" +echo "" +echo "💡 For permanent setup, add security exceptions in browser settings" \ No newline at end of file diff --git a/bank/main.go b/bank/main.go new file mode 100644 index 0000000..c04fbba --- /dev/null +++ b/bank/main.go @@ -0,0 +1,213 @@ +package main + +import ( + "embed" + "flag" + "fmt" + "html/template" + "io/fs" + "log" + "net/http" + "sync" +) + +//go:embed templates/* +var templatesFS embed.FS + +//go:embed static/* +var staticFS embed.FS + +// User struktura za uporabniške podatke +type User struct { + ID int + Username string + Password string + Email string + FullName string +} + +// In-memory shranjevanje uporabnikov +var ( + users = make(map[string]*User) + usersMux = &sync.RWMutex{} + lastID = 0 +) + +// Template cache +var templates *template.Template + +func init() { + // Privzeti uporabniki + addUser("jnovak", "secure123", "janez.novak@securebank.si", "Janez Novak") + addUser("mpetric", "banking456", "maja.petric@securebank.si", "Maja Petrič") +} + +func addUser(username, password, email, fullName string) { + usersMux.Lock() + defer usersMux.Unlock() + lastID++ + users[username] = &User{ + ID: lastID, + Username: username, + Password: password, + Email: email, + FullName: fullName, + } +} + +func main() { + // Nastavimo port preko command line argumenta + var port = flag.String("port", "8080", "Port na katerem se bo zagnal server") + flag.Parse() + + // Naložimo HTML predloge iz embedded FS + var err error + templates, err = template.ParseFS(templatesFS, "templates/*.html") + if err != nil { + log.Fatal("Napaka pri nalaganju embedded predlog:", err) + } + + // Statične datoteke iz embedded FS + staticSubFS, err := fs.Sub(staticFS, "static") + if err != nil { + log.Fatal("Napaka pri ustvarjanju static subFS:", err) + } + http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.FS(staticSubFS)))) + + // Routes + http.HandleFunc("/", homeHandler) + http.HandleFunc("/register", registerHandler) + http.HandleFunc("/login", loginHandler) + http.HandleFunc("/dashboard", dashboardHandler) + http.HandleFunc("/logout", logoutHandler) + + // Zagon strežnika + fmt.Printf("🏦 SecureBank aplikacija (embedded build)\n") + fmt.Printf("Port: %s\n", *port) + fmt.Printf("HTTP: http://localhost:%s\n", *port) + fmt.Printf("📦 Vsi fajli so vključeni v binary!\n") + fmt.Println() + + serverAddr := ":" + *port + log.Fatal(http.ListenAndServe(serverAddr, nil)) +} + +func homeHandler(w http.ResponseWriter, r *http.Request) { + templates.ExecuteTemplate(w, "home.html", nil) +} + +func registerHandler(w http.ResponseWriter, r *http.Request) { + if r.Method == "GET" { + templates.ExecuteTemplate(w, "register.html", nil) + return + } + + if r.Method == "POST" { + username := r.FormValue("username") + password := r.FormValue("password") + email := r.FormValue("email") + fullName := r.FormValue("fullName") + + //Validacija + if username == "" || password == "" || email == "" || fullName == "" { + templates.ExecuteTemplate(w, "register.html", map[string]string{ + "Error": "Vsa polja so obvezna!", + }) + return + } + + // Preverimo če uporabnik že obstaja + usersMux.RLock() + _, exists := users[username] + usersMux.RUnlock() + + if exists { + templates.ExecuteTemplate(w, "register.html", map[string]string{ + "Error": "Uporabniško ime že obstaja!", + }) + return + } + + // Dodamo novega uporabnika + addUser(username, password, email, fullName) + + // Preusmeri na prijavo + http.Redirect(w, r, "/login?registered=1", http.StatusSeeOther) + return + } +} + +func loginHandler(w http.ResponseWriter, r *http.Request) { + if r.Method == "GET" { + data := map[string]string{} + if r.URL.Query().Get("registered") == "1" { + data["Success"] = "Registracija je bila uspešna! Sedaj se lahko prijavite." + } + templates.ExecuteTemplate(w, "login.html", data) + return + } + + if r.Method == "POST" { + username := r.FormValue("username") + password := r.FormValue("password") + + // Preverimo podatke + usersMux.RLock() + user, exists := users[username] + usersMux.RUnlock() + + if !exists || user.Password != password { + templates.ExecuteTemplate(w, "login.html", map[string]string{ + "Error": "Napačno uporabniško ime ali geslo!", + }) + return + } + + // Uspešna prijava - preusmeri na dashboard + // POZOR: Brez session management za demo! + http.Redirect(w, r, "/dashboard?user="+username, http.StatusSeeOther) + return + } +} + +func dashboardHandler(w http.ResponseWriter, r *http.Request) { + username := r.URL.Query().Get("user") + if username == "" { + http.Redirect(w, r, "/login", http.StatusSeeOther) + return + } + + usersMux.RLock() + user, exists := users[username] + usersMux.RUnlock() + + if !exists { + http.Redirect(w, r, "/login", http.StatusSeeOther) + return + } + + // Simuliramo "bančne" podatke + accounts := []map[string]interface{}{ + { + "Name": "Glavni račun", + "Number": "SI56 1234 5678 9012 345", + "Balance": "€2,456.78", + }, + { + "Name": "Varčevalni račun", + "Number": "SI56 1234 5678 9012 999", + "Balance": "€15,230.45", + }, + } + + data := map[string]interface{}{ + "User": user, + "Accounts": accounts, + } + + templates.ExecuteTemplate(w, "dashboard.html", data) +} + +func logoutHandler(w http.ResponseWriter, r *http.Request) { + http.Redirect(w, r, "/", http.StatusSeeOther) +} diff --git a/bank/securebank-embedded b/bank/securebank-embedded new file mode 100755 index 0000000..07fee85 Binary files /dev/null and b/bank/securebank-embedded differ diff --git a/bank/static/style.css b/bank/static/style.css new file mode 100644 index 0000000..6cbf187 --- /dev/null +++ b/bank/static/style.css @@ -0,0 +1,984 @@ +/* SecureBank - Professional CSS */ + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + min-height: 100vh; + color: #333; +} + +.container { + max-width: 1200px; + margin: 0 auto; + min-height: 100vh; + background: white; + box-shadow: 0 0 20px rgba(0,0,0,0.1); +} + +/* Header */ +.header { + background: linear-gradient(135deg, #2c3e50 0%, #3498db 100%); + color: white; + padding: 25px; + box-shadow: 0 4px 8px rgba(0,0,0,0.1); + display: flex; + justify-content: space-between; + align-items: center; +} + +.bank-logo h1 { + font-size: 2.5em; + margin-bottom: 5px; +} + +.tagline { + font-size: 1em; + opacity: 0.9; + font-style: italic; +} + +.user-info { + margin-top: 15px; + font-size: 1.1em; +} + +.logout-btn { + background: #e74c3c; + color: white; + padding: 5px 10px; + border-radius: 5px; + text-decoration: none; + margin-left: 10px; + font-size: 0.9em; +} + +.logout-btn:hover { + background: #c0392b; +} + +/* Main content */ +.main { + padding: 30px; +} + +/* Welcome page */ +.welcome-section { + display: grid; + grid-template-columns: 2fr 1fr; + gap: 40px; + margin: 40px 0; +} + +.welcome-content h2 { + color: #2c3e50; + margin-bottom: 20px; + font-size: 2.2em; +} + +.welcome-text { + font-size: 1.1em; + line-height: 1.6; + margin-bottom: 30px; + color: #555; +} + +.features { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 20px; + margin: 30px 0; +} + +.feature { + background: #f8f9fa; + padding: 20px; + border-radius: 10px; + text-align: center; + border-left: 4px solid #3498db; +} + +.feature h3 { + color: #2c3e50; + margin-bottom: 10px; +} + +/* Info sidebar */ +.info-sidebar { + background: #f8f9fa; + padding: 20px; + border-radius: 10px; +} + +.contact-info, +.security-notice { + background: white; + padding: 20px; + margin-bottom: 20px; + border-radius: 8px; + box-shadow: 0 2px 5px rgba(0,0,0,0.1); +} + +.contact-info h4, +.security-notice h4 { + color: #2c3e50; + margin-bottom: 15px; +} + +/* Action section */ +.action-section { + text-align: center; + margin: 40px 0; +} + +.action-section h3 { + color: #2c3e50; + margin-bottom: 20px; +} + +.action-buttons { + display: flex; + gap: 20px; + justify-content: center; + flex-wrap: wrap; +} + +/* Buttons */ +.btn { + padding: 12px 25px; + border: none; + border-radius: 8px; + text-decoration: none; + display: inline-block; + font-weight: bold; + cursor: pointer; + transition: all 0.3s ease; + font-size: 1.1em; +} + +.btn-primary { + background: #3498db; + color: white; +} + +.btn-primary:hover { + background: #2980b9; + transform: translateY(-2px); +} + +.btn-secondary { + background: #95a5a6; + color: white; +} + +.btn-secondary:hover { + background: #7f8c8d; + transform: translateY(-2px); +} + +.btn-outline { + background: transparent; + border: 2px solid #3498db; + color: #3498db; +} + +.btn-outline:hover { + background: #3498db; + color: white; +} + +/* Demo users */ +.demo-users { + background: #f8f9fa; + padding: 20px; + border-radius: 10px; + margin: 30px 0; +} + +.demo-users h3 { + margin-bottom: 15px; + color: #2c3e50; +} + +.user-list { + display: flex; + gap: 15px; + flex-wrap: wrap; +} + +.demo-user { + background: white; + padding: 10px 15px; + border-radius: 5px; + border: 1px solid #ddd; +} + +.demo-user code { + background: #e8f4f8; + color: #2980b9; + padding: 2px 6px; + border-radius: 3px; + font-family: 'Courier New', monospace; +} + +/* Wireshark info */ +.wireshark-info { + background: #e8f5e8; + border: 2px solid #27ae60; + padding: 20px; + border-radius: 10px; + margin: 30px 0; +} + +.wireshark-info h3 { + color: #27ae60; + margin-bottom: 15px; +} + +.wireshark-info ol { + margin-left: 20px; +} + +.wireshark-info li { + margin: 8px 0; +} + +.wireshark-info code { + background: #2c3e50; + color: #ecf0f1; + padding: 2px 6px; + border-radius: 3px; + font-family: 'Courier New', monospace; +} + +/* Form styling */ +.form-container { + max-width: 600px; + margin: 0 auto; +} + +.form-container h2 { + color: #2c3e50; + margin-bottom: 15px; + text-align: center; + font-size: 2em; +} + +.form-subtitle { + text-align: center; + color: #7f8c8d; + margin-bottom: 30px; + font-size: 1.1em; +} + +/* Dashboard specific styles */ +.quick-actions { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 20px; + margin: 30px 0; +} + +.action-card { + background: #f8f9fa; + padding: 25px; + border-radius: 10px; + text-align: center; + box-shadow: 0 2px 10px rgba(0,0,0,0.1); + transition: transform 0.3s ease; +} + +.action-card:hover { + transform: translateY(-5px); +} + +.action-card h3 { + color: #2c3e50; + margin-bottom: 10px; + font-size: 1.3em; +} + +.action-card p { + color: #7f8c8d; + margin-bottom: 20px; +} + +/* User info grid */ +.user-info-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 15px; +} + +.info-item { + display: flex; + justify-content: space-between; + padding: 10px 0; + border-bottom: 1px solid #ecf0f1; +} + +.info-item strong { + color: #2c3e50; +} + +/* Accounts grid */ +.accounts-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); + gap: 20px; + margin-top: 20px; +} + +.account-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 15px; +} + +.account-status { + background: #27ae60; + color: white; + padding: 4px 12px; + border-radius: 20px; + font-size: 0.8em; + font-weight: bold; +} + +.account-balance { + display: flex; + justify-content: space-between; + align-items: center; + margin: 15px 0; + padding: 15px; + background: #f8f9fa; + border-radius: 8px; +} + +.balance-amount { + font-size: 1.5em; + font-weight: bold; + color: #27ae60; +} + +.account-actions { + display: flex; + gap: 10px; +} + +/* Transactions */ +.transaction-list { + background: #f8f9fa; + border-radius: 10px; + padding: 20px; + margin: 20px 0; +} + +.transaction-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 15px 0; + border-bottom: 1px solid #e9ecef; +} + +.transaction-item:last-child { + border-bottom: none; +} + +.transaction-desc { + font-weight: bold; + color: #2c3e50; +} + +.transaction-date { + font-size: 0.9em; + color: #7f8c8d; +} + +.transaction-amount.positive { + color: #27ae60; + font-weight: bold; +} + +.transaction-amount.negative { + color: #e74c3c; + font-weight: bold; +} + +/* Notifications */ +.notification-item { + display: flex; + gap: 15px; + padding: 20px; + background: #e8f4f8; + border-radius: 10px; + border-left: 4px solid #3498db; + margin: 20px 0; +} + +.notification-icon { + font-size: 1.5em; +} + +.notification-content strong { + color: #2c3e50; + margin-bottom: 8px; + display: block; +} + +/* Demo accounts */ +.demo-accounts { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 15px; + margin: 20px 0; +} + +.demo-account { + background: #e8f4f8; + padding: 15px; + border-radius: 8px; + border-left: 4px solid #3498db; +} + +.demo-credential { + background: #2c3e50; + color: #ecf0f1; + padding: 2px 6px; + border-radius: 4px; + font-family: 'Courier New', monospace; + font-weight: bold; +} + +/* Security tips and info */ +.security-tips { + background: #fff3cd; + border: 1px solid #ffc107; + padding: 20px; + border-radius: 10px; + margin: 20px 0; +} + +.security-tips h3 { + color: #856404; + margin-bottom: 15px; +} + +.security-tips ul { + margin-left: 20px; +} + +.security-tips li { + margin: 8px 0; + color: #856404; +} + +.security-info { + background: #e8f5e8; + border: 2px solid #27ae60; + padding: 20px; + border-radius: 10px; + margin: 20px 0; +} + +.security-info h3 { + color: #27ae60; + margin-bottom: 15px; +} + +.security-info ul { + margin-left: 20px; +} + +.security-info li { + margin: 8px 0; +} + +/* Checkbox styling */ +.checkbox-container { + display: flex; + align-items: center; + cursor: pointer; + padding: 10px 0; +} + +.checkbox-container input[type="checkbox"] { + margin-right: 10px; +} + +.terms-section { + margin: 20px 0; +} + +.form-options { + display: flex; + justify-content: space-between; + align-items: center; + margin: 20px 0; +} + +.forgot-password { + color: #3498db; + text-decoration: none; + font-size: 0.9em; +} + +.forgot-password:hover { + text-decoration: underline; +} + +/* Alerts */ +.alert { + padding: 15px; + border-radius: 8px; + margin-bottom: 20px; + font-weight: bold; +} + +.alert-success { + background: #d4edda; + border: 1px solid #c3e6cb; + color: #155724; +} + +.alert-error { + background: #f8d7da; + border: 1px solid #f5c6cb; + color: #721c24; +} + +/* Security warnings */ +.security-warning { + background: #fff3cd; + border: 2px solid #ffc107; + padding: 20px; + border-radius: 10px; + margin: 20px 0; +} + +.security-warning.critical { + background: #f8d7da; + border-color: #e74c3c; + color: #721c24; +} + +.security-warning h3 { + margin-bottom: 10px; + color: inherit; +} + +.packet-info { + background: #2c3e50; + color: #ecf0f1; + padding: 15px; + border-radius: 5px; + margin-top: 15px; + font-family: 'Courier New', monospace; + font-size: 0.9em; +} + +.packet-info code { + display: block; + white-space: pre-line; +} + +/* Auth form */ +.auth-form { + background: #f8f9fa; + padding: 30px; + border-radius: 10px; + margin: 20px 0; +} + +.form-group { + margin-bottom: 20px; +} + +.form-group label { + display: block; + margin-bottom: 5px; + font-weight: bold; + color: #2c3e50; +} + +.form-group input { + width: 100%; + padding: 12px; + border: 2px solid #ddd; + border-radius: 5px; + font-size: 1em; +} + +.form-group input:focus { + border-color: #3498db; + outline: none; + box-shadow: 0 0 5px rgba(52, 152, 219, 0.3); +} + +.form-help { + display: block; + margin-top: 5px; + color: #e74c3c; + font-size: 0.9em; +} + +.form-footer { + text-align: center; + margin-top: 20px; +} + +.form-footer p { + margin: 10px 0; +} + +.form-footer a { + color: #3498db; + text-decoration: none; +} + +.form-footer a:hover { + text-decoration: underline; +} + +/* Demo credentials */ +.demo-credentials { + background: #e8f4f8; + padding: 20px; + border-radius: 10px; + margin: 20px 0; +} + +.demo-credentials h3 { + margin-bottom: 15px; + color: #2980b9; +} + +.cred-box { + background: white; + padding: 15px; + border-radius: 5px; + margin: 10px 0; + border-left: 4px solid #3498db; +} + +.cred-box code { + background: #e8f4f8; + color: #2980b9; + padding: 2px 6px; + border-radius: 3px; + font-family: 'Courier New', monospace; +} + +/* Wireshark instructions */ +.wireshark-instructions { + background: #f0f8ff; + border: 2px solid #5dade2; + padding: 20px; + border-radius: 10px; + margin: 20px 0; +} + +.wireshark-instructions h3 { + color: #2980b9; + margin-bottom: 15px; +} + +.wireshark-instructions ol { + margin-left: 20px; +} + +.wireshark-instructions code { + background: #2c3e50; + color: #ecf0f1; + padding: 2px 6px; + border-radius: 3px; + font-family: 'Courier New', monospace; +} + +.wireshark-tip { + background: #fff9c4; + border: 2px solid #f39c12; + padding: 20px; + border-radius: 10px; + margin: 20px 0; +} + +.wireshark-tip h3 { + color: #f39c12; + margin-bottom: 10px; +} + +/* Dashboard */ +.dashboard-container h2 { + color: #2c3e50; + margin-bottom: 25px; + text-align: center; +} + +.success-message { + background: #d4edda; + border: 2px solid #27ae60; + padding: 20px; + border-radius: 10px; + margin-bottom: 25px; +} + +.success-message h3 { + color: #27ae60; + margin-bottom: 10px; +} + +/* User details */ +.user-details { + margin: 30px 0; +} + +.user-details h3 { + color: #2c3e50; + margin-bottom: 15px; +} + +.user-card { + background: #f8f9fa; + padding: 20px; + border-radius: 10px; + border-left: 4px solid #3498db; +} + +.user-card p { + margin: 8px 0; +} + +.password-display { + background: #ffebee; + color: #e74c3c; + padding: 2px 6px; + border-radius: 3px; + font-family: 'Courier New', monospace; + font-weight: bold; +} + +/* Accounts */ +.accounts { + margin: 30px 0; +} + +.accounts h3 { + color: #2c3e50; + margin-bottom: 20px; +} + +.account-card { + background: white; + border: 1px solid #ddd; + border-radius: 10px; + padding: 20px; + margin: 15px 0; + box-shadow: 0 2px 5px rgba(0,0,0,0.1); +} + +.account-card h4 { + color: #2c3e50; + margin-bottom: 10px; +} + +.account-number { + color: #7f8c8d; + font-family: 'Courier New', monospace; +} + +.account-balance { + font-size: 1.2em; + margin-top: 10px; +} + +.account-balance strong { + color: #27ae60; +} + +/* Security analysis */ +.security-analysis { + margin: 30px 0; +} + +.security-analysis h3 { + color: #2c3e50; + margin-bottom: 20px; +} + +.analysis-points { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; +} + +.point { + padding: 20px; + border-radius: 10px; +} + +.point:first-child { + background: #ffebee; + border: 2px solid #e74c3c; +} + +.point:last-child { + background: #e8f5e8; + border: 2px solid #27ae60; +} + +.point h4 { + margin-bottom: 15px; +} + +.point ul { + margin-left: 20px; +} + +.point li { + margin: 8px 0; +} + +/* Demo actions */ +.demo-actions { + margin: 30px 0; + text-align: center; +} + +.demo-actions h3 { + color: #2c3e50; + margin-bottom: 20px; +} + +.action-list { + display: flex; + gap: 15px; + justify-content: center; + flex-wrap: wrap; +} + +/* HTTPS info */ +.https-info { + background: #e8f5e8; + border: 2px solid #27ae60; + padding: 20px; + border-radius: 10px; + margin: 30px 0; +} + +.https-info h3 { + color: #27ae60; + margin-bottom: 15px; +} + +.https-info code { + background: #2c3e50; + color: #ecf0f1; + padding: 4px 8px; + border-radius: 3px; + font-family: 'Courier New', monospace; + display: inline-block; + margin: 5px 0; +} + +.btn-outline:hover { + background: #3498db; + color: white; +} + +.btn-sm { + padding: 8px 16px; + font-size: 0.9em; +} + +/* Footer */ +.footer { + background: #2c3e50; + color: white; + text-align: center; + padding: 25px; + margin-top: auto; +} + +.footer-content p { + margin: 8px 0; +} + +.footer-content a { + color: #3498db; + text-decoration: none; +} + +.footer-content a:hover { + text-decoration: underline; +} + +.license { + font-size: 0.9em; + opacity: 0.8; +} + +/* Responsive design */ +@media (max-width: 768px) { + .header { + flex-direction: column; + text-align: center; + gap: 15px; + } + + .welcome-section { + grid-template-columns: 1fr; + } + + .features, + .quick-actions { + grid-template-columns: 1fr; + } + + .action-buttons, + .action-list { + flex-direction: column; + align-items: center; + } + + .user-list, + .demo-accounts { + grid-template-columns: 1fr; + } + + .analysis-points, + .protocol-info { + grid-template-columns: 1fr; + } + + .main { + padding: 20px; + } + + .accounts-grid { + grid-template-columns: 1fr; + } + + .form-options { + flex-direction: column; + gap: 15px; + align-items: flex-start; + } +} + +@media (max-width: 480px) { + .header h1 { + font-size: 2em; + } + + .demo-notice { + display: block; + margin-top: 10px; + } +} \ No newline at end of file diff --git a/bank/templates/dashboard.html b/bank/templates/dashboard.html new file mode 100644 index 0000000..1254c8e --- /dev/null +++ b/bank/templates/dashboard.html @@ -0,0 +1,140 @@ + + + + + + 🏦 SecureBank - Dashboard + + + +
+
+ + +
+ +
+
+

Pregled vaših računov

+ +
+
+

Nakazilo

+

Pošljite denar na drug račun

+ +
+
+

Izpisek

+

Prenesite mesečnji izpisek

+ +
+
+

Mobilno

+

Povežite z mobilno aplikacijo

+ +
+
+ +
+

Podatki o uporabniku

+
+ +
+
+ +
+

Vaši bančni računi

+
+ {{range .Accounts}} + + {{end}} +
+
+ +
+

Zadnje transakcije

+
+
+
+ Nakup - Mercator d.d. + 10.02.2026 +
+ -€24.50 +
+
+
+ Plača - Delodajalec d.o.o. + 01.02.2026 +
+ +€2,100.00 +
+
+
+ Prevzem gotovine - Bankomat + 28.01.2026 +
+ -€100.00 +
+
+ +
+ +
+

🔔 Obvestila

+
+ ℹ️ +
+ Varnostno posodobljeno +

Vaši podatki so zaščiteni z najnovejšimi varnostnimi protokoli.

+
+
+
+
+
+ + +
+ + \ No newline at end of file diff --git a/bank/templates/home.html b/bank/templates/home.html new file mode 100644 index 0000000..2ae38b2 --- /dev/null +++ b/bank/templates/home.html @@ -0,0 +1,72 @@ + + + + + + SecureBank - Varno spletno bančništvo + + + +
+
+ +
+ +
+
+
+

Dobrodošli v SecureBank

+

Vaš zaupanja vreden partner za varno spletno bančništvo. Z najsodobnejšimi varnostnimi tehnologijami ščitimo vaše finance 24/7.

+ +
+
+

Najvišja varnost

+

SSL šifriranje in večstopenjski sistem preverjanja

+
+
+

Enostavno upravljanje

+

Intuitivni vmesnik za upravljanje vseh vaših računov

+
+
+

Dostopnost 24/7

+

Bančništvo brez omejitev, kadarkoli in kjerkoli

+
+
+ +
+

Dostop do vašega računa

+ +
+
+ +
+
+

📞 Stik z nami

+

Brezplačna telefonska številka:
080 12 34

+

E-mail podpora:
podpora@securebank.si

+

Delovni čas:
Pon-Pet: 8:00-20:00
Sob: 9:00-13:00

+
+ +
+

Varnostno obvestilo

+

Nikoli ne delite svojih prijavnih podatkov z drugimi. SecureBank nikoli ne bo zahteval vaših podatkov preko e-maila ali telefona.

+
+
+
+
+ + +
+ + \ No newline at end of file diff --git a/bank/templates/login.html b/bank/templates/login.html new file mode 100644 index 0000000..f4d049a --- /dev/null +++ b/bank/templates/login.html @@ -0,0 +1,99 @@ + + + + + + SecureBank - Prijava + + + +
+
+ +
+ +
+
+

Prijava v vaš račun

+

Dobrodošli nazaj! Prijavite se za dostop do svojih financ.

+ + {{if .Success}} +
+ {{.Success}} +
+ {{end}} + + {{if .Error}} +
+ {{.Error}} +
+ {{end}} + +
+
+ + +
+ +
+ + +
+ +
+ + Pozabljeno geslo? +
+ + +
+ + + +
+

Hiter dostop za demo

+
+ + +
+
+ +
+

Varnostni nasveti

+
    +
  • Nikoli ne delite svojih prijavnih podatkov
  • +
  • Vedno se odjavite po končani uporabi
  • +
  • Uporabljajte močna, unikatna gesla
  • +
  • Preverite varno povezavo (HTTPS)
  • +
+
+
+
+ + +
+ + \ No newline at end of file diff --git a/bank/templates/register.html b/bank/templates/register.html new file mode 100644 index 0000000..e6300a1 --- /dev/null +++ b/bank/templates/register.html @@ -0,0 +1,88 @@ + + + + + + SecureBank - Registracija + + + +
+
+ +
+ +
+
+

Registracija novega uporabnika

+

Ustvarite vaš SecureBank račun v nekaj korakih

+ + {{if .Error}} +
+ {{.Error}} +
+ {{end}} + +
+
+ + +
+ +
+ + + Izbrite unikatno uporabniško ime za prijavo +
+ +
+ + +
+ +
+ + + Uporabite močno geslo z vsaj 8 znaki +
+ +
+ +
+ + +
+ + + +
+

Varnost vaših podatkov

+
    +
  • SSL šifriranje za varno komunikacijo
  • +
  • Večstopenjski sistem preverjanja
  • +
  • Redna varnostna posodobitev
  • +
  • 24/7 nadzor nad sumljivimi aktivnostmi
  • +
+
+
+
+ + +
+ + \ No newline at end of file