Güvenlik9 dk okuma

Telegram Bot Güvenliği En İyi Uygulamaları

Bot token'ı, herkesin her yerden kullanabileceği, ikinci bir doğrulama adımı ya da giriş uyarısı olmayan bir şifredir. Çoğu Telegram bot olayı buradan başlar. İşte genellikle ters giden sıraya göre neyi kilit altına almanız gerektiği.

1. Token'ı canlı bir kimlik bilgisi olarak ele alın

Bot token'ınıza sahip olan kişi botu tamamen kontrol eder. Gelen mesajları okuyabilir, sizin adınıza mesaj gönderebilir ve webhook'unuzu değiştirerek kendi sunucunuzun güncellemeleri almasını engelleyebilir. Burada şifre sorma ekranı ya da cihaz onayı gibi bir engel yoktur.

Token'lar nerede sızar

  • Bir repository'e commit edilir. En yaygın yol budur ve herkese açık repolar, sizin olmayan botlar tarafından sürekli taranır.
  • Bir destek sohbetine veya bir issue tracker'a yapıştırılır. Bir talebe girdiği anda bir yerlerdeki arama indeksine de girer.
  • Bir mobil veya ön yüz derlemesine sabit kodlanır. Bir istemci cihaza gönderilen her şey herkese açıktır.
  • Loglarda bırakılır. Tam API URL'sini loglarsanız, token URL'nin içindedir.

Bunun yerine ne yapmalı

  • Token'ı kaynak kodda değil, bir ortam değişkeninde veya bir secrets manager'da tutun.
  • İlk commit'ten önce, sonra değil, .env dosyasını .gitignore'a ekleyin.
  • Log çıktısında token'ı gizleyin.
  • Geliştirme ve production için ayrı token'lar kullanın, böylece sızan bir test token'ı gerçek kullanıcılara dokunamaz.

Bir token sızarsa, iptal edin

BotFather'ı açın, /revoke komutunu çalıştırın ve botu seçin. Eski token anında çalışmayı durdurur ve size yeni bir tane verilir. Token'ı yenilemek birkaç dakikalık kesintiye mal olur. Onu bırakmak ise botun kendisine mal olur. Git geçmişini yeniden yazmak işe yaramaz, çünkü token zaten kopyalanmıştır.

2. Webhook'u sıkılaştırın

Botunuz bir webhook kullanıyorsa, bu URL internet üzerinde açık bir uç noktadır. Onu bulan herkes, gerçek Telegram trafiğiyle birebir aynı görünen sahte güncellemeler gönderebilir.

  • Bir secret token belirleyin. setWebhook metodu bir secret_token parametresi kabul eder. Telegram daha sonra bunu her istekte X-Telegram-Bot-Api-Secret-Token başlığında geri gönderir. Eşleşmeyen her şeyi reddedin.
  • HTTPS'i geçerli bir sertifikayla kullanın. Telegram bunu zorunlu kılar, ayrıca içeriğin aktarım sırasında okunabilir olmasını engeller.
  • Tahmin edilemeyen bir yol kullanın. URL'deki rastgele bir segment tek başına gerçek bir güvenlik önlemi değildir, ama sizi fırsatçı taramaların dışına çıkarır.
  • Aldığınızı sınırlayın. allowed_updates parametresi yalnızca işlediğiniz güncelleme türlerine abone olmanızı sağlar. Daha az yüzey, daha az ayrıştırma.
  • Hızlı yanıt verin. İsteği onaylayın, ardından işi asenkron olarak yapın. Yavaş webhook handler'ları, gerçekleşmeyi bekleyen bir hizmet reddi saldırısıdır.

3. Bir güncellemenin içeriğine asla güvenmeyin

Bir güncellemenin içindeki her şey bir kullanıcı tarafından yazılmıştır. Görünen ad, mesaj metni, bir buton basmasındaki callback verisi. Bunların hepsi saldırgan tarafından kontrol edilebilen girdidir.

  • Callback verisini sunucu tarafında doğrulayın. order_id=123 taşıyan bir buton, order_id=124 ile tekrar oynatılabilir. Basan kullanıcının kaydın sahibi olduğunu kontrol edin.
  • Kullanıcı metnini yansıtmadan önce escape edin. Mesajları HTML veya Markdown modunda gönderiyor ve bir görünen adı doğrudan yapıştırıyorsanız, özenle hazırlanmış bir isim biçimlendirmenizi bozabilir veya bir bağlantı enjekte edebilir.
  • Veritabanı sorgularını parametreleştirin. Sohbet girdisinin bir sorgu dizesine ulaşması, bir web formuyla aynı enjeksiyon riskini taşır.
  • Kabul ettiğiniz boyutları sınırlayın. Herhangi bir şeyi işlemeden önce metin uzunluğu ve dosya boyutu için sınırlar belirleyin.

