# Güvenlik

Bot, sunucuda gerçek işler yapan bir hesaptır: mesaj siler, üye çıkarır, rol verir. Bu sayfa botunu ve ekli olduğu sunucuları nasıl koruyacağını anlatır.

## Token'ı güvende tut

Token, botun şifresidir. Onu bilen herkes senin botun adına, onun tüm izinleriyle iş yapabilir.

> **Uyarı:** Token'ı koda yazma, depoya gönderme, ekran görüntüsünde ve paylaşılan ekranda gösterme, hiç kimseyle paylaşma.

- **Ortam değişkeninde tut.** Kod `process.env.BOT_TOKEN` okusun; değer kodun dışında kalsın.
- **`.env` dosyasını depo dışında bırak.** Token'ı dosyada tutuyorsan bu dosyayı `.gitignore`'a ekle:

```bash
echo ".env" >> .gitignore
```

- **Tarayıcıya koyma.** Sayfa kodu, herkesin okuyabildiği koddur. Token yalnızca senin kontrol ettiğin bir sunucuda veya bilgisayarda çalışan programda dursun.
- **Günlüklere yazma.** İstekleri kaydediyorsan `Authorization` başlığını kaydetme. Gateway çerçevelerini kaydediyorsan `op 2` ve `op 6` çerçevelerini de: token onların içinde.
- **Her bot için ayrı uygulama aç.** Biri sızarsa diğerleri etkilenmez.

Token'la bir kişinin oturum token'ını da karıştırma. Portal rotaları kişi oturumu ister ve o oturum hesabının tamamına erişir; bir botun kodunda veya sunucusunda asla durmamalıdır.

## Token sızarsa

Token'ın başkasının eline geçtiğinden şüpheleniyorsan bekleme:

1. [Portalda](https://noluyo.net/gelistirici/uygulamalar) uygulamanı aç ve **Token'ı yenile**'ye bas. Eski token o anda çalışmayı bırakır.
2. Yeni token'ı programına koyup programı yeniden başlat.
3. Botun bulunduğu sunuculardaki denetim kaydına bak. Bot adına yapılmış, senin yapmadığın işlemleri sunucu yöneticilerine bildir.
4. Token bir depoya gittiyse dosyadan silmek yetmez, depo geçmişinde kalır. Bu yüzden önce token'ı yenile; asıl koruma odur.

Uygulamayı tamamen kaldırmak istersen uygulama sayfasında **Uygulamayı sil** var. Bot tüm sunuculardan çıkar ve token çalışmayı bırakır; gönderdiği mesajlar kalır.

## En az izinle çalış

Bota ihtiyacından fazla izin vermek, token sızdığında zararı büyütür. Bir hata da aynı şekilde daha çok şeyi bozabilir.

- **Yalnızca kullanacağı izinleri iste.** Ekleme bağlantısında yalnızca gereken kutuları işaretle. Her örnekte hangi iznin gerektiği [Örnekler](https://noluyo.net/gelistirici/ornekler.md) sayfasında yazıyor, her rotanınki de [REST referansında](https://noluyo.net/gelistirici/api.md).
- **`Administrator` isteme.** Bu izin her şeye izin verir ve kanal ayarlarından etkilenmez. Neredeyse hiçbir bot buna gerçekten ihtiyaç duymaz; ekleme sayfası da bunu kullanıcıya ayrıca uyarı olarak gösterir.
- **Botu yalnızca gereken kanallarda çalıştır.** Sunucu yöneticisi, kanal ayarlarıyla botun rolünün kanal iznini kaldırabilir.
- **Rolü gerektiği kadar yukarı taşı.** Bot, rolünün altındaki üyeler üzerinde işlem yapabilir. Rolü en üste koymak gereksiz yetki demektir.
- **Herkese açık seçeneğini gerekince aç.** Uygulama başlangıçta özeldir: botu yalnızca sen eklersin.

## Kullanıcı girdisine güvenme

Bot okuduğu her mesajı dışarıdan gelen veri olarak görmelidir.

- Mesajdaki metni kabuk komutu, SQL veya dosya adı içinde doğrudan kullanma.
- Kullanıcının yazdığını olduğu gibi tekrar eden bir botta dikkatli ol. Botun `MentionEveryone` izni varsa, tekrar ettiği `@everyone` gerçekten herkese bildirim gönderir. Bu izni yalnızca gerekirse ver.
- Yönetim işlemi yapan komutlarda, komutu yazan kişinin yetkisini de kontrol et. [Üyeyi getir](https://noluyo.net/gelistirici/api-members.md#getMember) rotası üyenin rollerini söyler; yetkisi olmayan birinin yazdığı `!ban` komutunu botun çalıştırmamalıdır.

## Basan kişinin yetkisini denetle

Sunucu, `INTERACTION_CREATE` ile gelen `custom_id`'nin mesajda gerçekten durduğunu doğrular; yani kimse botuna uydurma bir değer yollayamaz. Ama basan kişinin yetkisini denetlemez: kanalı gören herkes basabilir. Yönetim işi yapan bir butonda işi yapmadan önce `member.permissions`'a bak. Olaydaki `token` da gizlidir, log'a yazma. `custom_id`'ye ve bileşen yazılarına gizli bilgi koyma: kanalı gören herkesin istemcisine giderler. Örnek [Bileşenler](https://noluyo.net/gelistirici/bilesenler.md) sayfasında.

## Formlar

[Formda](https://noluyo.net/gelistirici/formlar.md) şifre, doğrulama kodu, kart bilgisi, kimlik numarası ya da token isteme; geliştirici koşulları bunu yasaklar ve böyle bir bot kapatılır. Kişi her formun altında "Bu form {bot} botuna gider. Şifreni ya da doğrulama kodunu asla yazma." satırını görür; bu satırı gizleyemez, değiştiremezsin. Yalnızca işin için gereken alanı sor ve gelen içeriği işin bitince saklama. Gönderilen formun alanlarını da kullanıcı girdisi say: sunucu uzunluğu ve menü değerlerini denetler, ama metnin ne dediğini denetlemez.

## Etkileşim adresi

Etkileşimleri [HTTP ile](https://noluyo.net/gelistirici/http-teslim.md) alıyorsan adresine gelen her isteğin imzasını, JSON'a çevirmeden önce ham gövde üzerinde doğrula ve tutmazsa `401` dön. 5 dakikadan eski zaman damgasını reddet ve aynı `id`'yi ikinci kez işleme. Adresi bilen herkes oraya istek yollayabilir; yalnızca imza N'oluyo'dan geldiğini kanıtlar. Adresin sorgu dizesi yalnızca sana görünür, ama gizli bir değeri yalnızca ona emanet etme.

## Hız sınırlarına saygı göster

Sınırların nasıl sayıldığı [Hız sınırları](https://noluyo.net/gelistirici/rate-limit.md) sayfasında. İyi davranan bir bot şunları yapar:

- **`429` gelince bekler.** Yanıttaki `retry_after` kadar bekleyip yeniden dener. Beklemeden denemek işe yaramaz ve bir sonraki maddeye götürür.
- **`401` gelince durur.** Token geçersizse tekrar denemek düzeltmez; programı durdurup token'a bak.
- **`403`'ü tekrar etmez.** İzin eksikse aynı istek yine reddedilir.
- **Kanalı boşuna okumaz.** Yeni mesajları [gateway](https://noluyo.net/gelistirici/gateway.md) anında haber verir, kanalı aralıklarla okumaya gerek yoktur. Geçmişi okurken tek istek 100 mesaj döndürebildiği için `after` ile yalnızca gerekenleri iste.
- **`4004` gelince yeniden bağlanmaz.** Kapanış kodu yeniden bağlanmanın işe yaramayacağını söylüyorsa döngüye girme; tablo [Gateway](https://noluyo.net/gelistirici/gateway.md) sayfasında.
- **Yükü yayar.** Çok kanala aynı anda mesaj göndereceksen araya küçük beklemeler koy. Tüm rotalarda bot başına saniyede 50 istek sınırı vardır.

> **Uyarı:** Bir IP adresinden gelen, `Bot` şemasını kullanan reddedilmiş istekler (`401`, `403`, `429`) sayılır. 10 dakikada 10000'e ulaşırsa o adresten gelen tüm bot istekleri, geçerli token'lar dahil, süre dolana kadar `403 temporarily_banned` ile reddedilir. Hata döngüsüne giren bir bot buna kolayca yol açar.

## Bu sayfayı yapay zekaya verirsen

> **İpucu:** Yapay zekaya kod yazdırırken veya hata ayıklatırken `.env` dosyanı, bot token'ını ya da OAuth2 `client_secret` değerini sohbete yapıştırma; kodun her gizli anahtarı ortam değişkeninden okumasını ve `.gitignore` içine `.env` eklemesini iste.

## Sırada ne var

- [Kimlik doğrulama](https://noluyo.net/gelistirici/kimlik.md): `Authorization: Bot <token>` ve başlık kuralları
- [HTTP ile teslim](https://noluyo.net/gelistirici/http-teslim.md): Ed25519 istek imzası doğrulama
- [Botu açık tut](https://noluyo.net/gelistirici/botu-acik-tut.md): Linux sunucuda `.env` izinlerini (`chmod 600`) ve `systemd` servisini yapılandırma
