HEADER_CHECKS(5) File Formats Manual HEADER_CHECKS(5)

header_checks - بازرسی توکار محتوا در Postfix

header_checks = pcre:/etc/postfix/header_checks
mime_header_checks = pcre:/etc/postfix/mime_header_checks
nested_header_checks = pcre:/etc/postfix/nested_header_checks
body_checks = pcre:/etc/postfix/body_checks

milter_header_checks = pcre:/etc/postfix/milter_header_checks

smtp_header_checks = pcre:/etc/postfix/smtp_header_checks
smtp_mime_header_checks = pcre:/etc/postfix/smtp_mime_header_checks
smtp_nested_header_checks = pcre:/etc/postfix/smtp_nested_header_checks
smtp_body_checks = pcre:/etc/postfix/smtp_body_checks

postmap -q "string" pcre:/etc/postfix/filename
postmap -q - pcre:/etc/postfix/filename <inputfile


این سند، کنترل دسترسی بر روی محتوای سرایندها و خطوط بدنه پیام را توصیف می‌کند؛ این قابلیت توسط کارساز cleanup(8) در Postfix پیش از قرار گرفتن ایمیل در صف پیاده‌سازی شده است. برای کنترل دسترسی بر روی اطلاعات کلاینت دوردست SMTP، به access(5) مراجعه کنید.

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

یادداشت: سرایندهای پیام، در هر نوبت به اندازه یک سرایند منطقی بررسی می‌شوند، حتی اگر یک سرایند در چندین خط گسترده شده باشد. خطوط بدنه همواره یک خط در هر نوبت بررسی می‌شوند.

برای مشاهده مثال‌ها، بخش «مثال‌ها (EXAMPLES)» را در انتهای این صفحه راهنما ببینید.

بررسی‌های سرایند یا بدنه (header_checks یا body_checks) در Postfix برای جلوگیری از هجوم ایمیل‌های ناشی از کرم‌ها یا ویروس‌ها طراحی شده‌اند؛ این بررسی‌ها پیوست‌ها را رمزگشایی نکرده و فایل‌های فشرده را باز (unzip) نمی‌کنند. در صورتی که به تحلیل‌های پیشرفته‌تر محتوا نیاز دارید، اسناد ارجاع داده‌شده در بخش «فایل‌های راهنما (README FILES)» را مطالعه کنید.


سامانه Postfix هنگام دریافت ایمیل، چهار رده بازرسی توکار محتوا را پیاده‌سازی می‌کند:

این بررسی‌ها بر روی سرایندهای اولیه پیام اعمال می‌شوند (به‌جز سرایندهایی که با mime_header_checks پردازش می‌شوند).
این بررسی‌ها فقط بر روی سرایندهای مرتبط با MIME پیام اعمال می‌شوند.

این قابلیت در Postfix نسخه 2.0 و بالاتر در دسترس است.

این بررسی‌ها بر روی سرایندهای پیام‌های ایمیل پیوست‌شده اعمال می‌شوند (به‌جز سرایندهایی که با mime_header_checks پردازش می‌شوند).

این قابلیت در Postfix نسخه 2.0 و بالاتر در دسترس است.

این بررسی‌ها بر روی تمام محتوای دیگر، از جمله مرزهای پیام‌های چندبخشی (multi-part) اعمال می‌شوند.

در نسخه‌های پیش از 2.0 در Postfix، تمام محتوای بعد از سرایندهای اولیه پیام به عنوان محتوای بدنه در نظر گرفته می‌شد.


سامانه Postfix از زیرمجموعه‌ای از رده‌های بازرسی توکار محتوا پس از دریافت پیام پشتیبانی می‌کند:

این بررسی‌ها بر روی سرایندهایی اعمال می‌شوند که توسط برنامه‌های کاربردی Milter اضافه شده‌اند.

این قابلیت در Postfix نسخه 2.7 و بالاتر در دسترس است.


سامانه Postfix از هر چهار رده بازرسی محتوا هنگام تحویل ایمیل از طریق SMTP پشتیبانی می‌کند.

این قابلیت‌ها در Postfix نسخه 2.5 و بالاتر در دسترس هستند.


در Postfix نسخه 2.2 و پیش از آن، برای پرس‌وجوی جدولی که حاوی الگوهای حساس به حروف بزرگ و کوچک (case sensitive) است، "postmap -fq" را مشخص کنید. به‌طور پیش‌فرض، الگوهای regexp: و pcre: نسبت به بزرگی و کوچکی حروف حساس نیستند (case insensitive).


