چرا خروجی VPN و زبان مرورگر شما با هم نمیخوانند
Accept-Language زبان پاسخ را میخواهد؛ VPN آدرس مبدأ را تغییر میدهد. وقتی سایتی بومیسازیشده به نظر میرسد، سه ورودی تعیین میکنند کدام یک برنده شده است.
ابزارهای توسعهدهنده را باز کنید، صفحه را بارگذاری کنید و پیش از هر نتیجهگیری درباره VPN، سرآیندهای درخواست را بخوانید. معمولاً خطی با نام Accept-Language پیدا میکنید که مجموعهای مشخص از زبانها را میخواهد و آن خط از تنظیمات مرورگر شما میآید، نه از آدرس خروج. یک فرانسهزبان روی خروجی توکیو همچنان فرانسه میفرستد و سایتی که به فرانسه پاسخ میدهد، به همان سرآیند پاسخ میدهد. تونل فقط به این دلیل که صفحه به زبانی آشنا رسیده نشت نمیکند.
پیش از هر چیز سرآیند را بخوانید
در مرورگر رومیزی، پنل شبکه را باز کنید، صفحه را دوباره بارگذاری کنید، روی درخواست سند کلیک کنید و زیر سرآیندهای درخواست را ببینید. از ترمینال هم میتوانید همین را بدون مرورگر ببینید و میتوانید مقدار را بازنویسی کنید تا رفتار سایت را بیازمایید:
curl -sS -D /tmp/h1 -o /tmp/b1 https://example.com
curl -sS -D /tmp/h2 -o /tmp/b2 -H 'Accept-Language: fr,en;q=0.6' https://example.com
grep -o 'lang="[^"]*"' /tmp/b1 /tmp/b2
diff /tmp/b1 /tmp/b2 | head -40
اکنون بدنه روی دیسک است، پس مقایسه درباره صفحه است نه درباره سرآیندی که ممکن است هرگز فرستاده نشود. به ویژگی lang در تگ html و به متن نمایان نگاه کنید، چون Content-Language اختیاری است و بسیاری از سرورها آن را حذف میکنند. بنابراین سایتی که کل صفحه را روی همان URL از انگلیسی به فرانسه تغییر میدهد، در مقایسهای که تنها سرآیندها را میبیند بیتغییر به نظر میرسد. اگر زبان سند از سرآیند پیروی کند در حالی که خروج ثابت بماند، سرآیند ورودی تعیینکننده بوده و VPN به آن مشاهده ربطی ندارد.
برای این آزمون از نمایه دوم مرورگر استفاده کنید، نه از تغییردهنده زبان خود سایت. تغییردهنده معمولاً یک کوکی مینویسد که ورودی دیگری است و در پایان کوکی را به جای سرآیند اندازه میگیرید.
مقدارهای q چه معنایی دارند و چه معنایی ندارند
RFC 9110 در بخش 12.5.4 Accept-Language را فهرستی از زبانهای طبیعی ترجیحی برای پاسخ تعریف میکند. هر مدخل میتواند وزنی از 0 تا 1 داشته باشد، بازهای بدون وزن وزن 1 دارد و وزن 0 یک زبان را غیرقابلپذیرش میکند. این یک ترتیب ترجیح است و نه بیشتر.
این مقدار گزارش مکان نیست، امتیاز اطمینان نیست و هویت نیست. سرور آزاد است آن را نادیده بگیرد، تنها ترجمهای را که دارد ارائه دهد یا بگذارد تغییرمسیر مبتنی بر کشور برنده شود. مذاکره محتوا انتخاب سرور است و سرآیند ورودی آن انتخاب است، نه فرمان.
این همان بخشی است که مردم از دست میدهند وقتی صفحه بومیسازیشده را آزمون مکان میپندارند. سرآیند میگوید شخص ترجیح میدهد چه زبانهایی را بخواند و ترجیح میتواند به هر جا سفر کند.
سه ورودی تعیین میکنند واقعاً چه زبانی میگیرید
آنها را یکییکی جدا کنید، چون از بیرون نمیبینید کدام برنده شده است:
- سرآیند. با نمایه دومی که برای فهرست زبانی دیگری تنظیم شده آزمون کنید و ببینید صفحه تغییر میکند در حالی که بقیه چیزها ثابت میمانند.
- انتخاب ذخیرهشده. در پنجره خصوصی بدون کوکی آزمون کنید یا حافظه سایت را پاک کنید. تنظیمات حساب و ورودیهای localStorage میتوانند یک زبان را ماهها ثابت نگه دارند.
- URL یا تغییرمسیر. با درخواست مسیر صریح زبان، مانند
/fr/، و با رصد کدهای وضعیت تغییرمسیری که بر آدرس مبدأ استوار است آزمون کنید.
سه آزمون را به همین ترتیب اجرا کنید و بنویسید کدام نتیجه را جابهجا کرد. یک بار بارگذاری صفحه که پس از فعالسازی VPN زبان را عوض میکند شواهد ضعیفی است، چون هم تغییرمسیر و هم کوکی ذخیرهشده در حافظه پنهان میتوانند آن تصور را بسازند.
VPN چه چیزی را تغییر میدهد و چه چیزی را نه
تونل آدرس مبدأ را که سرور میبیند تغییر میدهد و با آن هر چیزی را که سرور از مکانیابی IP استنتاج میکند. ترجیحات زبان مرورگر را بازنویسی نمیکند، تنظیم ذخیرهشده را پاک نمیکند و URLی را که تایپ کردهاید تغییر نمیدهد. آن ورودیها دقیقاً همانجا میمانند، پس صفحه میتواند پس از جابهجایی خروج زبان قدیمی خود را نگه دارد.
مکانیابی نویز خودش را اضافه میکند. پایگاههای داده آدرس با هم اختلاف دارند و خروجی که در یک کشور ثبت شده ممکن است به کشور دیگری نگاشت شود، که تغییرمسیر مبتنی بر کشور را به دلایلی بیربط با مرورگر شما اشتباه نشان میدهد.
یک بررسی سریع آنها را جدا میکند: صفحه را تازه درخواست کنید، آدرسی را که ارائه میدهید یادداشت کنید و سپس زبان پاسخ را با فهرست سرآیند خود مقایسه کنید. اگر زبان با فهرست شما همخوان باشد نه با کشور خروج، سرآیند ورودی تعیینکننده بوده و چیزی در تونل برای درست کردن نیست.
صفحه بومیسازیشده چه چیزی را ثابت میکند و چه چیزی را نه
اینجا یک نکته واقعی درباره حریم خصوصی هست و کوچکتر از چیزی است که مردم معمولاً مطرح میکنند. فهرست کامل ترجیحات زبان یک ورودی برای اثر انگشت است و میتواند چیزی درباره اینکه چه کسی هستید یا چه میخوانید آشکار کند. این افشای واقعی ترجیح است و با اثبات اینکه ترافیک از تونل خارج شده یکی نیست.
صفحه بومیسازیشده نشانگر نشت نیست. اگر واقعاً میخواهید نشت را بیازمایید، آدرس خروجی را که سایت میبیند، مسیر resolver را که برای جستوجوی نام استفاده میشود و نامزدهایی را که پشته WebRTC آشکار میکند بررسی کنید. آن آزمونها به پرسشی پاسخ میدهند که زبان صفحه نمیتواند.
دفعه بعد که سایتی به نظر میرسد کشور شما را میداند، اول سرآیندهای درخواست را باز کنید. اگر زبان پاسخ با فهرست مرورگر شما همخوان باشد، چیزی نشت نکرده و لایهای که باید ببینید همان لایه پیش روی شماست.