وقتی npm اسم پکیج رو با typosquatting اشتباه میگیره
خلاصهٔ کاملتر
نویسنده این پست، توسعهدهنده پروژه Storyteller، میخواست برای ابزار خط فرمانش که اسم بلند @storyteller-platform/align رو داره یه اسم کوتاه بذاره: estee (از روی حروف ST). ولی موقع انتشار نسخه 0.0.1 روی npm خطای 403 گرفت با این پیام که اسم پکیج زیادی شبیه espree و testem هست. نویسنده میگه espree رو یه جوری میفهمه، ولی testem اصلاً غلط تایپی estee حساب نمیشه.
به گفته نویسنده، npm از Levenshtein distance استفاده میکنه (یعنی تعداد درج، حذف یا جایگزینی تکحرفی که لازمه تا یه رشته به اون یکی برسه) و هر اسمی که فاصلهش با یه پکیج محبوب ۲ یا کمتر باشه رو بلاک میکنه. از estee به testem دقیقاً دو ویرایشه: یه t اول اضافه کن و یه m آخر. جالبیش اینه که خود Storyteller هم تو نسخههای اولش از همین الگوریتم برای پیدا کردن جملهها تو متن کتاب صوتی استفاده میکرده.
مشکل اصلی، به گفته نویسنده، اینه که یه آستانه ثابت برای رشتههای کوتاه جواب نمیده. npm بیست و نه کاراکتر مجاز داره (a تا z بهعلاوه نقطه، خط تیره و آندرلاین)، پس برای اسمهای چهارحرفی ۷۰۷٬۲۸۱ حالت ممکنه. ولی چون با دو تا جایگزینی میشه از هر رشته چهارحرفی به هر رشتهای با همون دو حرف اول رسید، حداکثر ۸۴۱ اسم میتونه وجود داشته باشه. یعنی فقط حدود ۰٫۱۲ درصد فضای اسمها واقعاً قابل استفادهست.
اسم جایگزینشون، hoid، هم رد شد و این بار لیست «شبیهها» خیلی بلندتر بود: hoek، hono، uid، ulid، cuid، uuid، joi، gopd، poi و zod. نویسنده میگه هیچکدوم شبیه غلط تایپی hoid نیستن و همه حداقل ۵۰ درصد باهاش فرق دارن. اون اشاره میکنه که با این قانون، preact بهخاطر react و estree بهخاطر espree هیچوقت ساخته نمیشدن.
نویسنده قبلاً یه بار برای کلمه audiobook که npm بلاکش کرده بود به پشتیبانی پیام داده بود و سریع مشکل حل شد. ولی این بار پشتیبانی گفت نمیتونن بلاک typosquatting (یعنی ثبت اسمهای شبیه پکیجهای معروف برای پخش بدافزار) رو دور بزنن و به یه پست وبلاگی ارجاع داد که اصلاً درباره قانون دیگهای، یعنی اسمهایی که فقط تو علائم نگارشی فرق دارن، بود. نویسنده معتقده بالاخره یکی تو npm/GitHub میتونه از پنل ادمین این کارو بکنه.
آخرش هم احتمالاً اسم estie رو انتخاب میکنن که به هیچ فیلتر شباهتی گیر نمیکنه. نویسنده قبول داره که npm زیر فشار جلوگیری از بدافزاره و یه مقدار خودکارسازی لازمه، ولی ناراحته که بهخاطر این قانون، ساختن پکیج با اسم یک تا چهارحرفی عملاً دیگه ممکن نیست. پیشنهادش اینه که حداقل یه راه بررسی دستی وجود داشته باشه.
نکات کلیدی:
- npm اسم estee رو بهخاطر شباهت به espree و testem با خطای 403 رد کرد.
- قانون فعلی، طبق برداشت نویسنده، هر اسم با Levenshtein distance حداکثر ۲ از پکیجهای محبوب رو بلاک میکنه.
- برای اسمهای چهارحرفی از ۷۰۷٬۲۸۱ حالت فقط حداکثر ۸۴۱ تا (حدود ۰٫۱۲ درصد) قابل استفادهست.
- اسم hoid هم بهخاطر ۱۰ پکیج از جمله zod، uuid و joi رد شد.
- پشتیبانی npm گفت بلاک typosquatting قابل دور زدن نیست.
- جایگزین احتمالی پروژه، اسم estie هست.




