من خیلی طرفدار رسم دروغ ۱۳ و یا دروغ اول ماه اپریل (April's Fools Day) نیستم. اطلاعی ندارم که این رسم از کجا شروع شده است و هدف از آن چه بوده است. ولی از آنجا که امروز خودم برای مدتی درگیر آن بودم، گفتم که درباره آن بنویسم.
مثل همیشه در هنگام کار برای مرور جزئیات و کلیات دستورات ترمینال و Bash Script در حال جستوجو بودم و با دیدن لینک صفحه StackOverflow با خیال آسوده، میدانستم که اطلاعات مورد نیاز اولیه در این صفحه در دسترس است. بعد از مطالعه چند صفحه و دنبال کردن چند لینک، طبق عادت، کلمات کلیدی را از روی صفحه سایت StackOverflow کپی کردم و در این هنگام متوجه یک پیام جدید، عجیب و غیر منتظره شدم (شکل زیر).
متن پیام، عجیب، غیر منتظره و غیر منطقی بود. برای اطمینان چند تا متن دیگر را کپی کردن و شمارنده کم شد. من میدانستم که هیچ راهی وجود ندارد که سایت StackOverflow بخواهد به راحتی جلوی کپی و پیست کردن مطالب را بگیرد. نمیخواهم وارد یک بحث فنی شوم ولی وقتی مرورگر شما صفحات وب را به صورت HTML دریافت میکند تمام اطلاعات لازم در آن قرار دارد. پس حتی اگر سعی کند با استفاده از جاوا اسکریپت جلوی کلیدهای ترکیبی و راست کلیک را بگیرد، باز هم نمیتواند متن اطلاعات را از دسترس دور نگهدارد (شاید اگر تمام صفحات را از HTML به عکس رندر کند و عکس را ارسال کند بشود ولی...). همچنین اگر با جاوا اسکریپت جلوی کپی پیست را بگیرد، آن وقت شخصی (شاید خودم، با احتمال خیلی پایین) پیدا میشود که کدی بنویسد که امکان کلیدهای ترکیبی و راست کلیک را دوباره فعال کند. برای این کار کافی است که کد جاوا اسکریپت جدید را در کنسول کپی پیست کنید و اجرا کنید. همچنین با غیر فعال کردن جاوا اسکریپت احتمالا دیگر در وهله اول امکان غیر فعال کردن وجود نخواهد داشت. به هر حال با این تفاسیر که به سرعت از ذهن من عبور کرد تقریبا مطمئن بودم که این از سمت StackOverflow نخواهد بود.
پس اگر این پیام از سمت سایت اصلی نیست، از طرف چه کسی است؟ بوی خراب کاری میآمد. پروتکل صفحه https بود و آدرس درست بود. پس phishing نیست. من تعدادی افزونه اضافی روی مرورگرم دارم. به آنها اعتماد نسبی دارم ولی هیچ وقت نمیتوان مطمئن بود. من باید مطمئن میشدم که چه کدی در هنگام کلیک بر روی گزینه Learn More اجرا میشود. با استفاده از ابزار debug در مرورگر به کد زیر رسیدم.
document.querySelector(".js-unlimited-modal-open-button").addEventListener("click", function() { return m() })
در این کد تابع m در هنگام کیک بر روی دکمه اجرا میشود. این تابع به صورت زیر پیاده سازی شده است.
function m() { var e, t, n, r, o; h(!1), document.querySelector(".js-modal-unlimited") .setAttribute("aria-hidden", "false"), y("aprilfools.notice_click", { "copy_count": c(), "variant": l() }); var i = new URL.toString()).searchParams; y("aprilfools.modal_display", { "utm_source": (e = i.get("utm_source"), null !== e && void 0 !== e ? e : ""), "utm_medium": (t = i.get("utm_medium"), null !== t && void 0 !== t ? t : ""), "utm_campaign": (n = i.get("utm_campaign"), null !== n && void 0 !== n ? n : ""), "utm_content": (r = i.get("utm_content"), null !== r && void 0 !== r ? r : ""), "utm_term": (o = i.get("utm_term"), null !== o && void 0 !== o ? o : "") }) }
با دیدن این کد تازه متوجه موضوع شدم، امروز اول اپریل است و من قربانی روز اول اپریل. این کد اطلاعات صفحهای که در حال مطالعه بودم و یکسری موارد که بشود کاربران را در وبسایتها دنبال کرد جمع میکند و یک درخواست میفرستد. تقریبا مطمئن بودم که این کد نمیتواند کار خاصی را به تنهایی بکند مگر اینکه نتیجه فراخوانی تابع y موردی داشته باشد. با مطالعه سریع بقیه قسمتهای کد تقریبا مطمئن بودم که قضیه جدی نیست. در هنگام کلیک کردن روی دکمه، صفحه فروش کلید مخصوص StackOverflow با اسم The Key که امکان Ctrl-C و Ctrl-V را به شما میدهد نشان داده میشود.
در آخر میخواهم از StackOverflow و Wikipedia و دیگر سرویسهایی که اطلاعات با ارزش را به سادگی در دسترس عموم قرار میدهند تشکر و قدردانی کنم. از تمام کسانی که محتوای آنها را ایجاد میکنند. کسانی که سوال میپرسند و کسانی که جواب میدهند. کسانی که مدیریت میکنند و کسانی که ویرایش میکنند. این حرکت دسته جمعی باعث رسیدن به نقطهای است که نبودن آنها واقعا احساس خواهد شد.
اگر شما هم تجربه مشابه در روز اول اپریل با بقیه سرویسها داشتید و خوشحال میشوم آنها را در وقت فراغت بخوانم.