বাফার ওভারফ্লোগুলি একটি বড়। সি-তে কোনও কিছুই ডিফল্টরূপে পরিসীমা পরীক্ষা করা হয় না, সুতরাং একটি বাফার ওভাররাইট করা খুব সহজ। এখানে একটি স্ট্যান্ডার্ড লাইব্রেরি ফাংশন রয়েছে, gets()
এটি বাফারকে উপচে পড়া থেকে থামানো যায় না এবং এটি কখনও ব্যবহার করা উচিত নয়।
শোষণকে বাধা দেওয়ার জন্য কিছু বাস্তবায়ন-স্তরের কৌশল রয়েছে যেমন স্ক্র্যাম্বলিং হিপ ব্লকগুলি, তবে এটি স্থানীয় বাফারগুলিতে বাফার ওভারফ্লোগুলি বন্ধ করবে না, যা প্রায়শই আকর্ষণীয় কাজগুলি করতে পারে যাতে কোনও ফাংশন ফিরে আসবে এমন ঠিকানা পরিবর্তন করতে পারে।
সি-তে কোনও ভাল সাধারণ সমাধান নেই library যদিও গণনা করা যে আনাড়ি হতে পারে। এমন একটি সফ্টওয়্যার রয়েছে যা পরীক্ষায় হ্যাপ বাফার ওভারফ্লোগুলি সনাক্ত করতে পারে, যতক্ষণ না উপযুক্ত পরীক্ষা চালানো হয় এবং স্ট্যাক ওভারফ্লো প্রায়শই পরীক্ষায় ক্রাশ হিসাবে দেখাবে show তা ছাড়া, এটি সতর্ক কোডিং এবং কোড পর্যালোচনার বিষয়।
একটি সম্পর্কিত সমস্যা হ'ল একটি বাফারে একটি অক্ষর দ্বারা খুব ছোট লেখার সমস্যা, ভুলে যাওয়া যে সি অক্ষরে লম্বা সি স্ট্রিংটি '\0'
টার্মিনেটরের কারণে মেমরিতে n + 1 অক্ষর প্রয়োজন । আক্রমণকারী যদি টার্মিনেটর ছাড়াই স্ট্রিং সংরক্ষণ করতে পারে তবে স্ট্রিংয়ের প্রত্যাশিত যে কোনও সি ফাংশন শূন্য বাইট না ছোঁড়া অবধি প্রক্রিয়াকরণ অব্যাহত রাখবে, যার ফলস্বরূপ কাঙ্ক্ষিত বা তার চেয়ে বেশি তথ্য আউটপুট তৈরি হতে পারে (বা ডস আক্রমণে সুরক্ষিত মেমোরি আঘাত করা) )। সমাধানটি আবার সচেতনতা, যত্ন এবং কোড পর্যালোচনা।
printf()
পরিবারের সাথে আরও একটি ঝুঁকি রয়েছে । আপনি যদি কখনও লিখেন char * str; ... printf(str);
তবে str
মুদ্রণের সময় যদি কোনও '%' থাকে তবে আপনি সমস্যার জন্য নিজেকে প্রস্তুত করছেন । %n
বিন্যাস নির্দেশ দেয় printf()
মেমরিতে লিখতে। সমাধান হয় printf("%s", str);
বা puts(str);
। (এছাড়াও এর snprintf()
পরিবর্তে C99 ব্যবহার করুন sprintf()
))
স্বাক্ষরবিহীন পূর্ণ সংখ্যাগুলি, বিশেষত লুপ সূচক হিসাবে ব্যবহার করা সমস্যার কারণ হতে পারে। আপনি যদি স্বাক্ষরবিহীনকে একটি ছোট নেতিবাচক মান নির্ধারণ করেন তবে আপনি একটি বড় ধনাত্মক মান পাবেন। এটি কেবলমাত্র কোনও এন এর উদাহরণগুলির প্রক্রিয়াকরণের মতো বিষয়গুলিকে বা সীমিত ফাংশনগুলিকে হ্রাস করতে পারে strncpy()
। সমস্ত স্বাক্ষরবিহীন পূর্ণসংখ্যা পরীক্ষা করুন। আপনি এড়াতে চাইতে পারেন unsigned short
, যেহেতু এর মধ্যে একটিতে একটি বড় মান একটিতে একটি বৃহত ধনাত্মক মানকে রূপান্তরিত করে int
।
ভুলে যাবেন না যে একটি অক্ষর ধ্রুবক, সি, আসলে একটি int
। এর মতো কিছু লেখা char c; while((c = getchar()) != EOF) ...
সহজেই ব্যর্থ EOF
হতে পারে, যেহেতু এটিতে প্রতিনিধিত্বযোগ্য হবে না char
।
আমি ভাবতে পারি আরও অনেকগুলি বৈশিষ্ট্যযুক্ত সি ভুল রয়েছে তবে এগুলি সুরক্ষা সমস্যার কারণ হতে পারে।