সাধারণ এনপিএম সমস্যা এবং কীভাবে সেগুলি নিরাপদে সমাধান করবেন

সর্বশেষ আপডেট: 03/16/2026
লেখক: C SourceTrail
  • বেশিরভাগ npm সমস্যা npm-এর পরিবর্তে কার্যকরী নীতি এবং অনুমতির মতো পরিবেশগত কনফিগারেশন সমস্যার কারণে ঘটে।
  • নির্ধারক ইনস্টলেশনের সাথে npm ci এবং সাবধানে ব্যবহার npm audit সরবরাহ শৃঙ্খল এবং দুর্বলতার ঝুঁকি হ্রাস করা।
  • এড়ানো sudo npm, অপ্রয়োজনীয় নির্ভরতা হ্রাস করা, এবং ব্যবহারকারী-স্তরের উপসর্গ ব্যবহার বিশ্বব্যাপী ইনস্টলগুলিকে আরও নিরাপদ এবং স্থিতিশীল রাখে।
  • ভারবোস লগিং, এনপিএম ডক্টর এবং মাঝে মাঝে পরিষ্কার পুনঃস্থাপন হল জেদী এনপিএম ত্রুটি নির্ণয় এবং সমাধানের জন্য প্রয়োজনীয় সরঞ্জাম।

npm সমস্যা সমাধানের সমস্যা

অদ্ভুত npm সমস্যার সম্মুখীন হওয়া অবিশ্বাস্যরকম হতাশাজনক হতে পারে, বিশেষ করে যখন আপনি কেবল একটি প্যাকেজ ইনস্টল করে কোডিংয়ে ফিরে যেতে চান। উইন্ডোজে পাওয়ারশেল ব্লকিং স্ক্রিপ্ট থেকে শুরু করে, লিনাক্সে অনুমতির দুঃস্বপ্ন, আপনার অডিট রিপোর্টে দুর্বলতার অন্তহীন তালিকা পর্যন্ত, npm ত্রুটিগুলি দ্রুত ঘন্টার পর ঘন্টা উৎপাদনশীলতা হারাতে পারে যদি আপনি না জানেন যে আপনি কী দেখছেন।

এই নির্দেশিকাটি আপনাকে npm ব্যবহার করার সময় সবচেয়ে সাধারণ বাস্তব-বিশ্বের সমস্যাগুলি নিয়ে আলোচনা করবে, কেন এগুলি ঘটে তা ব্যাখ্যা করবে এবং আপনাকে ব্যবহারিক, যুদ্ধ-পরীক্ষিত সমাধানগুলি দেবে। আমরা উইন্ডোজ এক্সিকিউশন নীতি, বিশ্বব্যাপী অনুমতি ত্রুটি, এনপিএম ইকোসিস্টেমের নিরাপত্তা ত্রুটি, ডেভেলপার এবং উৎপাদন দুর্বলতার মধ্যে পার্থক্য, কী কী তা দেখব। npm ci সত্যিই তাই, এবং আতঙ্কিত না হয়ে ভাঙা ইনস্টল এবং ক্যাশে সমস্যাগুলি কীভাবে ডিবাগ করবেন।

উইন্ডোজে পাওয়ারশেল এক্সিকিউশন পলিসি npm ব্লক করছে

Node.js ইনস্টল করার পর অনেক উইন্ডোজ ব্যবহারকারী যে প্রথম বাধার সম্মুখীন হন তা হল npm কেবল PowerShell-এ চলতে অস্বীকৃতি জানায়। টার্মিনালটি "ফাইল লোড করতে পারছি না" এর মতো একটি ত্রুটি ছুঁড়ে দেয়। C:\Program Files\nodejs\npm.ps1 কারণ এই সিস্টেমে স্ক্রিপ্ট চালানো নিষ্ক্রিয় করা আছে", একসাথে একটি PSSecurityException এবং পড়ার জন্য একটি পরামর্শ about_Execution_Policies.

এই সমস্যাটির সাথে Node.js এর খারাপ ইনস্টলেশনের কোনও সম্পর্ক নেই; এটি একটি PowerShell নিরাপত্তা বৈশিষ্ট্য যাকে এক্সিকিউশন পলিসি বলা হয়। ডিফল্টরূপে, কিছু উইন্ডোজ সেটআপ কোনও স্থানীয় স্ক্রিপ্ট (npm এর নিজস্ব PowerShell র‍্যাপার সহ) চলতে বাধা দেয়, যা PowerShell কে ট্রিট করে npm.ps1 সম্ভাব্য অনিরাপদ কন্টেন্ট হিসেবে।

এটি ঠিক করার জন্য, সিস্টেম স্তরে সম্পূর্ণরূপে নিরাপত্তা অক্ষম করার পরিবর্তে, আপনার বর্তমান ব্যবহারকারীর জন্য PowerShell এক্সিকিউশন নীতিটি সাধারণত শিথিল করতে হবে। একটি সাধারণ পদ্ধতি হল প্রশাসক হিসেবে PowerShell চালানো এবং একটি কমান্ড ব্যবহার করা যেমন Set-ExecutionPolicy RemoteSigned -Scope CurrentUser, যা স্বাক্ষরবিহীন দূরবর্তী স্ক্রিপ্টগুলিকে ব্লক করার সময় স্থানীয়ভাবে তৈরি স্ক্রিপ্টগুলিকে অনুমতি দেয়।

যদি আপনি PowerShell নীতি একেবারেই পরিবর্তন না করতে চান, তাহলে আপনি Command Prompt (cmd.exe) অথবা ভিন্ন শেল সহ Windows Terminal ব্যবহার করে এটি সমাধান করতে পারেন। ঐ পরিবেশে npm PowerShell স্ক্রিপ্টের মধ্য দিয়ে যায় না, তাই সীমাবদ্ধতা প্রযোজ্য হয় না এবং আপনার npm যতক্ষণ Node.js আপনার PATH-তে সঠিকভাবে যোগ করা হয় ততক্ষণ কমান্ডগুলি চালানো উচিত।

npm ci আসলে কী করে এবং কেন এটি গুরুত্বপূর্ণ