4. Yönetici komutlarını sıkı tutun

Neredeyse her bot bir yönetici komutu edinir. Broadcast, iade, kullanıcı dışa aktarma. Çalışan bir botun bir olaya dönüştüğü nokta burasıdır.

  • Sunucuda, konfigürasyonda tutulan bir kullanıcı ID allowlist'i kontrol edin. Yönetici durumunu asla bir kullanıcı adından çıkarmayın, çünkü kullanıcı adı değiştirilip yeniden kullanılabilir.
  • Gizlemeyin, doğrulayın. Belgelenmemiş bir komut, birisi onu denediği anda keşfedilir. Belirsizlik bir kontrol değildir.
  • Yıkıcı eylemleri ikinci bir adımla onaylatın ve ne olacağını onay metnine dahil edin.
  • Yönetici eylemlerini kullanıcı ID'si ve zaman damgasıyla loglayın, böylece sonradan "o broadcast'i kim gönderdi" sorusunu yanıtlayabilirsiniz.

5. Gruplarda gizlilik modunu açın

Varsayılan olarak bir gruba eklenen bot, yalnızca komut olan mesajları, kendi mesajlarına gelen yanıtları veya kendisinden bahsedilen mesajları alır. Bu varsayılana gizlilik modu denir ve iyi bir nedenle vardır.

BotFather'da /setprivacy ile bunu kapatabilirsiniz, böylece bot gruptaki her mesajı görür. Bunu yalnızca bir özellik gerçekten gerektiriyorsa yapın. Kapatıldığında, sunucunuz başkalarının konuşmalarını depolamaya başlar ve artık bu sorumluluk sizindir.

6. Kendinizi ve kullanıcılarınızı hız sınırlayın

Telegram kendi sınırlarını uygular ve bunlara çarpmak sizi kısıtlanmış veya geçici olarak engellenmiş hale getirir. Telegram'ın genel önerisi, farklı sohbetler genelinde saniyede kabaca 30 mesaj ve aynı gruba dakikada yaklaşık 20 mesajdır. Bunları hedef değil, rahatça altında kalınması gereken tavan değerler olarak değerlendirin.

  • Giden mesajları sıkı bir döngüde göndermek yerine kuyruğa alın.
  • 429 yanıtı geldiğinde hemen yeniden denemek yerine retry-after değerine uyun.
  • Kullanıcı başına da kısıtlayın. Tek bir kişinin bir komutu spamlaması, maliyetlerinizi artırmasına veya kotanızı tüketmesine izin vermemeli.
  • Maliyetli her şeye bir bekleme süresi koyun, örneğin ücretli bir yapay zeka modeline yapılan çağrılar veya bir görsel üretim adımı gibi.

7. Daha az kullanıcı verisi toplayın

En güvenli kayıt, hiç saklamadığınız kayıttır. Botlar varsayılan olarak sohbet ID'leri, isimler, telefon numaraları ve mesaj içeriği biriktirir ve bunların çoğu hiç kullanılmaz.

  • Sohbet ID'sini ve gerçekten ihtiyacınız olanı saklayın. Gerisini atlayın.
  • Somut bir gerekçeniz ve bir saklama süreniz olmadıkça tam mesaj gövdelerini loglamayın.
  • Bir saklama süresi belirleyin ve zamanlamaya göre silin.
  • Hassas alanları depoda şifreleyin ve veritabanını kimlerin sorgulayabileceğini kısıtlayın.
  • Silme taleplerini destekleyin. GDPR ve benzeri kanunlar kapsamında bir kullanıcı, verisinin kaldırılmasını isteyebilir ve bunu yapacak bir yolunuz olması gerekir.
  • Ne topladığınızı botun bağlantı verebileceği bir gizlilik politikasında belirtin.

Not: telefon numaraları size yalnızca kullanıcı bir iletişim bilgisi paylaşma butonuna dokunursa ulaşır. İhtiyacınız olmayan birini istemek hem bir dönüşüm maliyeti hem de bir sorumluluktur.

8. Web App ve Login Widget verisini doğrulayın

Botunuz bir Telegram Web App açıyorsa veya bir web sitesinde Login Widget kullanıyorsanız, kullanıcı verisi bir hash ile gelir. Tek bir alana bile güvenmeden önce bu hash'i sunucunuzda, bot token'ınızı kullanarak doğrulayın. Bu kontrolü atlamak, isteği düzenleyerek herkesin herhangi bir kullanıcı olduğunu iddia edebileceği anlamına gelir.

9. Sıradan şeyleri de gözden kaçırmayın

  • Bağımlılıkları güncelleyin. Gerçek güvenlik ihlallerinin çoğu Telegram üzerinden değil, bir kütüphane üzerinden gelir.
  • Kimlerin deploy edebileceğini ve production sırlarını okuyabileceğini kısıtlayın.
  • Alışılmadık örüntüleri izleyin: tek bir komutta ani artış, tek bir kullanıcıdan sıkı bir döngüde gelen mesajlar, secret token kontrolünü geçemeyen istekler.
  • Kötü gün için bir planınız olsun. Token'ı iptal edin, webhook'u durdurun, yedekten geri yükleyin. İhtiyacınız olmadan önce yazıya dökün.

Kontrol listesi

  • Token, git'te değil ortam değişkenlerinde yaşar ve loglarda gizlenir.
  • BotFather'da /revoke'u nasıl çalıştıracağınızı biliyorsunuz.
  • Webhook, HTTPS ve her istekte doğruladığınız bir secret token kullanıyor.
  • allowed_updates yalnızca işlediğiniz türlere ayarlı.
  • Callback verisi, gönderildiği gibi güvenilmek yerine sunucu tarafında yetkilendiriliyor.
  • Kullanıcı metni, biçimlendirilmiş bir mesajda geri yansıtılmadan önce escape ediliyor.
  • Yönetici komutları bir ID allowlist'i kontrol ediyor ve loglanıyor.
  • Bir özellik gerçekten gerektirmedikçe gizlilik modu açık.
  • Giden mesajlar kuyruğa alınıyor ve 429 yanıtlarına saygı gösteriliyor.
  • Minimumu saklıyorsunuz, zamanlamaya göre siliyorsunuz ve bir silme talebini karşılayabiliyorsunuz.
  • Web App ve Login Widget payload'ları hash ile doğrulanıyor.

Yanlış gidebilecek kısımları atlayın

TeleMinute ile token'ınız sunucu tarafında saklanır, webhook sizin için yönetilir ve açıkta bırakacağınız kendi bir sunucunuz olmaz. Siz konuşmayı yazarsınız, altyapıyı biz işletiriz.

Bugün Kurmaya Başlayın

Okumaya devam edin

Sık sorulan sorular

Telegram bot token'ım sızarsa ne olur?

Kim elinde tutarsa botu tamamen kontrol eder. Gelen mesajları okuyabilir, sizin adınıza mesaj gönderebilir ve webhook'unuzu değiştirerek kendi sunucunuzun güncelleme almasını durdurabilir. Burada bir şifre sorma ekranı yoktur.

Bir Telegram bot token'ını nasıl iptal ederim?

BotFather'ı açın, revoke komutunu gönderin ve botu seçin. Eski token anında çalışmayı durdurur ve size yeni bir tane verilir. Git geçmişini yeniden yazmak yardımcı olmaz, çünkü sızan bir token dakikalar içinde taranır.

Botum bir gruptaki her mesajı görür mü?

Yalnızca gizlilik modunu kapatırsanız. Varsayılan olarak bir gruptaki bot, komutları, kendi mesajlarına gelen yanıtları ve doğrudan bahsedilmeleri alır. Gizlilik modunu kapatmak, sunucunuzun başkalarının konuşmalarını depolaması anlamına gelir.

Webhook'umda bir secret token'a ihtiyacım var mı?

Evet. Bir tane olmadan, webhook URL'nizi bulan herkes gerçek Telegram trafiğiyle birebir aynı görünen sahte güncellemeler gönderebilir. Webhook'u kaydederken secret'ı belirleyin ve başlığı eşleşmeyen istekleri reddedin.