صندوقهای یکبارمصرف
یک نشانی کارآمد برای کسی که نشانی ندارد: بدون حساب، بدون کلید، و همان روز رفته.
صندوق یکبارمصرف چیست
فراخوانکننده نشانیای روی دامنهای میخواهد که این نصب مالک آن است، چند دقیقه تماشایش میکند، هر چه میرسد میخواند، و رهایش میکند. برای کد تأیید وجود دارد، برای پرسش «این فرم واقعاً چه میفرستد»، و برای ثبتنامی که نمیخواهید به نشانیای بچسبد که پنج سال دیگر هم از آن استفاده میکنید.
- تنها دریافت میکند و بس. ارسالی در کار نیست: صندوق ورودی هویتی برای ارسال ندارد، و هیچکدام از این نه فراخوانی پیامی روی سیم نمیگذارد.
- مهلت بهطور پیشفرض ۶۰ دقیقه است و میتوان آن را ساعتبهساعت تا ۲۴ ساعت پیش برد.
- ۵۰ پیام نگه میدارد، که همانطور که میرسند شمرده میشوند. نامهای که به صندوق پر برسد انداخته میشود نه صف میشود، و حذف یکی جا برای دیگری نمیخرد.
- در پایان مهلت، نامهها حذف میشوند، نه پنهان و نه بایگانی. سطر آن یک هفته بیشتر از آن عمر میکند تا تا وقتی فرستندهای کند هنوز به آن تلاش دوباره میکند، نشانی دوباره صادر نشود.
- هیچیک از اینها به یک صندوق پستی دست نمیزند. پیام یکبارمصرف در جدول خودش زندگی میکند، و هیچ کوئریای روی این مسیر نمیتواند به صندوق واقعی برسد.
اینها همان فراخوانیهاییاند که ابزار رایگان این سایت میزند، پس هر کاری آن صفحه میتواند بکند کد شما هم میتواند. این API برای موردی اینجاست که آن صفحه نیست: مجموعهآزمونی که برای هر اجرا نشانی تازه میخواهد.
نشانی اعتبارنامه نیست
نشانی یکبارمصرف همان لحظهای که صادر میشود در فرم ثبتنامی تایپ میشود. از آنجا در هدر To: سفر میکند، از میان لاگهای فرستنده میگذرد، و به هر CRMی که آن سوی ماجراست میرسد. اگر دانستن نشانی برای خواندن نامهها کافی بود، این ابزار طبق طراحی هر صندوقی را که صادر کرده نشت میداد، و دقیقاً به همان طرفی که فراخوانکننده با احتیاط دورش نگه داشته بود.
پس ساختن یک صندوق مقدار دومی برمیگرداند: یک token، ۳۲ بایت تصادفی به شکل oe_inbox_ بهعلاوهٔ ۴۳ نویسهٔ base64url. در همان یک پاسخ پدیدار میشود و در هیچ پاسخ دیگری. سطر تنها یک هش کلیددار از آن نگه میدارد، پس هیچچیز بازیابیاش نمیکند، نه یک درخواست پشتیبانی و نه یک دامپ پایگاهداده. توکن را گم کنید صندوق را گم کردهاید، که برای اعتبارنامهای که نامههای کسی را میخواند پیامد درستی است.
# 1. Mint one. This is the only response that carries a token.curl -s -X POST "$OE/temp-mail/inboxes" -H "Content-Type: application/json" -d '{}' # 2. Keep it, and read with it.export INBOX="Authorization: Bearer oe_inbox_kQ8v…"curl -s "$OE/temp-mail/inboxes/tinb_9c2f…/messages" -H "$INBOX"کلید API oe_live_ یا oe_test_ را به یکی از این مسیرها بفرستید و به جای یک 401 خشک با invalid_credential_type رد میشود. دو گونه اعتبارنامه اینجا یک میزبان و یک هدر را با هم شریکاند، و «غیرمجاز» شما را وامیداشت حدس بزنید کدامیک از مال شما اشتباه بوده است.
مهلت، و تمدید آن
یک ساعت، نه ده دقیقهای که این گونه ابزار به نامش شناخته میشود. ده دقیقه برای یک کد تأیید کافی است و برای نیمهٔ دیگر کاربردشان کافی نیست: نسخهٔ آزمایشیای که صبح فردا دوباره به شما ایمیل میزند، فرمی که چون تلاش نخست تایماوت شده دو بار پر شده است. ttlMinutes هنگام ساخت چیز دیگری میخواهد، از ۱ تا ۱۴۴۰؛ عددی بیرون از آن با 422 رد میشود نه اینکه بیصدا تنظیم شود، چون انقضایی که نخواستهاید انقضایی است که از پیش برایش برنامه ریختهاید.
POST /temp-mail/inboxes/{id}/extend یک ساعت به زمان انقضا میافزاید نه به اکنون، پس تمدید زودهنگام زمان باقیماندهتان را هدر نمیدهد. ۲۳ بار کار میکند، و آن یک روز از لحظهٔ ساخت صندوق سختگیرانهترین از میان آن دو سقف است: مهلتی که پیشتر تا آنجا میرسد چیزی برای خریدن ندارد، هر چند تمدید کمی خرج شده باشد. extensionsLeft روی هر پاسخ صندوق هر دو را میشمارد، تا کلاینت بتواند دکمه را خاکستری کند؛ در صفر، فراخوانی با 409 extension_limit پاسخ میدهد.
صندوق منقضی همان لحظهٔ انقضا از احراز هویت میافتد: توکنش بدون انتظار برای جاروب 404 پاسخ میدهد. جاروب همان چیزی است که نامهها را حذف میکند و روی cron ساعتی اجرا میشود؛ DELETE /temp-mail/inboxes/{id} همان حذف است، به درخواست شما.
سقفها
همهٔ اینها سطرهای شمردهشدهاند نه محدودکنندهٔ نرخ. در این کدبیس محدودکنندهای نیست که سراغش برویم، و گفتنش از اشاره به دفاعی که وجود ندارد بهکارتر است. آنها جایی گذاشته شدهاند که آسیب آنجاست: ساختن، و ذخیرهسازی.
| سقف | مقدار | در آن نقطه چه رخ میدهد |
|---|---|---|
| مهلت | ۶۰ دقیقه، قابل تمدید تا ۲۴ ساعت | 409 conflict_error / extension_limit |
| پیام در هر صندوق | ۵۰ | نامهٔ بیشتر همان دم در انداخته میشود. برگشتی نوشته نمیشود، چیزی صف نمیشود، و حذف یک پیام جای آن را پس نمیدهد. |
| صندوقهای ساختهشده | ۶ در ساعت، ۳۰ در روز، به ازای هر فراخوانکننده | 429 rate_limit_error / too_many_inboxes |
| بدنهٔ ذخیرهشده | 2 MB | truncated: true روی پیام؛ بقیهاش رفته است. |
| بایتهای پیوست | هر کدام 8 MB | content برابر null است و فراداده نگه داشته میشود، که با فایل خالی یکی نیست. |
سقف ساختن در برابر یک هش کلیددار از IP کلاینت شمرده میشود، و صندوق نابودشده هم همچنان شمرده میشود، پس دورانداختن یکی راهی برای خریدن یکی دیگر نیست. پشت پراکسی شخصی دیگر، هدر forwarded را میتوان جعل کرد، که ضعفی شناختهشده در همین سقف است نه حفرهای در اعتبارنامه: هیچچیز اینجا بر پایهٔ آن مقدار مجوز نمیدهد.
آنچه اینجا نیست
هنوز منتشر نشدهفهمیدن با آزمونوخطا بدتر از این است که به شما گفته شود:
- هیچگونه ارسالی در کار نیست. صندوق یکبارمصرف connectionی برای ارسال ندارد، و افزودنش یک اندپوینت ناشناس و بدون احراز هویت را به یک رله باز بدل میکرد.
- تغییر نام در کار نیست. عوضکردن نشانی یعنی ساختن صندوق دوم: تغییر نام در جا، همان لحظهای که کلیک شود بخش محلی قدیمی را آزاد میکرد، و تأییدی که در راه بود آنگاه به هر کسی تحویل میشد که بعداً آن را میگرفت.
- نه قانون، نه فیلتر، نه فوروارد، نه وبهوک و نه AI.
spamپرچمی روی پیام است و چیزی بر اساسش عمل نکرده است. چیزی بایگانی نشده، و هیچچیز اینجا خلاصه یا embed نمیشود. - برگشتی در کار نیست. نامهای به دامنهٔ استخر که نه صندوق یکبارمصرف زندهای را نام ببرد و نه نشانیای را که اپراتور ساخته، عمداً بیصدا انداخته میشود: مولد نشانی عمومی حملههای دیکشنری را جذب میکند، و نوشتن گزارش تحویل به هر مسیر بازگشتی که حمله ادعا کند، این نصب را به منبع backscatter بدل میکرد.
- نبودن دامنهٔ پیکربندیشده یعنی نبودن سرویس. وقتی
TEMP_MAIL_DOMAINSخالی باشد،GET /temp-mail/domainsبا فهرستی خالی پاسخ میدهد و ساختن صندوق 503temp_mail_unavailableمیدهد. تحویل ورودی به دامنهٔ استخر روی دامنهای زنده بهصورت سرتاسری مشاهده نشده است.
پیکربندی یک دامنه، اگر نصب را شما میگردانید
این فهرست پیکربندی است: هر چه TEMP_MAIL_DOMAINS نام ببرد همان است که واگذار میشود. هیچچیز DNS را خودکار نمیکند، پس چهار گام از این پنج گام کار یک آدم نزد ثبتکنندهٔ دامنه است.
- دامنهای برایش ثبت کنید. دامنهای بهکار ببرید که حاضرید غریبهها آن را دستبهدست کنند. هر نشانی روی آن در اعتبارش شریک است، و به همین دلیل هم انتخابگر، صندوقهای تازه را بهصورت تصادفی در استخر پخش میکند نه اینکه اولی را پر کند.
- آن را در اپلیکیشن زیر تنظیمات ← دامنهها بیفزایید. همین هویت ارسال را میسازد و رکوردهای DNSی را که باید منتشر شوند چاپ میکند.
- رکوردهای MX، SPF، DKIM و TXT با نام
_openemail-challengeرا نزد ثبتکننده منتشر کنید. تأیید، DNS زنده را میخواند و روی cron دوباره بررسی میشود؛ تنها دامنهٔ تأییدشده پیشنهاد میشود. - دامنهٔ تأییدشده را روی سرور به
TEMP_MAIL_DOMAINSبیفزایید، جداشده با کاما. تا وقتی فهرست نشده، دامنهای معمولی روی فضای کاری است. - catch-all را روشن بگذارید. همین است که میگذارد نشانی یکبارمصرف بدون ساختهشدن وجود داشته باشد، چون نامه به هر بخش محلی پذیرفته و پیش از جستوجوی معمول گیرنده بازخوانی میشود، پس برای دامنهٔ استخر هرگز سطر نشانیای نوشته نمیشود؛ روشنگذاشتن catch-all بایگانیکردن نامههای دورانداختنی را در یک صندوق پستی واقعی آغاز میکند.
بخشهای محلی رزروشده (postmaster، abuse، security و بقیهٔ RFC 2142) هرگز نمیتوانند یکبارمصرف باشند و به جایش به صندوق پستی معمولی میافتند. دامنهٔ استخری که گزارشهای سوءاستفادهٔ خودش را در سیاهچاله بیندازد دامنهای است که توان تحویل به هر جایی را از دست میدهد. نشانیای که خودتان روی دامنهٔ استخر میسازید، مانند legal@ یا privacy@، به همان شکل رفتار میکند: نامه به آن در صندوق پستی شما مینشیند، و هیچکس نمیتواند آن را به عنوان نشانی یکبارمصرف بگیرد.