একবার npm চালু হলে, আরেকটি কমান্ড যা প্রায়শই প্রশ্ন উত্থাপন করে তা হল npm ci, যা আরও পরিচিত থেকে ভিন্নভাবে আচরণ করে npm install. উভয়ই নির্ভরতা ইনস্টল করার সময়, npm ci বিশেষভাবে পরিষ্কার, পুনরুৎপাদনযোগ্য পরিবেশ যেমন ক্রমাগত ইন্টিগ্রেশন (CI) পাইপলাইনের জন্য ডিজাইন করা হয়েছে।

মূল পার্থক্য হল যে npm ci সংস্করণ পরিসর উপেক্ষা করে package.json এবং ঠিক পিন করা সংস্করণগুলি ইনস্টল করে package-lock.json. এর মানে হল, "সামঞ্জস্যপূর্ণ কিন্তু নতুন" নির্ভরতা সংস্করণগুলি আপনার বিল্ডে লুকিয়ে প্রবেশ করবে না কারণ সেগুলি পরে প্রকাশিত হয়েছে; যতক্ষণ পর্যন্ত লকফাইল একই থাকে ততক্ষণ পর্যন্ত প্রতিটি ইনস্টলেশন নির্ধারক।

কর্মক্ষমতার দৃষ্টিকোণ থেকে, npm ci সাধারণত CI-এর জন্য দ্রুততর কারণ এটি নির্দিষ্ট নির্ভরতা সমাধানের ধাপগুলি এড়িয়ে যায় এবং একটি পরিষ্কার স্লেট ধরে নেয়। এটি আশা করে যে আপনার node_modules ডিরেক্টরিটি হয় খালি আছে অথবা মুছে ফেলা হবে, যা npm কে অনেক অতিরিক্ত চেক এবং আপডেট এড়াতে দেয় যা npm install সাধারণত পারফর্ম করবে।

নিরাপত্তা এবং সরবরাহ শৃঙ্খলের দৃষ্টিকোণ থেকে, npm ci আপনার প্রোডাকশন বিল্ডে অপর্যালোচিত নির্ভরতা পরিবর্তনের ঝুঁকি উল্লেখযোগ্যভাবে হ্রাস করে। যেহেতু এটি কখনই নতুন সামঞ্জস্যপূর্ণ সংস্করণের সন্ধান করে না, তাই আপনি কার্যকরভাবে আপনার নির্ভরতা ট্রিকে আপনার টিম যা লক এবং অডিট করেছে তাতে ফ্রিজ করছেন, যার ফলে ঘটনা পুনরুৎপাদন এবং দুর্বলতা বিশ্লেষণ অনেক সহজ হয়ে যাচ্ছে।

নিরাপত্তা-কেন্দ্রিক দলগুলি প্রায়শই একত্রিত হয় npm ci স্বয়ংক্রিয় নির্ভরতা স্ক্যানিং সরঞ্জামগুলির সাহায্যে যা প্রতিটি প্যাকেজ পরিদর্শন করে, যার মধ্যে লক করা প্যাকেজগুলিও রয়েছে package-lock.json ফাইল. এইভাবে, আপনার লকফাইলটি যখন তৈরি করা হয়েছিল তখন পরিষ্কার থাকলেও, অ্যাপ্লিকেশনটি স্থাপনের আগে CI বিল্ডের সময় নতুন আবিষ্কৃত দুর্বলতা বা ক্ষতিকারক প্যাকেজগুলি এখনও ধরা পড়তে পারে।

বিশ্বব্যাপী npm অনুমতি এবং "sudo npm কখনও ব্যবহার করবেন না" নিয়ম

ইউনিক্স-সদৃশ সিস্টেমে (লিনাক্স, ম্যাকওএস), এনপিএম সমস্যার সবচেয়ে কুখ্যাত বিভাগগুলির মধ্যে একটি হল উন্নত সুবিধা সহ গ্লোবাল প্যাকেজ ইনস্টল করা। যদি আপনি কখনও "লেখার অ্যাক্সেস মিস করা হচ্ছে" এর মতো সতর্কতা দেখে থাকেন /usr/lib/node_modules"অথবা ত্রুটি যেমন EACCES: permission denied, আপনি এই শ্রেণীর সমস্যার সম্মুখীন হয়েছেন।

ডিফল্টরূপে, npm প্রায়শই বিশ্বব্যাপী ইনস্টল করা প্যাকেজগুলিকে এর অধীনে রাখার চেষ্টা করে /usr (উদাহরণ স্বরূপ /usr/lib/node_modules এবং এক্সিকিউটেবল /usr/bin), যা সাধারণত রুটের মালিকানাধীন সিস্টেম ডিরেক্টরি। যখন ব্যবহারকারীরা দৌড়াতে শুরু করে sudo npm install -g ... অনুমতি ত্রুটি "সমাধান" করার জন্য, ফাইল এবং ডিরেক্টরিগুলি রুটের মালিকানাধীন হয়ে যায়, যার ফলে পরবর্তী কমান্ডগুলি স্বাভাবিক ব্যবহারকারী হিসাবে চালানোর সময় লেখার অ্যাক্সেসের সমস্যা দেখা দেয়।

মূল কথাটি সহজ: npm কে রুট হিসেবে ব্যবহার করবেন না এবং ব্যবহার এড়িয়ে চলুন sudo npm দিয়ে, যদি না আপনি পুরোপুরি নিশ্চিত হন যে আপনি কী করছেন। অনুমতি বিশৃঙ্খলার পাশাপাশি, রুট হিসাবে তৃতীয় পক্ষের জাভাস্ক্রিপ্ট ইনস্টল করলে যেকোনো ক্ষতিকারক বা আপোস করা প্যাকেজের প্রভাবও বৃদ্ধি পায়, যা এটিকে আপনার সিস্টেমের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়।

npm বর্তমানে বিশ্বব্যাপী প্যাকেজগুলি কোথায় রাখছে তা পরীক্ষা করতে, আপনি চালাতে পারেন npm config get prefix, যা সাধারণত এরকম কিছু ফেরত দেবে /usr সমস্যাযুক্ত সেটআপে। এই উপসর্গটি নির্ধারণ করে যে গ্লোবাল মডিউল এবং তাদের বাইনারিগুলি কোথায় শেষ হবে, তাই যদি উপসর্গটি কোনও সিস্টেমের পথে নির্দেশ করে, তাহলে দীর্ঘমেয়াদে অনুমতির সমস্যা প্রায় অনিবার্য।

