امنیت9 دقیقه مطالعه

بهترین شیوه‌های امنیتی برای ربات‌های Telegram

توکن ربات یک رمز عبور است که هر کسی از هر جایی می‌تواند از آن استفاده کند، بدون عامل دوم و بدون هشدار ورود. بیشتر حوادث مربوط به ربات‌های Telegram از همین‌جا شروع می‌شود. این‌ها چیزهایی هستند که باید قفل کنید، به همان ترتیبی که معمولاً اوضاع خراب می‌شود.

1. با توکن مثل یک اعتبارنامه زنده رفتار کنید

هر کس توکن ربات شما را داشته باشد، کنترل کامل ربات را در دست می‌گیرد. می‌تواند پیام‌های ورودی را بخواند، به جای شما پیام بفرستد و webhook شما را طوری تغییر دهد که سرور خودتان دیگر به‌روزرسانی‌ها را دریافت نکند. هیچ صفحه درخواست رمز عبور و هیچ تأیید دستگاهی سر راه نیست.

توکن‌ها کجا لو می‌روند

  • در یک commit به مخزن ارسال می‌شوند. به‌مراتب رایج‌ترین مسیر، و مخزن‌های عمومی پیوسته توسط ربات‌هایی که مال شما نیستند اسکن می‌شوند.
  • در یک چت پشتیبانی یا سیستم پیگیری مسائل چسبانده می‌شوند. به‌محض اینکه در یک تیکت قرار بگیرد، جایی در یک ایندکس جست‌وجو هم قرار می‌گیرد.
  • مستقیم در یک نسخه موبایل یا فرانت‌اند کدنویسی می‌شوند. هر چیزی که به دستگاه کاربر ارسال شود، عمومی است.
  • در لاگ‌ها باقی می‌مانند. اگر آدرس کامل API را لاگ کنید، توکن داخل همان آدرس است.

در عوض چه کار کنید

  • توکن را در یک متغیر محیطی یا یک مدیر رمزهای مخفی نگه دارید، هرگز در کد منبع.
  • .env را پیش از اولین commit به .gitignore اضافه کنید، نه بعد از آن.
  • توکن را در خروجی لاگ‌ها پنهان کنید.
  • برای توسعه و تولید از توکن‌های جداگانه استفاده کنید، تا لو رفتن یک توکن آزمایشی به کاربران واقعی آسیب نزند.

اگر توکنی لو رفت، آن را باطل کنید

BotFather را باز کنید، دستور /revoke را اجرا کنید و ربات را انتخاب کنید. توکن قدیمی بلافاصله از کار می‌افتد و توکن جدیدی دریافت می‌کنید. چرخاندن آن چند دقیقه توقف هزینه دارد. رها کردنش هزینه‌اش خود ربات است. بازنویسی تاریخچه git کمکی نمی‌کند، چون توکن از قبل جمع‌آوری شده است.

2. webhook را قفل کنید

اگر ربات شما از webhook استفاده می‌کند، آن آدرس یک نقطه پایانی باز روی اینترنت است. هر کسی که آن را پیدا کند می‌تواند به‌روزرسانی‌های جعلی منتشر کند که دقیقاً شبیه ترافیک واقعی Telegram به نظر می‌رسند.

  • یک توکن مخفی تنظیم کنید. متد setWebhook پارامتری به نام secret_token می‌پذیرد. سپس Telegram آن را در هدر X-Telegram-Bot-Api-Secret-Token در هر درخواست برمی‌گرداند. هر چیزی را که مطابقت نداشت رد کنید.
  • از HTTPS با یک گواهی معتبر استفاده کنید. Telegram این را الزامی می‌کند، و مانع خوانده شدن محتوا در حین انتقال می‌شود.
  • از مسیری استفاده کنید که حدس زدنش غیرممکن باشد. یک بخش تصادفی در آدرس به‌تنهایی امنیت واقعی نیست، اما شما را از اسکن‌های فرصت‌طلبانه دور نگه می‌دارد.
  • آنچه را دریافت می‌کنید محدود کنید. پارامتر allowed_updates اجازه می‌دهد فقط در انواع به‌روزرسانی‌هایی که پردازش می‌کنید مشترک شوید. سطح حمله کمتر، تجزیه کمتر.
  • سریع پاسخ دهید. دریافت درخواست را تأیید کنید، سپس کار اصلی را به‌صورت ناهمگام انجام دهید. مدیرکننده‌های webhook کند، یک حمله منع سرویس هستند که فقط منتظر رخ دادن‌اند.

