# Anket — canlı oylama ![Anket](../../medya/anket.png) Tek soruluk canlı anket. Oylar SQLite'ta tutulur, aynı adresten ikinci oy **veritabanı kısıtıyla** engellenir, sonuç grafiği her istekte sunucuda KabaLang ile **SVG** olarak çizilir. ```bash kabalang calistir web/anket/anket.kbl # → http://127.0.0.1:8473 ``` ## Neyi gösteriyor | Konu | Nerede | |---|---| | `yapi Secenek` + tipli alanlar, yapı listesi döndüren fonksiyon (`-> liste`) | `secenekler` | | Gövdesiz form: oy kimliği yolda (`POST /oy/{id}`) | `oy_ver` | | POST → **303** → GET deseni (sayfa yenilenince oy tekrar gitmez) | `oy_ver` | | Aynı grafiği iki genişlikte üretmek (masaüstü / telefon) | `grafik_svg(liste, isaretli, gen)` | | Doğru içerik tipiyle tek başına SVG: `.tip("image/svg+xml")` | `/sonuc.svg` | | JSON'u SQLite'ın `json_object` işlevine kurdurmak | `/api/sonuclar` | ![Oy ekranı](../../medya/anket-oy.png) ## Güvenlik - **SQL enjeksiyonu:** seçenek kimliği ve istemci adresi sorguya `?` ile bağlanır. `/oy/1 OR 1=1` var olmayan bir seçenektir → 404. - **Çift oy:** `oy.adres` sütunu `UNIQUE`; denetim ile kayıt tek iş parçacıklı sunucuda sırayla koşar, yarış koşulu yoktur. - Sunucu yalnız `127.0.0.1`'i dinler. (Yerelde her istemci aynı adres olduğu için tarayıcı bir kez oy verebilir — anketi sıfırlamak için `anket.db`'yi silin.) Veritabanı yolu `ANKET_DB` ile değiştirilebilir (varsayılan `anket.db`).