একটি নিরাপদ, প্রস্তাবিত সমাধান হল আপনার ব্যবহারকারীর হোম ডিরেক্টরিতে গ্লোবাল npm প্রিফিক্সটি সরানো, যেখানে উন্নত সুবিধা ছাড়াই আপনার সম্পূর্ণ নিয়ন্ত্রণ থাকবে। একটি সাধারণ প্যাটার্ন হল একটি ডিরেক্টরি তৈরি করা যেমন ~/.npm-global এবং তারপর চালান npm config set prefix '~/.npm-global' যাতে ভবিষ্যতের সমস্ত গ্লোবাল সেখানে জমি স্থাপনের পরিবর্তে সেখানে স্থাপন করে /usr.

প্রিফিক্স পরিবর্তন করার পর, আপনাকে অবশ্যই আপনার PATH-তে নতুন গ্লোবাল বাইনারি ডিরেক্টরি যোগ করতে হবে যাতে সিস্টেমটি বিশ্বব্যাপী ইনস্টল করা কমান্ডগুলি খুঁজে পেতে পারে। উদাহরণস্বরূপ, আপনি একটি লাইন যোগ করতে পারেন যেমন export PATH=~/.npm-global/bin:$PATH আপনার শেল স্টার্টআপ ফাইলে (যেমন ~/.bashrc or ~/.zshrc), তারপর টার্মিনালটি পুনরায় চালু করুন যাতে পরিবর্তনটি কার্যকর হয়।

এটি সঠিকভাবে কনফিগার হয়ে গেলে, পুনরায় চালু করা হবে npm doctor একটি ভালো স্যানিটি চেক হয়ে ওঠে: এটি রিপোর্ট করা উচিত যে ক্যাশে করা ফাইল এবং বিশ্বব্যাপী node_modules আপনার বর্তমান ব্যবহারকারী দ্বারা পঠনযোগ্য এবং লেখাযোগ্য। মনে রাখবেন যে যখন আপনি একটি নতুন গ্লোবাল ডিরেক্টরিতে স্যুইচ করবেন, তখন পূর্বে ইনস্টল করা গ্লোবাল প্যাকেজগুলি আর উপস্থিত থাকবে না এবং আপনাকে যেগুলি ব্যবহার করছেন সেগুলি পুনরায় ইনস্টল করতে হবে।

পরিবেশগত সমস্যা নির্ণয়ের জন্য npm ডাক্তার ব্যবহার করা

অনেক npm মাথাব্যথার কারণ কোনও নির্দিষ্ট প্রকল্প নয় বরং আপনার মেশিনে একটি ভাঙা বা অসঙ্গত npm পরিবেশ। আদেশ npm doctor ঠিক এই জন্যই তৈরি করা হয়েছে: এটি আপনার npm সেটআপে স্বাস্থ্য পরীক্ষা চালায় এবং সম্ভাব্য সমস্যাগুলি তুলে ধরে।

যখন আপনি কার্যকর করবেন npm doctor, npm রেজিস্ট্রির সাথে সংযোগ পরীক্ষা করে, আপনার npm এবং Node.js সংস্করণ যাচাই করে, আপনার কনফিগার করা রেজিস্ট্রি URL পরীক্ষা করে এবং ক্যাশে ফোল্ডার এবং গ্লোবাল মডিউল ডিরেক্টরিগুলিতে অনুমতি পরীক্ষা করে। প্রতিটি চেক "ঠিক আছে" বা "ঠিক নেই" স্ট্যাটাস সহ রিপোর্ট করা হয়, যার ফলে ভুল কনফিগারেশন সনাক্ত করা সহজ হয়।

উদাহরণস্বরূপ, যদি npm খুঁজে পায় যে ডিরেক্টরিগুলি যেমন /usr/lib/node_modules or /root/.npm আপনার সাধারণ ব্যবহারকারী দ্বারা লেখা যায় না, তাহলে আপনি অনুমতি-সম্পর্কিত আইটেমগুলিকে লাল রঙে "notOk" হিসেবে চিহ্নিত দেখতে পাবেন। এটি একটি শক্তিশালী ইঙ্গিত যে npm পূর্বে root হিসাবে বা মাধ্যমে চালানো হত sudo, রুট-মালিকানাধীন ফাইলগুলিকে পিছনে ফেলে যা স্বাভাবিক ক্রিয়াকলাপগুলিকে ব্লক করে।

doctor কমান্ডটি npm-এর প্রত্যাশা অনুপস্থিত সরঞ্জামগুলিও প্রকাশ করতে পারে, যেমন Git, যা কিছু নির্ভরশীলতার জন্য প্রয়োজনীয় যারা প্রকাশিত রেজিস্ট্রি প্যাকেজের পরিবর্তে Git URL ব্যবহার করে। যদি Git ইনস্টল না থাকে অথবা আপনার PATH-তে না থাকে, তাহলে আপনি একটি সতর্কতা দেখতে পাবেন যেখানে আপনাকে এটি ইনস্টল করে আবার চেষ্টা করার জন্য অনুরোধ করা হবে।

যেকোনো সমস্যা সমাধানের পর npm doctor রিপোর্ট অনুসারে, এটি আবার চালানোর ফলে সমস্ত সবুজ "ঠিক আছে" স্ট্যাটাস দেখাবে, যা একটি সুস্থ npm ইনস্টলেশন নির্দেশ করে। যখনই আপনার সন্দেহ হয় যে আপনার সিস্টেম-ব্যাপী npm কনফিগারেশন ইনস্টল বা অডিটের সময় আপনি যে অদ্ভুত ত্রুটিগুলি দেখতে পান তার পিছনে থাকতে পারে, তখনই এই কমান্ডটিকে একটি মৌলিক স্বাস্থ্য-পরীক্ষা হিসাবে বিবেচনা করুন।