این سند فرض می‌کند که قوانین header_checks و body_checks در قالب جدول‌های جستجوی عبارات باقاعده Postfix مشخص شده‌اند. معمولاً بیشترین کارایی با جدول‌های pcre (عبارات باقاعده سازگار با پرل) به‌دست می‌آید. جدول‌های regexp (عبارات باقاعده POSIX) معمولاً کندتر هستند، اما دسترس‌پذیری گسترده‌تری دارند. برای اطلاع از اینکه سیستم Postfix شما از چه انواع جدول‌های جستجویی پشتیبانی می‌کند، از دستور "postconf -m" استفاده کنید.

قالب کلی جدول‌های عبارت باقاعده Postfix در زیر آورده شده است. برای بررسی دقیق نحو الگوها یا پرچم‌ها، به ترتیب به pcre_table(5) یا regexp_table(5) مراجعه کنید.

/pattern/flags action
هنگامی که /pattern/ با رشته ورودی مطابقت داشته باشد، action متناظر را اجرا می‌کند. برای مشاهده فهرست عملیات‌های ممکن به ادامه متن مراجعه کنید.
!/pattern/flags action
هنگامی که /pattern/ با رشته ورودی مطابقت نداشته باشد، action متناظر را اجرا می‌کند.
اگر رشته ورودی با /pattern/ مطابقت داشته باشد، آن رشته ورودی با الگوهای میان if و endif مقایسه می‌شود. ساختارهای if..endif می‌توانند به‌صورت تودرتو باشند.

یادداشت: به ابتدای الگوهای داخل if..endif فاصله خالی اضافه نکنید.

اگر رشته ورودی با /pattern/ مطابقت نداشته باشد، آن رشته ورودی با الگوهای میان if و endif مقایسه می‌شود. ساختارهای if..endif می‌توانند به‌صورت تودرتو باشند.
خطوط خالی و توضیحات
خطوط خالی و خطوطی که فقط حاوی فاصله‌های سفید هستند نادیده گرفته می‌شوند؛ همچنین خطوطی که نخستین نویسه غیرفاصله‌ای آن‌ها `#' باشد نادیده گرفته خواهند شد.
متن چندخطی
خط الگو/عملیات با متنی غیر از فاصله آغاز می‌شود. خطی که با فاصله سفید شروع شود، ادامه خط منطقی قبلی در نظر گرفته می‌شود.


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


جایگزینی زیررشته‌ها از عبارت منطبق‌شده در رشته action با استفاده از نحو مرسوم پرل ($1, $2 و غیره) امکان‌پذیر است. ماکروها در رشته نتیجه ممکن است در صورتی که بعد از آن‌ها فاصله خالی نباشد، نیاز باشد به صورت ${n} یا $(n) نوشته شوند.

یادداشت: از آنجا که الگوهای نقیض (آن‌هایی که با ! شروع می‌شوند) زمانی نتیجه برمی‌گردانند که عبارت مطابقت نداشته باشد، امکان جایگزینی برای الگوهای نقیض وجود ندارد.


نام‌های عملیات به بزرگی و کوچکی حروف حساس نیستند. برای یکدستی با سایر اسناد Postfix، این نام‌ها با حروف بزرگ نمایش داده شده‌اند.

نشانی مشخص‌شده را به عنوان یک گیرنده مخفی (BCC) اضافه کرده و خط ورودی بعدی را بازرسی می‌کند. نشانی باید شامل بخش محلی (local part) و بخش دامنه (domain part) باشد. تعداد نشانی‌های BCC که می‌توانند اضافه شوند، صرفاً با میزان فضای ذخیره‌سازی در دسترس محدود می‌شود.

یادداشت ۱: نشانی BCC به گونه‌ای افزوده می‌شود که گویی با گزینه NOTIFY=NONE مشخص شده است. فرستنده در صورت عدم امکان تحویل به نشانی BCC مطلع نخواهد شد، تا زمانی که تمام نرم‌افزارهای مسیر پایین‌دست RFC 3461 را پیاده‌سازی کرده باشند.

یادداشت ۲: این عملیات نشانی‌های تکراری (با گزینه‌های اعلان وضعیت تحویل یکسان) را نادیده می‌گیرد.

این قابلیت در Postfix نسخه 3.0 و بالاتر در دسترس است.

این قابلیت در بررسی‌های سرایند/بدنه smtp پشتیبانی نمی‌شود.

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

یادداشت: این عملیات بازرسی‌های بیشتر header_checks یا body_checks روی پیام جاری را غیرفعال کرده و بر تمام گیرندگان تأثیر می‌گذارد. برای دور انداختن پیام تنها برای یک گیرنده بدون دور انداختن کل پیام، از جدول transport(5) جهت هدایت ایمیل به سرویس discard(8) استفاده کنید.

این قابلیت در Postfix نسخه 2.0 و بالاتر در دسترس است.

این قابلیت در بررسی‌های سرایند/بدنه smtp پشتیبانی نمی‌شود.

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

به دلایل سازگاری با نسخه‌های پیشین، Postfix مقدار OK را نیز می‌پذیرد اما همیشه با آن مشابه DUNNO رفتار می‌شود.

این قابلیت در Postfix نسخه 2.1 و بالاتر در دسترس است.

مقدار پارامتر content_filter را نادیده گرفته و بازنویسی می‌کند، و خط ورودی بعدی را بررسی می‌نماید. پس از صف‌بندی، کل پیام را از طریق فیلتر محتوای خارجی مشخص‌شده ارسال می‌کند. نام transport فیلد اول تعریف یک عامل تحویل ایمیل را در master.cf مشخص می‌سازد؛ نحو مقصد گام بعدی (destination) در صفحه راهنمای عامل تحویل متناظر شرح داده شده است. اطلاعات بیشتر درباره فیلترهای محتوای خارجی در فایل FILTER_README مربوط به Postfix آمده است.

یادداشت ۱: از جایگزینی‌های عبارات باقاعده $number برای transport یا destination استفاده نکنید مگر آنکه بدانید اطلاعات از یک مبدا قابل اعتماد آمده است.

یادداشت ۲: این عملیات تنظیم content_filter در main.cf را لغو کرده و بر تمام گیرندگان پیام اثر می‌گذارد. در صورتی که چندین عملیات FILTER فعال شوند، فقط آخرین مورد اجرا خواهد شد.

یادداشت ۳: هدف دستور FILTER لغو و تغییر مسیردهی پیام است. برای لغو transport گیرنده بدون تغییر مقصد گام بعدی (destination)، یک destination فیلتر خالی مشخص کنید (Postfix نسخه 2.7 و بالاتر)، یا یک transport:destination تعیین نمایید که از طریق نمونه متفاوتی از Postfix تحویل داده شود (Postfix نسخه 2.6 و پیش از آن). گزینه‌های دیگر شامل استفاده از قابلیت‌های وابسته به گیرنده transport_maps یا وابسته به فرستنده sender_dependent_default_transport_maps است.

این قابلیت در Postfix نسخه 2.0 و بالاتر در دسترس است.

این قابلیت در بررسی‌های سرایند/بدنه smtp پشتیبانی نمی‌شود.

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

ایمیل‌هایی که در وضعیت توقف (hold) قرار می‌گیرند با دستور postcat(1) قابل بررسی بوده و با دستور postsuper(1) قابل حذف یا آزادسازی هستند.

یادداشت: برای آزادسازی ایمیل‌هایی که به مدت بخش قابل توجهی از $maximal_queue_lifetime یا $bounce_queue_lifetime یا طولانی‌تر در صف نگهداری شده‌اند، از "postsuper -r" استفاده کنید. از "postsuper -H" تنها برای ایمیل‌هایی استفاده نمایید که ظرف چند تلاش تحویل منقضی نمی‌شوند.

یادداشت: این عملیات بر تمام گیرندگان پیام اثر می‌گذارد.

این قابلیت در Postfix نسخه 2.0 و بالاتر در دسترس است.

این قابلیت در بررسی‌های سرایند/بدنه smtp پشتیبانی نمی‌شود.

خط جاری را از ورودی حذف کرده و خط ورودی بعدی را بازرسی می‌کند. برای جایگزینی که این عملیات را در لاگ ثبت می‌کند، به STRIP مراجعه کنید.
یک رکورد "info:" حاوی متن اختیاری... (یا یک متن عمومی) ثبت کرده و خط ورودی بعدی را بازرسی می‌کند. این عملیات برای ثبت رویدادهای روزمره یا اشکال‌زدایی مفید است.

این قابلیت در Postfix نسخه 2.8 و بالاتر در دسترس است.

یک رکورد "pass:" حاوی متن اختیاری... (یا یک متن عمومی) ثبت کرده و بررسی سرایند، بدنه و Milter را برای مابقی این پیام غیرفعال می‌کند.

یادداشت: این قابلیت متکی بر اعتماد به اطلاعاتی است که جعل آن‌ها آسان است.

این قابلیت در Postfix نسخه 3.2 و بالاتر در دسترس است.

این قابلیت در بررسی‌های سرایند/بدنه smtp پشتیبانی نمی‌شود.

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

یادداشت‌ها:

  • متن پیش‌افزوده در یک خط جداگانه، بلافاصله قبل از ورودی که عملیات PREPEND را فعال کرده خروجی داده می‌شود.
  • متن پیش‌افزوده بخشی از جریان ورودی در نظر گرفته نمی‌شود: مشمول بررسی‌های سرایند/بدنه یا بازنویسی نشانی نمی‌شود و بر نحوه افزودن سرایندهای ناموجود توسط Postfix تأثیری نمی‌گذارد.
  • هنگام پیش‌افزودن متن قبل از یک خط سرایند پیام، متن افزوده شده باید با یک برچسب سرایند معتبر پیام آغاز شود.
  • از این عملیات نمی‌توان برای پیش‌افزودن متن‌های چندخطی استفاده کرد.
این قابلیت در Postfix نسخه 2.1 و بالاتر در دسترس است.

این قابلیت در milter_header_checks پشتیبانی نمی‌شود.

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

یادداشت ۱: این عملیات، عملیات FILTER را لغو کرده و بر تمام گیرندگان پیام اثر می‌گذارد. اگر چندین عملیات REDIRECT فعال شوند، فقط آخرین مورد اجرا خواهد شد.

یادداشت ۲: نشانی REDIRECT مشمول استانداردسازی (افزودن دامنه ناموجود) می‌شود، اما مشمول نگاشت‌های canonical، masquerade، bcc یا نام مستعار مجازی (virtual alias) نمی‌شود.

این قابلیت در Postfix نسخه 2.1 و بالاتر در دسترس است.

این قابلیت در بررسی‌های سرایند/بدنه smtp پشتیبانی نمی‌شود.

خط جاری را با متن مشخص‌شده جایگزین کرده و خط ورودی بعدی را بررسی می‌کند.

این قابلیت در Postfix نسخه 2.2 و بالاتر در دسترس است. توضیحات زیر در مورد Postfix نسخه 2.2.2 و بالاتر صدق می‌کند.

یادداشت‌ها:

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

یادداشت: این عملیات بازرسی‌های بیشتر header_checks یا body_checks روی پیام جاری را غیرفعال کرده و بر تمام گیرندگان تأثیر می‌گذارد.

Postfix نسخه 2.3 و بالاتر از کدهای وضعیت ارتقایافته (enhanced status codes) پشتیبانی می‌کنند. هنگامی که هیچ کدی در ابتدای متن اختیاری... مشخص نشده باشد، Postfix کد وضعیت پیش‌فرض "5.7.1" را درج می‌کند.

این قابلیت در بررسی‌های سرایند/بدنه smtp پشتیبانی نمی‌شود.

یک رکورد "strip:" همراه با متن اختیاری... (یا یک متن عمومی) ثبت کرده، خط ورودی را از جریان ورودی حذف می‌کند و خط ورودی بعدی را بازرسی می‌نماید. برای یک جایگزین بی‌صدا، به IGNORE مراجعه کنید.

این قابلیت در Postfix نسخه 3.2 و بالاتر در دسترس است.

یک رکورد "warning:" همراه با متن اختیاری... (یا یک متن عمومی) ثبت کرده و خط ورودی بعدی را بازرسی می‌کند. این عملیات برای اشکال‌زدایی و آزمودن یک الگو پیش از اعمال اقدامات جدی‌تر مفید است.


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

بسیاری از افراد محدودیت‌های اصلی قوانین header_checks و body_checks را نادیده می‌گیرند:

  • این قوانین در هر نوبت بر روی یک سرایند منطقی پیام یا یک خط از بدنه عمل می‌کنند. تصمیمی که برای یک خط گرفته می‌شود به خط بعدی منتقل نمی‌شود.
  • اگر متن موجود در بدنه پیام کدگذاری شده باشد (RFC 2045)، قوانین باید برای شکل کدگذاری‌شده تعیین شوند.
  • مشابهاً، هنگامی که سرایندهای پیام کدگذاری شده باشند (RFC 2047)، قوانین باید برای شکل کدگذاری‌شده مشخص گردند.

سرایندهایی که توسط خود دیمن cleanup(8) افزوده می‌شوند از بازرسی مستثنی هستند. نمونه‌هایی از این سرایندها عبارتند از: From:, To:, Message-ID:, Date:.

سرایندهایی که توسط دیمن cleanup(8) حذف می‌شوند، پیش از حذف مورد بررسی قرار خواهند گرفت. نمونه‌هایی از این سرایندها عبارتند از: Bcc:, Content-Length:, Return-Path:.


جدول‌های جستجوی اختیاری برای بازرسی محتوا همان‌طور که در صفحه راهنمای body_checks(5) مشخص شده است.
میزان متنی در یک بخش از بدنه پیام (یا پیوست، در صورتی که ترجیح می‌دهید از این واژه استفاده کنید) که مشمول بازرسی body_checks قرار می‌گیرد.
جدول‌های جستجوی اختیاری برای بازرسی محتوای سرایندهای اولیه غیر MIME پیام، همان‌گونه که در صفحه راهنمای header_checks(5) مشخص شده است.
جدول‌های جستجوی اختیاری برای بازرسی محتوای سرایندهای مرتبط با MIME پیام، همان‌گونه که در صفحه راهنمای header_checks(5) توصیف شده است.
جدول‌های جستجوی اختیاری برای بازرسی محتوای سرایندهای غیر MIME در پیام‌های پیوست‌شده، همان‌گونه که در صفحه راهنمای header_checks(5) توصیف شده است.
غیرفعال‌سازی پردازش MIME هنگام دریافت ایمیل.


الگوی سرایند برای مسدودسازی پیوست‌ها با پسوندهای نامعتبر یا خطرناک فایل. جهت راحتی، پرچم /x در PCRE مشخص شده است تا نیازی به فشرده‌سازی الگو در یک خط متنی واحد نباشد. هدف از زیرعبارت‌های [[:xdigit:]] تشخیص رشته‌های CLSID ویندوز است.

/etc/postfix/main.cf:
    header_checks = pcre:/etc/postfix/header_checks.pcre
/etc/postfix/header_checks.pcre:
    /^Content-(Disposition|Type).*name\s*=\s*"?([^;]*(\.|=2E)(
      ade|adp|asp|bas|bat|chm|cmd|com|cpl|crt|dll|exe|
      hlp|ht[at]|
      inf|ins|isp|jse?|lnk|md[betw]|ms[cipt]|nws|
      \{[[:xdigit:]]{8}(?:-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}\}|
      ops|pcd|pif|prf|reg|sc[frt]|sh[bsm]|swf|
      vb[esx]?|vxd|ws[cfh]))(\?=)?"?\s*(;|$)/x
        REJECT Attachment name "$2" may not end with ".$4"

الگوی بدنه برای متوقف کردن اکسپلویت آسیب‌پذیری خاص مرورگر در کدهای HTML.

/etc/postfix/main.cf:
    body_checks = regexp:/etc/postfix/body_checks
/etc/postfix/body_checks:
    /^<iframe src=(3D)?cid:.* height=(3D)?0 width=(3D)?0>$/
        REJECT IFRAME vulnerability exploit


cleanup(8)، استانداردسازی و صف‌بندی پیام‌های Postfix
pcre_table(5)، قالب جدول‌های جستجوی PCRE
regexp_table(5)، قالب جدول‌های جستجوی عبارات باقاعده POSIX
postconf(1)، ابزار پیکربندی Postfix
postmap(1)، مدیریت جدول‌های جستجوی Postfix
postsuper(1)، سامان‌دهنده و پاک‌ساز صف‌های Postfix
postcat(1)، نمایش محتویات فایل‌های صف Postfix
RFC 2045، قوانین کدگذاری base64 و quoted-printable
RFC 2047، کدگذاری سرایند پیام برای متن‌های غیر ASCII


برای پیدا کردن محل این اطلاعات، از دستور "postconf readme_directory" یا "postconf html_directory" استفاده کنید.

DATABASE_README, Postfix lookup table overview
CONTENT_INSPECTION_README, Postfix content inspection overview
BUILTIN_FILTER_README, Postfix built-in content inspection
BACKSCATTER_README, blocking returned forged mail


مجوز نرم‌افزار Secure Mailer باید همراه با این نرم‌افزار توزیع شود.


Wietse Venema
IBM T.J. Watson Research
P.O. Box 704
Yorktown Heights, NY 10598, USA
Wietse Venema
Google, Inc.
111 8th Avenue
New York, NY 10011, USA