3. هرگز به محتوای یک به‌روزرسانی اعتماد نکنید

هر چیزی داخل یک به‌روزرسانی توسط یک کاربر تایپ شده است. نام نمایشی، متن پیام، داده‌های callback هنگام فشردن یک دکمه. همه این‌ها ورودی‌ای هستند که در اختیار مهاجم است.

  • داده‌های callback را سمت سرور اعتبارسنجی کنید. دکمه‌ای که order_id=123 را حمل می‌کند می‌تواند با order_id=124 دوباره پخش شود. بررسی کنید کاربری که فشار می‌دهد واقعاً مالک آن رکورد است.
  • متن کاربر را پیش از بازتاب آن escape کنید. اگر پیام‌ها را در حالت HTML یا Markdown می‌فرستید و یک نام نمایشی را عیناً می‌چسبانید، یک نام ساخته‌شده می‌تواند قالب‌بندی شما را بشکند یا یک لینک تزریق کند.
  • پرس‌وجوهای پایگاه داده را پارامتری کنید. ورودی چت که به یک رشته پرس‌وجو می‌رسد همان خطر تزریق یک فرم وب را دارد.
  • اندازه‌هایی را که می‌پذیرید محدود کنید. پیش از پردازش هر چیزی، محدودیت‌هایی برای طول متن و حجم فایل تعیین کنید.

4. دستورات ادمین را قفل کنید

تقریباً هر رباتی سرانجام یک دستور ادمین پیدا می‌کند. پیام همگانی، بازپرداخت، خروجی گرفتن از کاربران. اینجاست که یک ربات کاربردی به یک حادثه تبدیل می‌شود.

  • یک فهرست مجاز از شناسه‌های کاربری را روی سرور بررسی کنید، همان که در پیکربندی نگه‌داری می‌شود. هرگز وضعیت ادمین را از روی یک نام کاربری استنتاج نکنید، چون می‌تواند تغییر کند و دوباره استفاده شود.
  • پنهان نکنید، بررسی کنید. یک دستور مستندنشده همان لحظه‌ای که کسی آن را امتحان کند کشف می‌شود. پنهان‌کاری کنترل واقعی نیست.
  • اقدامات مخرب را با یک گام دوم تأیید کنید، و آنچه قرار است اتفاق بیفتد را در متن تأیید بگنجانید.
  • اقدامات ادمین را با شناسه کاربر و برچسب زمانی ثبت کنید، تا بعداً بتوانید به این سؤال جواب دهید که چه کسی آن پیام همگانی را فرستاد.

5. حالت حریم خصوصی را در گروه‌ها فعال کنید

به‌طور پیش‌فرض، رباتی که به یک گروه اضافه می‌شود فقط پیام‌هایی را دریافت می‌کند که دستور هستند، پاسخ به پیام‌های خودش هستند یا اشاره‌ای به خودش هستند. این رفتار پیش‌فرض حالت حریم خصوصی نام دارد و به دلیل خوبی وجود دارد.

می‌توانید آن را با دستور /setprivacy در BotFather غیرفعال کنید تا ربات هر پیام گروه را ببیند. این کار را فقط زمانی انجام دهید که یک ویژگی واقعاً به آن نیاز داشته باشد. به‌محض غیرفعال شدنش، سرور شما مکالمات دیگران را ذخیره می‌کند، و آن مسئولیت از این پس مال شماست.