এনপিএম ইকোসিস্টেম কতটা ভঙ্গুর হতে পারে: বিখ্যাত ঘটনা এবং ঝুঁকি

স্থানীয় কনফিগারেশনের সমস্যাগুলির বাইরেও, এটি বোঝা গুরুত্বপূর্ণ যে একটি বাস্তুতন্ত্র হিসাবে npm-এর নিজস্ব কাঠামোগত ঝুঁকি রয়েছে, যা বিশাল নির্ভরতা গাছ এবং মূলত স্বেচ্ছাসেবক রক্ষণাবেক্ষণকারীদের দ্বারা পরিচালিত হয়। আধুনিক জাভাস্ক্রিপ্ট প্রকল্পগুলি প্রায়শই শত শত বা এমনকি হাজার হাজার প্যাকেজ সংগ্রহ করে, অনেকগুলি কেবল একজন বা দুজন লোক তাদের অবসর সময়ে রক্ষণাবেক্ষণ করে।

এই চরম বিভাজনের ফলে আপনার চূড়ান্ত আবেদনে যা কিছু আসে তা ম্যানুয়ালি পর্যালোচনা করা প্রায় অসম্ভব হয়ে পড়ে, যা দরজা খুলে দেয় এনপিএম-এর উপর সরবরাহ শৃঙ্খলের আক্রমণ এবং সূক্ষ্ম দুর্বলতা। একটি একক আপোষিত বা পরিত্যক্ত প্যাকেজ নির্ভরতা গ্রাফের মধ্য দিয়ে ক্যাসকেড করতে পারে এবং ডেভেলপাররা তাৎক্ষণিকভাবে বুঝতে না পেরে বিপুল সংখ্যক প্রকল্পকে প্রভাবিত করতে পারে।

এই ভঙ্গুরতার একটি সর্বোত্তম উদাহরণ হল ২০১৬ সালের ঘটনা যা একটি ক্ষুদ্র প্যাকেজের সাথে জড়িত ছিল যার নাম left-pad, যা প্রায় ১১টি লাইনের কোড নিয়ে গঠিত। এর একমাত্র উদ্দেশ্য ছিল বাম দিকে একটি অক্ষর দিয়ে স্ট্রিংগুলিকে প্যাড করা যতক্ষণ না তারা একটি নির্দিষ্ট দৈর্ঘ্যে পৌঁছায়, তবুও এটি প্রত্যক্ষ এবং পরোক্ষভাবে অসংখ্য প্যাকেজ এবং ব্যাবেল জাভাস্ক্রিপ্ট কম্পাইলারের মতো প্রধান সরঞ্জাম দ্বারা ব্যবহৃত হয়েছিল।

লেখক এবং npm-এর মধ্যে বিরোধের পর, রক্ষণাবেক্ষণকারী তার বেশ কয়েকটি প্যাকেজ অপ্রকাশিত করার সিদ্ধান্ত নেন, যার মধ্যে রয়েছে left-pad, রেজিস্ট্রি থেকে। যেহেতু npm সেই সময়ে প্রকাশিত সংস্করণগুলির অপরিবর্তনীয় স্ন্যাপশট সংরক্ষণ করত না, তাই অপসারণের ফলে তাৎক্ষণিকভাবে বিশ্বজুড়ে সেই সঠিক সংস্করণগুলির উপর নির্ভরশীল বিল্ডগুলি ভেঙে যায়, যার ফলে ডেভেলপাররা ব্যর্থ ইনস্টলেশনের সমস্যায় পড়ে যায়।

এক অভূতপূর্ব পদক্ষেপে, npm Inc. এর সর্বশেষ পরিচিত সংস্করণটি পুনরুদ্ধার করেছে left-pad লেখকের সম্মতি ছাড়াই, বাস্তুতন্ত্রকে তার পায়ে ফিরিয়ে আনার জন্য। এই সিদ্ধান্তটি বিতর্কিত ছিল কারণ এটি এই ধারণার বিরোধিতা করে যে লেখকরা তাদের প্যাকেজের জীবনচক্র নিয়ন্ত্রণ করেন, কিন্তু এটি আরও তুলে ধরে যে কতটা গুরুত্বপূর্ণ অবকাঠামো তুচ্ছ তৃতীয় পক্ষের মডিউলের উপর নির্ভর করতে শুরু করেছে।

প্রাপ্যতার ঘটনা ছাড়াও, এমন অসংখ্য নিরাপত্তা-কেন্দ্রিক ঘটনা ঘটেছে যেখানে জনপ্রিয় npm প্যাকেজগুলিতে ঝুঁকির সম্মুখীন হয়েছে বা গুরুতর দুর্বলতা রয়েছে বলে প্রমাণিত হয়েছে। এর মধ্যে এমন পরিস্থিতি অন্তর্ভুক্ত যেখানে রক্ষণাবেক্ষণকারীদের সামাজিকভাবে প্রকৌশলী করা হয়েছিল, পরিত্যক্ত প্যাকেজগুলির মালিকানা হাইজ্যাক করা হয়েছিল, অথবা সূক্ষ্ম বাগগুলিকে ইচ্ছামত কোড কার্যকর করার জন্য কাজে লাগানো হয়েছিল।

একটি বহুল আলোচিত উদাহরণ হল ২০১৮ সালের event-stream আপস, যেখানে একজন আক্রমণকারী একটি জনপ্রিয় স্ট্রিমিং ইউটিলিটির নিয়ন্ত্রণ অর্জন করে এবং প্রভাবিত অ্যাপ্লিকেশনগুলি থেকে ক্রিপ্টোকারেন্সি চুরি করার লক্ষ্যে কোড ইনজেক্ট করে। কারণ event-stream অন্যান্য অনেক প্যাকেজে নির্ভরতা ছিল, ক্ষতিকারক কোডটি নির্ভরতা শৃঙ্খলের মাধ্যমে নীরবে উৎপাদন সিস্টেমে ছড়িয়ে পড়ে।

