36 lines
1.5 KiB
Markdown
36 lines
1.5 KiB
Markdown
# Anket — canlı oylama
|
|||
|
|
|
||
|
|

|
||
|
|
|
||
|
|
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<Secenek>`) | `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` |
|
||
|
|
|
||
|
|

|
||
|
|
|
||
|
|
## 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`).
|