6. سرعت خودتان و کاربرانتان را محدود کنید

Telegram محدودیت‌های خودش را اعمال می‌کند، و رسیدن به آن‌ها باعث کندسازی یا مسدود شدن موقت می‌شود. راهنمایی کلی Telegram حدود 30 پیام در ثانیه در چت‌های مختلف و حدود 20 پیام در دقیقه در یک گروه واحد است. این‌ها را سقف‌هایی در نظر بگیرید که باید با فاصله راحتی زیر آن‌ها بمانید، نه هدف.

  • پیام‌های خروجی را در صف قرار دهید به‌جای فرستادن آن‌ها در یک حلقه فشرده.
  • به مقدار retry-after احترام بگذارید وقتی API کد 429 برمی‌گرداند، به‌جای تلاش فوری دوباره.
  • برای هر کاربر هم محدودیت بگذارید. یک نفر که یک دستور را اسپم می‌کند نباید بتواند هزینه‌های شما را بالا ببرد یا سهمیه شما را تمام کند.
  • روی هر چیز پرهزینه‌ای یک زمان انتظار بگذارید، مثل فراخوانی‌های یک مدل هوش مصنوعی پولی یا یک مرحله تولید تصویر.

7. داده‌های کاربری کمتری جمع‌آوری کنید

امن‌ترین رکورد آن رکوردی است که هرگز ذخیره‌اش نکردید. ربات‌ها به‌طور پیش‌فرض شناسه‌های چت، نام‌ها، شماره‌های تلفن و محتوای پیام‌ها را انباشته می‌کنند، و بیشتر آن‌ها هرگز استفاده نمی‌شوند.

  • شناسه چت و چیزی را که واقعاً نیاز دارید ذخیره کنید. بقیه را رد کنید.
  • متن کامل پیام‌ها را لاگ نکنید، مگر اینکه یک دلیل مشخص و یک محدودیت نگه‌داری داشته باشید.
  • یک دوره نگه‌داری تعیین کنید و طبق یک برنامه زمانی حذف کنید.
  • فیلدهای حساس را در حالت سکون رمزگذاری کنید و محدود کنید چه کسی می‌تواند از پایگاه داده پرس‌وجو کند.
  • از درخواست‌های حذف پشتیبانی کنید. طبق GDPR و قوانین مشابه، یک کاربر می‌تواند از شما بخواهد داده‌هایش را حذف کنید، و شما به راهی برای انجام این کار نیاز دارید.
  • بگویید چه چیزی جمع‌آوری می‌کنید، در یک سیاست حریم خصوصی که ربات بتواند به آن لینک بدهد.

توجه کنید شماره‌های تلفن فقط زمانی به دست شما می‌رسند که کاربر روی دکمه درخواست اشتراک‌گذاری مخاطب بزند. درخواست شماره‌ای که نیاز ندارید هم هزینه تبدیل است و هم یک مسئولیت.

8. داده‌های Web App و Login Widget را اعتبارسنجی کنید

اگر ربات شما یک Telegram Web App باز می‌کند یا از Login Widget روی یک وب‌سایت استفاده می‌کنید، داده‌های کاربر همراه با یک hash می‌رسند. پیش از اعتماد به حتی یک فیلد، آن hash را روی سرور خودتان با استفاده از توکن ربات اعتبارسنجی کنید. رد کردن این بررسی یعنی هر کسی می‌تواند با ویرایش درخواست، جای هر کاربری جا بزند.

9. مراقب چیزهای عادی هم باشید

  • وابستگی‌ها را به‌روز کنید. بیشتر نفوذهای واقعی از طریق یک کتابخانه می‌آیند، نه از طریق خود Telegram.
  • محدود کنید چه کسی می‌تواند deploy کند و چه کسی می‌تواند رمزهای مخفی تولید را بخواند.
  • مراقب الگوهای غیرعادی باشید: جهش ناگهانی در یک دستور، پیام‌هایی از یک کاربر در یک حلقه فشرده، درخواست‌هایی که در بررسی توکن مخفی رد می‌شوند.
  • برای روز بد برنامه داشته باشید. باطل کردن توکن، توقف webhook، بازیابی از یک پشتیبان. پیش از نیاز پیدا کردنش آن را بنویسید.