আরেকটি ঘটনা হল ২০১৯ সালের কমান্ড-ইনজেকশন দুর্বলতা coa, বিভিন্ন সুপরিচিত সরঞ্জাম দ্বারা ব্যবহৃত একটি CLI সহায়ক। কিছু নির্দিষ্ট পরিস্থিতিতে, ভুলভাবে স্যানিটাইজ করা ব্যবহারকারীর ইনপুটকে ইচ্ছামত শেল কমান্ডে রূপান্তরিত করা যেতে পারে, যদি দুর্বল প্রেক্ষাপটে দুর্বলতা ট্রিগার করা হয় তবে দূরবর্তী কার্যকরকরণের দরজা খুলে দেয়।

হাই-প্রোফাইল লাইব্রেরি যেমন axios এর মধ্যে সার্ভার-সাইড রিকোয়েস্ট ফোরজি (SSRF) সমস্যাগুলির মতো দুর্বলতাও রয়েছে যা আক্রমণকারীদের সার্ভারগুলিকে অভ্যন্তরীণ সংস্থানগুলিতে অনুরোধ করার জন্য পুনঃনির্দেশিত করতে দেয়। এমনকি অতি-সাধারণ ইউটিলিটি যেমন minimist প্রোটোটাইপ দূষণ বাগ দ্বারা প্রভাবিত হয়েছিল, যার ফলে আক্রমণকারীরা বস্তুর প্রোটোটাইপগুলির সাথে হস্তক্ষেপ করতে এবং সম্ভাব্যভাবে সূক্ষ্ম, বিপজ্জনক উপায়ে অ্যাপ্লিকেশন আচরণ পরিবর্তন করতে সক্ষম হয়েছিল।

মূল শিক্ষা হল, খুব জনপ্রিয় বা আপাতদৃষ্টিতে ক্ষতিকারক বলে মনে হলেও প্যাকেজগুলি স্বয়ংক্রিয়ভাবে নিরাপদ নয়; এগুলি অন্য যেকোনো সফ্টওয়্যারের মতো শোষণ, পরিত্যক্ত বা ভুলভাবে কনফিগার করা যেতে পারে। এই কারণেই npm-এর আশেপাশে একটি সুস্থ নিরাপত্তা ভঙ্গির জন্য প্রযুক্তিগত সরঞ্জাম (অডিট, স্ক্যানিং, লকিং) এবং সাংস্কৃতিক অভ্যাস (নিয়মিত আপডেট, সাবধানে নির্ভরতা নির্বাচন, এবং সম্ভব হলে ঘরে বসে সহজ ইউটিলিটি লেখার জন্য অগ্রাধিকার) উভয়ই প্রয়োজন।

উন্নয়ন বনাম উৎপাদন পরিবেশে দুর্বলতা

যখন ডেভেলপাররা প্রথমবার চালায় npm audit একটি প্রকল্পে, দুর্বলতার দীর্ঘ তালিকাটি ভয়ঙ্কর দেখাতে পারে, কিন্তু আসলে এগুলোর সবগুলিই আপনার চলমান উৎপাদন অ্যাপ্লিকেশনকে প্রভাবিত করে না। অনেক চিহ্নিত সমস্যা এমন টুলগুলিতে থাকে যা শুধুমাত্র ডেভেলপমেন্ট বা নির্মাণের সময় ব্যবহৃত হয়।

মূল পার্থক্যটি হল নির্ভরতার মধ্যে যা ঘোষিত হয় dependencies এবং যারা এর অধীনে devDependencies in package.json. প্যাকেজগুলি devDependencies সাধারণত শুধুমাত্র বান্ডলিং, ট্রান্সপাইলিং, লিন্টিং, অথবা টেস্ট সার্ভার চালানোর মতো কাজের জন্য প্রয়োজন হয় এবং এগুলি চূড়ান্ত উৎপাদন বান্ডেল বা সার্ভার রানটাইমের অংশ হিসাবে পাঠানোর জন্য নয়।

উদাহরণস্বরূপ, সরঞ্জামগুলিতে দুর্বলতা যেমন webpack-dev-server, @angular-devkit, বা vite সাধারণত স্থানীয়ভাবে ডেভেলপ করার সময় গুরুত্বপূর্ণ, আপনার প্রোডাকশন বিল্ড স্থাপনের পরে নয়। এই ডেভেলপমেন্ট সার্ভার এবং বিল্ড টুলগুলি ক্রস-অরিজিন কোড লিকেজ বা SSRF-এর মতো আচরণের মতো আক্রমণাত্মক পৃষ্ঠগুলিকে প্রকাশ করতে পারে, তবে কেবল ততক্ষণ পর্যন্ত যতক্ষণ ডেভেলপমেন্ট সার্ভার সক্রিয়ভাবে চলমান থাকে এবং পৌঁছানো যায়।

সমতলভূমিতে দৌড়ানো npm audit রিপোর্টে সাধারণত রানটাইম এবং ডেভেলপমেন্ট-শুধুমাত্র দুর্বলতা উভয়ই অন্তর্ভুক্ত থাকবে, যা প্যাকেজগুলিতে সমস্যাগুলি দেখাবে যেমন brace-expansion, esbuild, এবং webpack-dev-server. নিরীক্ষা প্রায়শই পরামর্শ দেবে npm audit fix অথবা এমনকি npm audit fix --force ভার্সনগুলিকে বাম্প করার জন্য, কখনও কখনও অ্যাঙ্গুলারের মতো ফ্রেমওয়ার্কগুলিতে বড় আপডেটের প্রয়োজন হয় যাতে সতর্কতাগুলি দূর হয়।

উৎপাদনে কী স্থাপন করা হচ্ছে তা আসলে কোন দুর্বলতাগুলিকে প্রভাবিত করে তা দেখতে, আপনি চালাতে পারেন npm audit --production (অথবা প্রস্তাবিত ব্যবহার করুন --omit=dev নতুন npm সংস্করণে বিকল্প)। যদি এই কমান্ডটি "found 0 vulnerabilities" ফেরত দেয়, তাহলে এর অর্থ হল, npm-এর অ্যাডভাইজরি ডাটাবেস যতদূর জানে, আপনার উৎপাদন নির্ভরতা সেট বর্তমানে জ্ঞাত সমস্যা থেকে মুক্ত।

