REMOTE_ADDR در PHP پشت یک VPN واقعاً چه میگوید
این مقداری است که وبسرور شما فراهم کرده، نه جستوجویی در تونل. مسیر درخواست را دنبال کنید، بررسی کنید چه کسی میتواند بازنویسیاش کند و هویت را در برنامه نگه دارید.
کسی میپرسد چرا کاربر VPN در گزارش برنامه با نشانی ظاهر میشود که به دروازه تعلق دارد، یا با نشانی که بعد از ناهار تغییر کرده است. پاسخ با این شروع میشود که این مقدار چیست: ورودیای که وبسرور در محیط درخواست قرار داده است. این جستوجویی در تونل نیست، هویت گواهی نیست و وعدهای نیست که شماره به یک شخص تعلق دارد. خواندنش بهعنوان هر یک از این سه، پاسخهای مطمئنی میدهد که به شیوههای مختلف غلطاند.
مقدار از سرور میآید، نه از تونل
PHP محیط درخواست را از چیزی میگیرد که اسکریپت را اجرا کرده است. مرجع متغیرهای سرور در PHP این ورودیها را ساختهشده توسط وبسرور توصیف میکند، و دسترسپذیریشان به این بستگی دارد که درخواست چگونه رسیده است.
اسکریپتی که بهعنوان قلاب خط فرمان VPN اجرا میشود زمینه اجرای کاملاً دیگری است. درخواست وب، سوکت کلاینت و REMOTE_ADDR ندارد، و به همین دلیل کد وبی که به قلاب کپی شود مقدارهای خالی میدهد نه مقدارهای غلط. قلاب محیط خودش را دارد که دیمن آن را پر میکند و جداگانه مستند شده است. دست بردن به REMOTE_ADDR در آنجا دست بردن به متغیری است که هرگز تنظیم نشده است.
این تفاوت را در ذهن نگه دارید پیش از اینکه دو گزارش را مقایسه کنید. شاید درخواست یک صفحه را با یک قلاب مقایسه میکنید و این اصلاً مقایسه نیست. نخست زمینه اجرا را بررسی کنید و سپس نشانی را.
پیش از اعتماد به شماره، مسیر درخواست را دنبال کنید
نشانی گزارششده همتای همان اتصالی است که وبسرور دیده است. هر چیزی بین کلاینت و آن سرور بگذارید و همتا تغییر میکند. ترجمه، پایانهسازی و توازن بار هر یک مشاهده را یک گام دورتر از کاربر میبرند.
چهار مسیر رایج چهار مشاهده متفاوت میدهد.
| Path to the listener | What can be reported |
|---|---|
| Client routed straight to the private listener, no translation | The client's tunnel address |
| Gateway translates the source before forwarding | The gateway's translated address |
| Reverse proxy terminates the client and opens its own backend connection | The proxy's backend address |
| Load balancer in front of two proxies | Whichever hop the server treats as its peer |
مسیر را با نام مقصد، خانواده نشانی و هر نقطه ترجمه بنویسید. بدون این نقشه، مقدار درست و مقدار غلط در یک خط گزارش یکسان به نظر میرسند. دو خط نمودار یک بعدازظهر بحث را صرفهجویی میکند.
جانشینی فقط جایی رخ میدهد که پیکربندی شده باشد
سرور یا چارچوب میتواند آگاهانه نشانی کلاینت را جانشین کند. ماژول remote-IP در Apache و ماژول real-IP در NGINX هر دو این کار را میکنند، و مقداری که PHP میگیرد به این پیکربندی و پارامترهای دادهشده به گرداننده اسکریپت بستگی دارد.
پس REMOTE_ADDR همیشه همتای TCP دستنخورده نیست. همتایی است که سرور پس از اعمال سیاست خودش تصمیم گرفته گزارش کند. این تفاوت تعیین میکند که مقدار سند است یا تزیین.
از صاحب سرور بپرسید کدام فیلد در این استقرار معتبر است و همتای اصلی هنگام جانشینی چگونه حفظ میشود. اگر هیچکس نتواند پاسخ دهد، گزارش هنوز چیزی را ثابت نمیکند.
سرآیندهای ارجاع را با اعتماد نخوانید
فراخواننده میتواند خودش سرآیندهای ارجاع را بفرستد. در نظر گرفتن نخستین ورودی جداشده با ویرگول بهعنوان نشانی تأییدشده کاربر یعنی تصمیم به باور هر کسی که متصل میشود، که نقطه مقابل هدف سرآیند است. سرآیند یک زنجیره را توصیف میکند و فقط یک لایه مورد اعتماد میتواند ضامن آن زنجیره باشد.
از پشتیبانی پروکسی مورد اعتماد سرور یا چارچوب با زنجیره واقعی پروکسی پیکربندیشده استفاده کنید و بگذارید مقدارهای منابع بیرون از آن زنجیره را دور بریزد. تجزیه دستنویس جایی است که بیشتر خرابیهای جالب زندگی میکنند.
نشانی گزارششده توسط پروکسی نیز منبع بستهای را که دیوار آتش بالادست میبیند تغییر نمیدهد. فراداده HTTP و فیلتر شبکه را دو مشاهده جدا نگه دارید، چون به دو پرسش متفاوت پاسخ میدهند.
برای تصمیمها از هویت برنامه استفاده کنید
برای دسترسی به سوابق یک کاربر به اصل احراز هویتشده و قواعد مجوزدهی برنامه تکیه کنید. نشانی داخلی میتواند دوباره تخصیص یابد و یک نشانی ترجمهشده میتواند نماینده صدها کاربر همزمان باشد. هیچیک از این دو ویژگی را بررسی نشانی نمیتواند ترمیم کند.
اگر بهرهبرداری باید درخواستی را به یک نشست VPN پیوند دهد، نشانی مشاهدهشده و مهر زمانی را بر پایه مدل ترجمهای که مستند کردهاید به سوابق مرجع نشست پیوند دهید. این پیوندی میسازد که میتوانید از آن دفاع کنید؛ نشانی تنها چنین نمیکند.
برای عیبیابی، همان چند فیلد لازم را ثبت کنید نه کل آرایه سرور را که ممکن است سرآیندها و مواد احراز هویت را حمل کند. نتیجه مفید میگوید این مقدار در این استقرار چه معنایی دارد، نه اینکه کدام مقدار بیشتر شبیه کلاینت است.