چک‌لیست

  • توکن در متغیرهای محیطی زندگی می‌کند، نه در git، و در لاگ‌ها پنهان می‌شود.
  • می‌دانید چطور /revoke را در BotFather اجرا کنید.
  • webhook از HTTPS و یک توکن مخفی استفاده می‌کند که در هر درخواست اعتبارسنجی می‌کنید.
  • allowed_updates فقط روی چیزی که پردازش می‌کنید تنظیم شده است.
  • داده‌های callback سمت سرور مجاز شمرده می‌شوند، نه اینکه همان‌طور که فرستاده شده‌اند مورد اعتماد باشند.
  • متن کاربر پیش از بازتاب در یک پیام قالب‌بندی‌شده escape می‌شود.
  • دستورات ادمین یک فهرست مجاز از شناسه‌ها را بررسی می‌کنند و ثبت می‌شوند.
  • حالت حریم خصوصی فعال است مگر اینکه یک ویژگی واقعاً غیرفعال بودنش را لازم داشته باشد.
  • پیام‌های خروجی در صف قرار می‌گیرند و پاسخ‌های 429 رعایت می‌شوند.
  • حداقل لازم را ذخیره می‌کنید، طبق برنامه زمانی حذف می‌کنید، و می‌توانید به یک درخواست حذف پاسخ دهید.
  • محموله‌های Web App و Login Widget با hash اعتبارسنجی می‌شوند.

بخش‌هایی را که معمولاً خراب می‌شوند رد کنید

با TeleMinute توکن شما سمت سرور ذخیره می‌شود، webhook برایتان مدیریت می‌شود، و سروری از خودتان ندارید که در معرض قرار بگیرد. شما مکالمه را می‌نویسید، ما زیرساخت را اداره می‌کنیم.

همین امروز شروع به ساختن کنید

ادامه مطالعه

سؤالات متداول

اگر توکن ربات Telegram من لو برود چه اتفاقی می‌افتد؟

هر کس آن را در اختیار داشته باشد، کنترل کامل ربات را به دست می‌گیرد. می‌تواند پیام‌های ورودی را بخواند، به جای شما پیام بفرستد و webhook شما را طوری تغییر دهد که سرور خودتان دیگر به‌روزرسانی‌ها را دریافت نکند. هیچ صفحه درخواست رمز عبوری سر راه نیست.

چطور توکن یک ربات Telegram را باطل کنم؟

BotFather را باز کنید، دستور ابطال را بفرستید و ربات را انتخاب کنید. توکن قدیمی بلافاصله از کار می‌افتد و یک توکن جدید دریافت می‌کنید. بازنویسی تاریخچه git کمکی نمی‌کند، چون یک توکن لو رفته ظرف چند دقیقه جمع‌آوری می‌شود.

آیا ربات من همه پیام‌های یک گروه را می‌بیند؟

فقط اگر حالت حریم خصوصی را غیرفعال کنید. به‌طور پیش‌فرض ربات در یک گروه فقط دستورات، پاسخ‌ها به پیام‌های خودش و اشاره‌های مستقیم به خودش را دریافت می‌کند. غیرفعال کردن حالت حریم خصوصی یعنی سرور شما مکالمات دیگران را ذخیره می‌کند.

آیا به یک توکن مخفی روی webhook خود نیاز دارم؟

بله. بدون آن، هر کسی که آدرس webhook شما را پیدا کند می‌تواند به‌روزرسانی‌های جعلی منتشر کند که دقیقاً شبیه ترافیک واقعی Telegram به نظر می‌رسند. هنگام ثبت webhook این مقدار مخفی را تنظیم کنید و درخواست‌هایی را که هدر آن‌ها مطابقت ندارد رد کنید.