এর অর্থ এই নয় যে আপনি ডেভেলপারদের জন্য শুধুমাত্র দুর্বলতাগুলিকে চিরতরে উপেক্ষা করতে পারবেন, কারণ প্রকল্পে কাজ করার সময় তারা ডেভেলপারদের মেশিন বা সোর্স কোডকে ঝুঁকির মধ্যে ফেলতে পারে। তবে, পার্থক্যটি বোঝা আপনাকে অগ্রাধিকার দিতে সাহায্য করে: প্রথমে উচ্চ-প্রভাবশালী উৎপাদন সমস্যাগুলি সমাধান করুন, তারপরে প্রতিটি সতর্কতার প্রতি সমানভাবে গুরুত্বপূর্ণ বলে প্রতিক্রিয়া না দেখিয়ে পরিকল্পিতভাবে উন্নয়ন-পরিবেশগত সমস্যাগুলি মোকাবেলা করুন।

npm অডিট ফিক্স কীভাবে কাজ করে এবং কখন এড়িয়ে চলতে হবে - বল প্রয়োগ

আদেশ npm audit fix নিরাপদ সংস্করণ পরিসরের মধ্যে দুর্বল নির্ভরতাগুলি স্বয়ংক্রিয়ভাবে আপগ্রেড করার জন্য ডিজাইন করা হয়েছে, তবে এটি কোনও জাদু বোতাম নয় যা ট্রেড-অফ ছাড়াই সবকিছু সমাধান করে। এটি আপনার নির্ভরতা ট্রিতে ভ্রমণ করে পরিচিত সমস্যাযুক্ত প্যাকেজগুলি সন্ধান করে এবং সেগুলিকে প্যাচ করা সংস্করণগুলিতে নিয়ে যাওয়ার চেষ্টা করে যা আপনার বিদ্যমানগুলির সাথে সামঞ্জস্যপূর্ণ থাকে। package.json সীমাবদ্ধতার।

উদাহরণস্বরূপ, যদি একটি নির্ভরতা এইভাবে নির্দিষ্ট করা হয় ^1.2.0, npm সর্বশেষে যাওয়ার চেষ্টা করবে 1.x যে সংস্করণে সমাধান রয়েছে, সরাসরি সেখানে না গিয়ে 2.x, যা উল্লেখযোগ্য পরিবর্তন আনতে পারে। এটা তৈরি করে npm audit fix অনেক প্রকল্পের জন্য তুলনামূলকভাবে নিরাপদ, কারণ এটি শব্দার্থিক সংস্করণের সীমাবদ্ধতাগুলিকে সম্মান করে।

কখনও কখনও, যদিও, কেবলমাত্র নতুন প্রধান সংস্করণগুলিতে বা টুলচেইনে উপলব্ধ প্যাচগুলি থাকে যার জন্য বৃহত্তর আপগ্রেডের প্রয়োজন হয়, যেখানে npm ব্যবহার করার পরামর্শ দেয় npm audit fix --force. এই ফ্ল্যাগটি npm-কে বলে যে এটি সম্ভাব্য ব্রেকিং আপডেট ইনস্টল করার অনুমতিপ্রাপ্ত, যার মধ্যে রয়েছে বড় ধরনের ভার্সন বাম্প এবং ফ্রেমওয়ার্ক বা বিল্ড টুলে ক্যাসকেডিং পরিবর্তন।

অন্ধভাবে দৌড়াচ্ছে --force একটি বৃহৎ বা লিগ্যাসি প্রকল্পে, বিল্ডগুলি সহজেই ভেঙে ফেলতে পারে বা সূক্ষ্ম রানটাইম রিগ্রেশন তৈরি করতে পারে, কারণ আপনার কোড যে নির্ভরতাগুলির উপর নির্ভর করে সেগুলি আচরণ বা API পরিবর্তন করতে পারে। এটিকে কেবল একটি নিরাপত্তা প্যাচ নয়, বরং আপনার স্ট্যাকের একটি ক্ষুদ্র স্থানান্তর হিসাবে বেছে নেওয়ার মতো ভাবুন, তাই এটি পরীক্ষা এবং সংস্করণ নিয়ন্ত্রণ সুরক্ষা জাল স্থাপনের মাধ্যমে করা উচিত।

এমন কিছু ক্ষেত্রেও আছে যেখানে npm সমস্ত দুর্বলতা স্বয়ংক্রিয়ভাবে ঠিক করতে পারে না, সাধারণত কারণ প্রয়োজনীয় সংস্করণ আপগ্রেডগুলি আপনার নির্ভরতা গ্রাফের অন্যান্য সীমাবদ্ধতার সাথে সাংঘর্ষিক হবে। এই পরিস্থিতিতে, আপনাকে কিছু লাইব্রেরি ম্যানুয়ালি আপডেট বা প্রতিস্থাপন করতে হতে পারে, অথবা একটি অ-ব্রেকিং প্যাচ প্রকাশিত না হওয়া পর্যন্ত অস্থায়ী ঝুঁকি গ্রহণ করতে হতে পারে।

একটি বাস্তব কৌশল হল প্রথমে বুঝতে হবে কোন দুর্বলতাগুলি উৎপাদনকে প্রভাবিত করে, তারপর প্রয়োগ করা npm audit fix ছাড়া --force, এবং প্রভাব বিশ্লেষণের পরে এবং যথাযথ পরীক্ষার কভারেজ সহ কেবল জোরপূর্বক বা বড় আপগ্রেড বিবেচনা করুন। এইভাবে আপনি একটি সম্পূর্ণ পরিষ্কার অডিট রিপোর্টের পিছনে ছুটতে গিয়ে আপনার কোডবেসকে ক্রমাগত অস্থিতিশীল না করে আপনার অ্যাপ্লিকেশনটিকে সুরক্ষিত রাখবেন।

পরিশেষে, npm দুর্বলতা মোকাবেলা করা ঝুঁকি মূল্যায়ন, অগ্রাধিকার নির্ধারণ এবং নিয়ন্ত্রিত আপডেটের একটি চলমান প্রক্রিয়া, এটি একবার চালানো এবং ভুলে যাওয়া কোনও কমান্ড নয়। প্রতিটি সমস্যার তীব্রতা, আপনার প্রেক্ষাপটে বাস্তব ব্যবহারের সুযোগ এবং প্রভাবিত প্যাকেজ বা টুলচেইন আপগ্রেড করার খরচের ভিত্তিতে মূল্যায়ন করা প্রয়োজন।

আপনার আসলে কতগুলি npm নির্ভরতা প্রয়োজন তা পুনর্বিবেচনা করা হচ্ছে

npm-এর সাথে সবচেয়ে কার্যকর দীর্ঘমেয়াদী নিরাপত্তা পদ্ধতিগুলির মধ্যে একটি হল, যেখানেই সম্ভব কম সংখ্যক তৃতীয় পক্ষের প্যাকেজের উপর নির্ভর করা। প্রতিটি অতিরিক্ত নির্ভরতা আপনার আক্রমণের পৃষ্ঠ, রক্ষণাবেক্ষণের বোঝা এবং ভবিষ্যতে আশ্চর্যজনক ক্ষণস্থায়ী সমস্যার সম্ভাবনা বৃদ্ধি করে।

ডেভেলপাররা প্রায়শই সুবিধার বাইরে প্যাকেজ ইনস্টল করে, এমনকি যখন কার্যকারিতাটি সাধারণ জাভাস্ক্রিপ্টের কয়েকটি লাইনে প্রয়োগ করা যেতে পারে। সময়ের সাথে সাথে, এই অভ্যাসটি আপনার নির্ভরতা বৃক্ষকে এমন মডিউল দিয়ে ফুলে উঠতে পারে যা খুব কমই ব্যবহৃত হয়, খারাপভাবে রক্ষণাবেক্ষণ করা হয়, অথবা সহজেই ইন-হাউস কোডের ছোট ছোট টুকরো দ্বারা প্রতিস্থাপিত হয়।

নির্ভরতা হ্রাস করার ফলে নিরাপত্তার বাইরেও একাধিক সুবিধা রয়েছে: ছোট প্রকল্প, দ্রুত ইনস্টল এবং বিল্ড সময়, কম সংস্করণ দ্বন্দ্ব এবং কিছু ভেঙে গেলে সহজ ডিবাগিং। একটি লিনিয়ার ডিপেন্ডেন্সি গ্রাফ আপনার অ্যাপ্লিকেশনে আসলে কী যাচ্ছে তা অডিট করা সহজ করে তোলে, আপনি কখনও সচেতনভাবে বেছে না নেওয়া ক্ষণস্থায়ী প্যাকেজের পৃষ্ঠাগুলি ঘুরে দেখার পরিবর্তে।

ঝুঁকির দৃষ্টিকোণ থেকে, কম চলমান যন্ত্রাংশের অর্থ হল পরিত্যক্ত প্রকল্প, আপোস করা রক্ষণাবেক্ষণকারী, অথবা অস্পষ্ট ইউটিলিটিগুলিতে সূক্ষ্ম দুর্বলতাগুলির জন্য আপনার স্ট্যাককে প্রভাবিত করার সম্ভাবনা কম। এমনকি যদি আপনি বৃহৎ ফ্রেমওয়ার্ক বা মূল লাইব্রেরি এড়াতে না পারেন, তবুও আপনি ক্ষুদ্র সহায়কদের সম্পর্কে নির্বাচনী হতে পারেন যারা তুচ্ছ কাজ করে, যা প্রায়শই অডিট নয়েজের একটি আশ্চর্যজনক অংশের জন্য দায়ী।

একটি পরিপক্ক নির্ভরতা কৌশলের মধ্যে রয়েছে নতুন প্যাকেজগুলিকে সমালোচনামূলকভাবে মূল্যায়ন করা, পর্যায়ক্রমে অব্যবহৃতগুলি অপসারণ করা এবং যখনই সম্ভব বিশেষ বা এককালীন সমাধানের চেয়ে সু-রক্ষণাবেক্ষণ করা, ব্যাপকভাবে যাচাই করা লাইব্রেরিগুলিকে অগ্রাধিকার দেওয়া। এর ভালো ব্যবহারের সাথে মিলিত npm audit, npm ci, এবং নিয়মিত আপডেটের মাধ্যমে, এই মানসিকতা আপনার সম্মুখীন হওয়া npm-সম্পর্কিত সমস্যার ফ্রিকোয়েন্সি এবং তীব্রতা নাটকীয়ভাবে হ্রাস করতে পারে।

npm ত্রুটি, লগ এবং দূষিত ইনস্টলেশন ডিবাগ করা হচ্ছে

এমনকি একটি সু-কনফিগার করা পরিবেশ এবং একটি লিন ডিপেন্ডেন্সি ট্রি থাকা সত্ত্বেও, আপনি অবশেষে বিভ্রান্তিকর npm ত্রুটির মুখোমুখি হবেন যা আপনার কর্মপ্রবাহকে ঠান্ডা করে দেবে। কার্যকর ডিবাগিং শুরু হয় যখন কোনও কমান্ড ব্যর্থ হয় তখন npm আসলে কী করছে সে সম্পর্কে আরও তথ্য পাওয়ার মাধ্যমে।

একটি সহজ কৌশল হল পতাকা ব্যবহার করে npm এর ভার্বোসিটি বৃদ্ধি করা যেমন --dd (অথবা --loglevel verbose), যা প্রক্রিয়াটির বিস্তারিত ধাপগুলি মুদ্রণ করে। এই স্তরের লগিং ঠিক কোন অপারেশন ব্যর্থ হয়েছে, কোন ফাইল বা ডিরেক্টরিতে সমস্যা হয়েছে, অথবা আপনার নির্ভরতা শৃঙ্খলে কোন স্ক্রিপ্টটি ভেঙে যাচ্ছে তা প্রকাশ করতে পারে।

যখনই কোনও কমান্ড ব্যর্থ হয়, npm সাধারণত আপনাকে বলে যে এটি আরও বিস্তারিত লগ ফাইলটি কোথায় সংরক্ষণ করেছে, সাধারণত একটি ডিরেক্টরির অধীনে যেমন ~/.npm/_logs. সেই লগটি খুললে আপনাকে ইনস্টল বা স্ক্রিপ্ট রানের একটি কালানুক্রমিক ট্রেস দেওয়া হবে, যার মধ্যে স্ট্যাক ট্রেস, পরিবেশের বিবরণ এবং অন্তর্নিহিত সিস্টেম ত্রুটিগুলি অন্তর্ভুক্ত থাকবে যা সর্বদা সংক্ষিপ্ত ত্রুটি আউটপুটে প্রদর্শিত হয় না।

কিছু ব্যর্থতা আপনার নিজের ভুল থেকে আসে package.json, যেমন অবৈধ JSON, ভুল স্ক্রিপ্ট নাম, অথবা ত্রুটিপূর্ণ সংস্করণ রেঞ্জ। এইসব ক্ষেত্রে, সিনট্যাক্স ত্রুটি, টাইপো, বা ট্রেইলিং কমাগুলির জন্য ফাইলটি সাবধানে পুনরায় পরীক্ষা করলে এমন সমস্যাগুলি সমাধান হতে পারে যা প্রথম নজরে রহস্যজনক বলে মনে হয়।

অন্য সময়, মূল কারণ অপারেটিং সিস্টেম বা টুল স্তরে থাকে: নেটওয়ার্ক অ্যাক্সেস, DNS রেজোলিউশন, ফায়ারওয়াল নিয়ম, অথবা ভুলভাবে কনফিগার করা Git বা GitHub শংসাপত্রের সমস্যা। উদাহরণস্বরূপ, যদি কোনও নির্ভরতা সরাসরি কোনও Git রিপোজিটরি থেকে নেওয়া হয় এবং Git অনুপস্থিত থাকে বা ভুলভাবে কনফিগার করা থাকে, তাহলে npm ব্যর্থ হবে যদিও রেজিস্ট্রি নিজেই পৌঁছানো যায়।

নির্ভরতা ইনস্টলেশন সমস্যাগুলি একটি দুর্নীতিগ্রস্ত থেকেও উদ্ভূত হতে পারে node_modules ডিরেক্টরি বা npm ক্যাশে, বিশেষ করে বাধাপ্রাপ্ত ইনস্টলেশন বা অর্ধ-সম্পূর্ণ আপগ্রেডের পরে। যদি আপনার দুর্নীতির সন্দেহ হয়, তাহলে তা দূর করা প্রায়শই সহজ হয় node_modules এবং লকফাইল, npm ক্যাশে সাফ করুন এবং পুনরায় ইনস্টল করুন, পৃথক ভাঙা প্যাকেজগুলি ঠিক করার চেষ্টা করার পরিবর্তে।

একটি সাধারণ পুনরুদ্ধারের ধরণ হল মুছে ফেলা node_modules, ঐচ্ছিকভাবে একটি ক্যাশে ক্লিন কমান্ড চালান, এবং তারপর এক্সিকিউট করুন npm install আবার শুরু থেকে নির্ভরতা বৃক্ষ পুনর্নির্মাণ করতে। এই কঠোর রিসেট প্রায়শই অদ্ভুত বা অসঙ্গত আচরণ দূর করে যা নিয়মিত সমস্যা সমাধানে ধরা পড়ে না, বিশেষ করে শাখা পরিবর্তন করার পরে বা বড় নির্ভরতা পরিবর্তনগুলি একত্রিত করার পরে।

মনে রাখবেন যে সমস্ত ত্রুটি সরাসরি npm দ্বারা সৃষ্ট হয় না; কিছু ত্রুটি ইনস্টলেশনের সময় প্যাকেজগুলি যে স্ক্রিপ্টগুলিতে চলে বা আপনার নিজস্ব প্রকল্পের জীবনচক্র হুকগুলিতে ঘটে তার থেকে উদ্ভূত হয়। ভার্বোজ লগ এবং এরর স্ট্যাক ট্রেস আপনাকে নির্ধারণ করতে সাহায্য করতে পারে যে আপনি একটি বিশুদ্ধ npm সমস্যা মোকাবেলা করছেন নাকি তৃতীয় পক্ষের স্ক্রিপ্ট বা কাস্টম টুলিং-এর সমস্যা যা npm এর মাধ্যমে ট্রিগার হয়।

সামগ্রিকভাবে, আরও ভালো লগিং, ত্রুটি বার্তাগুলি সাবধানে পড়া এবং মাঝে মাঝে রিসেট করার সমন্বয়ে node_modules অন্তহীন ট্রায়াল-এন্ড-এরর চক্রে আটকে না থেকে বেশিরভাগ npm ব্যর্থতা থেকে পুনরুদ্ধার করতে আপনাকে সাহায্য করবে। সময়ের সাথে সাথে, আপনি পুনরাবৃত্ত প্যাটার্নগুলি সনাক্ত করতে পারবেন — JSON টাইপো, অনুমতি সমস্যা, অনুপস্থিত সরঞ্জাম — যা পরবর্তী ডিবাগিং সেশনকে আরও দ্রুত করে তোলে।

npm সফলভাবে পরিচালনা করা শেষ পর্যন্ত স্থানীয় টুলিং বৈশিষ্ট্য এবং বৃহত্তর বাস্তুতন্ত্রের ঝুঁকি উভয়ই বোঝার উপর নির্ভর করে: PowerShell এক্সিকিউশন নীতি এবং ইউনিক্স অনুমতি থেকে শুরু করে, নির্ধারক ইনস্টল এবং দুর্বলতা অডিটের মাধ্যমে, সতর্ক নির্ভরতা নির্বাচন এবং পদ্ধতিগত ডিবাগিং পর্যন্ত, আপনার প্রতিটি ভাল অনুশীলন npm সমস্যাগুলি আপনার উন্নয়ন কাজকে লাইনচ্যুত করার সম্ভাবনা হ্রাস করে।

ataque Shai-Hulud a la cadena de suministro de npm
সম্পর্কিত নিবন্ধ:
শাই-হুলুদ: এল আতাক কুয়ে সাকুদে লা ক্যাডেনা দে সুমিনিস্ট্রো ডি এনপিএম
সম্পর্কিত পোস্ট: