বাফার ওভারফ্লোতে সি কম প্রবণ করা কেন এতটা কঠিন?


23

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

আমি এটি নিয়ে কিছু গবেষণা করেছি, এবং এই ধরণের শোষণগুলি এখন পর্যন্ত যেকোন জায়গায় ব্যবহার করা হয়, Wii এ হোমব্রব চালানো এবং আইওএস 4.3.1 এর জন্য শিরোনামহীন জেলব্রেকের মতো জিনিসগুলিতে

আমার প্রশ্ন হল কেন এই সমস্যাটি ঠিক করা এত কঠিন? এটি স্পষ্টতই শত শত জিনিস হ্যাক করার জন্য ব্যবহৃত একটি প্রধান শোষণ, তবে মনে হচ্ছে অনুমোদিত দৈর্ঘ্যের কোনও ইনপুট কেটে ফেলা এবং আপনি যে সমস্ত ইনপুট গ্রহণ করেন তা কেবল স্যানিটাইজ করে এটি ঠিক করা বেশ সহজ হবে।

সম্পাদনা: আরেকটি দৃষ্টিকোণ যা আমি বিবেচনা করতে উত্তর চাই - সি এর নির্মাতারা কেন লাইব্রেরিগুলিকে সংশোধন করে এই সমস্যাগুলি সমাধান করেন না?

উত্তর:


35

তারা গ্রন্থাগারগুলি ঠিক করে দিয়েছে।

কোন আধুনিক সি মান লাইব্রেরির নিরাপদ রূপগুলো রয়েছে strcpy, strcat, sprintf, ইত্যাদি।

সি৯৯ সিস্টেমে - যা সর্বাধিক ইউনিক্স - আপনি এইগুলির মতো নামগুলি পাবেন strncatএবং snprintf"এন" ইঙ্গিত করে যে এটি একটি যুক্তি গ্রহণ করে যা একটি বাফারের আকার বা সর্বাধিক সংখ্যক উপাদান অনুলিপি করতে পারে।

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

উইন্ডোজে প্রায়শই একটি strcat_s, sprintf_s"_s" প্রত্যয়টি "নিরাপদ" নির্দেশ করে finds এগুলিও সি 11 এর সি স্ট্যান্ডার্ড লাইব্রেরিতে তাদের পথ খুঁজে পেয়েছে এবং ওভারফ্লো হওয়ার ক্ষেত্রে কী ঘটে তার উপর আরও নিয়ন্ত্রণ সরবরাহ করে (কাটা কাটা বনাম উদাহরণস্বরূপ দাবী)।

অনেক বিক্রেতারা asprintfGNU libc এর মতো আরও মানসম্মত বিকল্প সরবরাহ করেন যা উপযুক্ত আকারের একটি বাফার স্বয়ংক্রিয়ভাবে বরাদ্দ করবে।

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


11
প্রোগ্রামারদের সমস্যাটি লক্ষ্য করার জন্য, ভাষা নয় +1।
নিকল বোলাস

8
@ নিকল: "সমস্যাটি হ'ল প্রোগ্রামাররা" বলা অন্যায়ভাবে হ্রাসকারী। সমস্যাটি হ'ল কয়েক বছরের (দশক) ধরে সি নিরাপদ কোডের চেয়ে অনিরাপদ কোডটি লেখা সহজ করে তুলেছিল, বিশেষত আমাদের "নিরাপদ" সংজ্ঞাটি যে কোনও ভাষার মানের চেয়ে দ্রুত বিকশিত হয়েছিল এবং সেই কোডটি এখনও রয়েছে। আপনি যদি এটি একটি একক বিশেষ্যে কমাতে চেষ্টা করতে চান তবে সমস্যাটি "প্রোগ্রামাররা" নয়, "1970-1999 libc"।

1
প্রোগ্রামারদের এখনও এই সমস্যাগুলি সমাধান করার জন্য তাদের কাছে থাকা সরঞ্জামগুলি ব্যবহার করার দায়িত্ব । অর্ধ-দিন সময় নিন এবং এই জিনিসগুলির জন্য উত্স কোডের মাধ্যমে কিছু গ্রেপিং করুন।
নিকল বোলাস

1
@ নিকল: একটি সম্ভাব্য বাফার ওভারফ্লো সনাক্ত করতে তুচ্ছ হলেও এটি প্রায়শই তুচ্ছ নয় এটি নিশ্চিত হওয়া সত্য যে এটি হুমকী, এবং যদি বাফারটি কখনও উড়ে না যায় তবে কী ঘটবে তা কার্যকর করার জন্য খুব তুচ্ছ নয়। ত্রুটি পরিচালনার ক্ষেত্রে / প্রায়শই বিবেচনা করা হয় না, উন্নতি "দ্রুত" কার্যকর করা সম্ভব হয় না কারণ আপনি অপ্রত্যাশিত উপায়ে মডিউলটির আচরণ পরিবর্তন করতে পারেন। আমরা সবেমাত্র এটি একটি বহু মিলিয়ন লাইনের লিগ্যাসি কোড বেসে করেছি, এবং যদিও ব্যায়াম করার জন্য এটি অনেক সময় ব্যয় করে (এবং অর্থ)।
mattnz

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

19

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

সিটিকে "পোর্টেবল অ্যাসেমব্লী" বাছাই করার জন্য সিস্টেম ভাষা হিসাবে নকশা করা হয়েছিল। সি ভাষার একটি প্রধান বৈশিষ্ট্য হ'ল উচ্চ-স্তরের ভাষাগুলির বিপরীতে সি কোডটি প্রায়শই প্রকৃত মেশিন কোডের সাথে খুব মানচিত্রের মানচিত্র করে। অন্য কথায়, ++iসাধারণত একটি incনির্দেশ এবং আপনি প্রায়শই সি কোডটি দেখে প্রসেসর রান-টাইমে কী করবেন সে সম্পর্কে একটি সাধারণ ধারণা পেতে পারেন।

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


12
সত্যই লোকেরা যখন জিজ্ঞাসা করে যে কেন সি "নিরাপদ" নয় তারা আমাকে বিস্মিত করে যে তারা যদি অভিযোগ করে যে সমাবেশটি "নিরাপদ" নয়।
বেন ব্রোকা

5
সি ভাষা হ'ল ডিজিটাল সরঞ্জাম কর্পোরেশন পিডিপি -11 মেশিনে বহনযোগ্য সমাবেশের মতো। একই সময়ে বারোজ মেশিন রকওয়েল কলিন্স হার্ডওয়্যার উপর অ্যারের সীমার CPU- র চেক, তাই তারা সত্যিই সহজ ছিল ডানদিকে প্রোগ্রাম পেতে ছিল হার্ডওয়্যার জীবনে এরে চেক। (বেশিরভাগই বিমান চালনা ব্যবহৃত।)
টিম Williscroft

15

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


3
আপনার সত্যই "খুব ভাল কোড পর্যালোচনা" দরকার নেই। আপনার কেবল স্প্রিন্টকে নিষিদ্ধ করতে হবে, বা স্প্রিন্টফকে এমন কিছুতে পুনরায় সংজ্ঞা দিন যা সাইফোনফ () ব্যবহার করে এবং একটি পয়েন্টারের আকারে ত্রুটি, বা ইত্যাদি You এমনকি আপনার কোড পর্যালোচনাও লাগবে না, আপনি এসসিএম কমিটের সাহায্যে এই জাতীয় জিনিসটি করতে পারেন হুকস এবং গ্রেপ

1
@ জোওয়ারচেনিগ: sizeof(ptr)সাধারণত 4 বা 8 হয়। এটি অন্য সি এর সীমাবদ্ধতা: অ্যারের দৈর্ঘ্য নির্ধারণ করার কোনও উপায় নেই, কেবলমাত্র পয়েন্টারটি দেওয়া হয়েছে।
এমসাল্টার

@ এসএমএলটার্স: হ্যাঁ, ইনট [1] বা চার [4] এর অ্যারে বা যা কিছু মিথ্যা ইতিবাচক হতে পারে তবে বাস্তবে আপনি কখনই সেই আকারগুলির বাফারগুলি সেই ফাংশনগুলির সাথে পরিচালনা করছেন না। (আমি এখানে তাত্ত্বিকভাবে কথা বলছি না - আমি এই পদ্ধতিকে ব্যবহার করে চার বছরের জন্য একটি বৃহত সি কোড বেসে কাজ করেছি spr আমি স্প্রিন্টিংয়ের সীমাবদ্ধতাটিকে কোনও চরে [4] কখনও আঘাত করিনি))

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

1
এই জাতীয় ম্যাক্রোর একটি সাধারণ উদাহরণ হ'ল #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]) / (sizeof(a) != sizeof(void *))যা একটি কমপ্লে-টাইম বিভাজন দ্বারা শূন্যকে ট্রিগার করবে। আমি প্রথম ক্রোমিয়ামে দেখেছি এমন একজন চতুর হ'ল #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]) / !(sizeof(a) % sizeof((a)[0]))এটি কিছু মিথ্যা নেতিবাচকদের জন্য মুষ্টিমেয় মিথ্যা ধনাত্মক ব্যবসায়ের ব্যবসা করে - দুর্ভাগ্যক্রমে এটি চরের জন্য অকেজো []। এটিকে আরও নির্ভরযোগ্য করে তুলতে আপনি বিভিন্ন সংকলক এক্সটেনশনগুলি ব্যবহার করতে পারেন, যেমন: ব্লগস.এমএসএনএন / বি / এসি_বেস / অর্চিভ / ২০০7/০5/০৮/২০

7

বাফার ওভারফ্লোগুলি সংশোধন করা কঠিন কারণ সি সমস্যা সমাধানের জন্য কার্যত কোনও কার্যকর সরঞ্জাম সরবরাহ করে না। এটা একটা মৌলিক ভাষা ত্রুটি যে নেটিভ বাফার কোন সুরক্ষা প্রদান করেন এবং এটা তাদের একটি উচ্চতর পণ্যের সাথে প্রতিস্থাপন করতে কার্যত এর, যদি সম্পূর্ণভাবে না, অসম্ভব, মত সি ++ করেছিল std::vectorএবং std::array, এবং এটা উপচে বাফার এটি এমনকি ডিবাগ মোড অধীনে কঠিন।


13
"ভাষার ত্রুটি" একটি মারাত্মক পক্ষপাতদুষ্ট দাবি। গ্রন্থাগারগুলি সীমানা-চেকিং সরবরাহ করে না এমন একটি ত্রুটি ছিল; ওভারহেড এড়ানোর জন্য ভাষাটি সচেতন পছন্দ নয়। সেই পছন্দটি উচ্চ-স্তরের কনস্ট্রাক্টসগুলিকে std::vectorদক্ষতার সাথে প্রয়োগ করতে মঞ্জুরি দেয় এমন একটি অংশ । এবং vector::operator[]গতি ওভার সুরক্ষার জন্য একই পছন্দ করে তোলে। নিরাপত্তা vectorআকার, যা একই পদ্ধতির আধুনিক সি লাইব্রেরি নিতে হয় প্রায় কার্টে সহজে উপার্জন থেকে আসে।

1
@ চার্লস: "সি স্ট্যান্ডার্ড লাইব্রেরির অংশ হিসাবে কোনও ধরণের গতিশীল-প্রসারিত বাফার সরবরাহ করে না।" না, এটির সাথে কিছু করার নেই। প্রথমত, সি তাদের মাধ্যমে সরবরাহ করে realloc(সি 99 আপনাকে রানটাইম-নির্ধারিত তবে ধ্রুব আকারের সাহায্যে কোনও স্বয়ংক্রিয় ভেরিয়েবলের মাধ্যমে প্রায় সবসময় পছন্দনীয় আকারের সাহায্যে স্ট্যাক অ্যারে আকার দিতে দেয় char buf[1024])। দ্বিতীয়ত, সমস্যার সম্প্রসারণ বাফারগুলির সাথে কোনও সম্পর্ক নেই, এটি বাফারগুলি তাদের সাথে আকার রাখে বা না করে এবং আপনার সেগুলি অ্যাক্সেস করার পরে সেই আকারটি পরীক্ষা করে।

5
@ জো: সমস্যা এতটা নয় যে দেশীয় অ্যারেগুলি ভেঙে গেছে। এটি প্রতিস্থাপন করা অসম্ভব It's শুরু করার জন্য, vector::operator[]ডিবাগ মোডে কি সীমানা যাচাই করা যায়- কিছু নেটিভ অ্যারে করতে পারে না- এবং দ্বিতীয়ত, সি-তে কোনও উপায় নেই যা নেটিভ অ্যারে টাইপের সাথে সীমাবদ্ধতা যাচাই করতে পারে, কারণ কোনও টেমপ্লেট নেই এবং অপারেটর নেই because ওভারলোডিং। C ++, যদি আপনার কাছ থেকে স্থানান্তর করতে চান T[]করতে std::array, আপনি কার্যকরীভাবে শুধু একটি typedef অদলবদল করতে পারেন। সি তে, এটি অর্জন করার কোনও উপায় নেই, এবং সমমানের কার্যকারিতা সহ কোনও শ্রেণি লেখার কোনও উপায় নেই, ইন্টারফেসটি ছেড়ে দেওয়া হোক।
ডেড এমএমজি

3
@ জো: ব্যতীত এটিকে কখনও স্থিতিশীল আকার দেওয়া যায় না এবং আপনি কখনই এটি জেনেরিক করতে পারবেন না। সি-তে এমন কোনও গ্রন্থাগার লেখা অসম্ভব যা একই ভূমিকা পালন করে std::vector<T>এবং std::array<T, N>সি ++ তে করে। কোনও লাইব্রেরি ডিজাইন ও নির্দিষ্ট করার কোনও উপায় নেই, এমনকি কোনও স্ট্যান্ডার্ডও নয়, এটি এটি করতে পারে।
ডেড এমএমজি

1
আপনি "কী এটি স্থিতিশীল আকারের হতে পারে তা কখনই" বলতে চাইছেন তা আমি নিশ্চিত নই। যেহেতু আমি এই শব্দটি ব্যবহার করতাম, std::vectorতেমনি কখনও স্থিতিশীল আকারেও করা যায় না। জেনেরিক হিসাবে, আপনি এটিকে জেনেরিক হিসাবে তৈরি করতে পারেন যতটা ভাল সি হওয়া দরকার - অকার্যকর * (সংযোজন, অপসারণ, পুনরায় আকার দিন) এবং বিশেষত লিখিত সমস্ত কিছুতে অল্প সংখ্যক মৌলিক ক্রিয়াকলাপ। আপনি যদি অভিযোগ করতে চলেছেন যে সিতে সি ++ - স্টাইলের জেনেরিকস নেই, এটি নিরাপদ বাফার হ্যান্ডলিংয়ের সুযোগের বাইরে।

7

সমস্যা সি ভাষার সাথে নয় ।

আইএমও, কাটিয়ে উঠতে একমাত্র বড় বাধা হ'ল সি কেবল খারাপভাবে শেখানো হয় । দশকের দশকে খারাপ অনুশীলন এবং ভুল তথ্যের রেফারেন্স ম্যানুয়ালগুলি এবং বক্তৃতার নোটগুলিতে প্রাতিষ্ঠানিকভাবে তৈরি করা হয়েছে, প্রতিটি প্রোগ্রামারদের নতুন প্রজন্মের মনে প্রথম থেকেই বিষ প্রয়োগ করে। শিক্ষার্থীদের gets1 বা " 1 " এর মতো I / O ফাংশনগুলির একটি সংক্ষিপ্ত বিবরণ দেওয়া হয় scanfএবং তারপরে তাদের নিজস্ব ডিভাইসে রেখে দেওয়া হয়। কোথায় বা কীভাবে এই সরঞ্জামগুলি ব্যর্থ হতে পারে বা কীভাবে এই ব্যর্থতাগুলি রোধ করা যায় তা তাদের বলা হয় না। তাদের ব্যবহার সম্পর্কে fgetsএবং বলা হয় নাstrtol/strtodকারণ এগুলিকে "উন্নত" সরঞ্জাম হিসাবে বিবেচনা করা হয়। তারপরে তারা তাদের সর্বনাশ ডেকে আনার জন্য পেশাদার জগতে মুক্তি পাবে। এমন নয় যে আরও অভিজ্ঞ প্রোগ্রামারদের মধ্যে অনেকেই আরও ভাল জানেন, কারণ তারা একই মস্তিষ্ক-ক্ষতিগ্রস্থ শিক্ষা অর্জন করেছিলেন। এটা পাগল। আমি এখানে এবং স্ট্যাক ওভারফ্লো এবং অন্যান্য সাইটগুলিতে অনেক প্রশ্ন দেখতে পাচ্ছি যেখানে এটি স্পষ্ট যে প্রশ্ন জিজ্ঞাসা করা ব্যক্তি এমন একজন দ্বারা শেখানো হচ্ছে যিনি কেবল জানেন না যে তারা কী সম্পর্কে কথা বলছেন , এবং অবশ্যই আপনি কেবল বলতে পারবেন না "আপনার অধ্যাপক ভুল," কারণ তিনি একজন অধ্যাপক এবং আপনি ইন্টারনেটের কিছু লোক

এবং তারপরে আপনার কাছে এমন ভিড় রয়েছে যা "উত্তর, ভাষা আদর্শ অনুযায়ী ..." দিয়ে শুরু করে কোনও উত্তরকেই উপেক্ষা করে কারণ তারা আসল বিশ্বে কাজ করছে এবং তাদের মতে আদর্শটি বাস্তব বিশ্বের ক্ষেত্রে প্রযোজ্য নয় । আমি কেবলমাত্র খারাপ শিক্ষার সাথে কারও সাথে মোকাবিলা করতে পারি, তবে যে কেউ অজ্ঞ হওয়ার জন্য জোর দিয়ে থাকে সে কেবল শিল্পের ক্ষতি।

সুরক্ষিত কোড লেখার উপর জোর দিয়ে যদি ভাষাটি সঠিকভাবে শেখানো হয় তবে কোনও বাফার ওভারফ্লো সমস্যা হবে না । এটি "শক্ত" নয়, এটি "উন্নত" নয়, এটি কেবল যত্নবান।

হ্যাঁ, এটি একটি বাচ্চা হয়েছে।


1 , ধন্যবাদ, যা অবশেষে ভাষা স্পেসিফিকেশন থেকে yanked হয়েছে, যদিও এটি 40 বছরের মূল্যবোধের কোডটি চিরকাল স্থায়ী হবে।


1
আমি বেশিরভাগ ক্ষেত্রে আপনার সাথে একমত হওয়ার পরেও আমি মনে করি আপনি এখনও কিছুটা অন্যায় করছেন। যা আমরা "নিরাপদ" হিসাবে বিবেচনা করি এটি সময়ের একটি কার্য (এবং আমি দেখতে পাচ্ছি যে আপনি আমার চেয়ে অনেক বেশি পেশাদার সফটওয়্যার বিকাশকারী হয়ে আছেন, তাই আমি নিশ্চিত যে আপনি এটির সাথে পরিচিত familiar আজ থেকে দশ বছর পর কেউ কারও সাথে একই কথোপকথন করবে যে ২০১২ সালের নরক কেন ডস-সক্ষম হ্যাশ টেবিল বাস্তবায়ন ব্যবহার করেছিল, আমরা সুরক্ষা সম্পর্কে কিছুই জানিনা? যদি শিক্ষণে সমস্যা হয়, তবে এটি এমন একটি সমস্যা যা আমরা "সেরা" অনুশীলন শেখানোর দিকে বেশি মনোনিবেশ করি এবং এটি সেরা অনুশীলন নিজেই বিকশিত হয় না।

1
এবং আসুন সত্য কথা। আপনি ন্যায়বিচার সহ নিরাপদ কোড লিখতে পারেনsprintf , তবে এর অর্থ এই নয় যে ভাষাটি ত্রুটিযুক্ত ছিল না। সি ছিল ত্রুটিপূর্ণ এবং হয় ত্রুটিপূর্ণ - কোনো ভাষা মত - এবং এটা গুরুত্বপূর্ণ যে আমরা সেই সংক্রান্ত ত্রুটিগুলি মানা তাই আমরা তাদের ঠিক চালিয়ে যেতে পারেন।

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

5

প্রোগ্রামার অক্ষমতার তুলনায় সমস্যাটি ম্যানেজরিয়াল শর্টসাইটেরনেস হিসাবে অন্যতম। মনে রাখবেন, 90,000-লাইনের অ্যাপ্লিকেশনটির সম্পূর্ণ সুরক্ষিত হওয়ার জন্য কেবলমাত্র একটি অনিরাপদ অপারেশন প্রয়োজন needs মৌলিকভাবে সুরক্ষিত স্ট্রিং হ্যান্ডলিংয়ের উপরে লেখা কোনও অ্যাপ্লিকেশন 100% নিখুঁত হবে - এর অর্থ এটি নিরাপদ হবে।

সমস্যাটি হ'ল নিরাপত্তাহীন হওয়ার জন্য হয় হয় সঠিক ঠিকানায় চার্জ করা হয় না (অ্যাপ্লিকেশন বিক্রয়কারী সংস্থাটি কখনই ক্রয়মূল্য ফেরত দিতে হবে না), বা সিদ্ধান্ত নেওয়ার সময় স্পষ্টভাবে দৃশ্যমান হয় না ("আমাদের শিপিং করতে হবে মার্চ মাসে যাই হোক না কেন! ")। আমি মোটামুটি নিশ্চিত যে আপনি যদি আপনার কোম্পানির মুনাফার পরিবর্তে দীর্ঘমেয়াদী ব্যয় এবং ব্যয় আপনার ব্যবহারকারীদের কাছে উপস্থাপন করেন তবে সি বা সম্পর্কিত ভাষায় লেখা আরও ব্যয়বহুল, সম্ভবত এত ব্যয়বহুল যে এটি অনেকের মধ্যে পরিষ্কারভাবে ভুল পছন্দ ক্ষেত্র যেখানে আজকাল প্রচলিত জ্ঞান বলে যে এটি একটি প্রয়োজনীয়তা। তবে কঠোর সফ্টওয়্যার দায়বদ্ধতা না আনলে এটি পরিবর্তন হবে না - যা শিল্পের কেউ চায় না।


-১: সমস্ত অশুভের মূল হিসাবে দোষ চাপানো পরিচালনা বিশেষভাবে গঠনমূলক নয়। ইতিহাসকে কিছুটা কম উপেক্ষা করা। উত্তরটি শেষ বাক্যটি দিয়ে প্রায় মুক্তি পেয়েছে।
mattnz

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

4

সি ব্যবহারের দুর্দান্ত শক্তিগুলির মধ্যে একটি হ'ল এটি আপনাকে যেভাবে উপযুক্ত দেখায় মেমরিটি ম্যানিপুলেট করতে দেয়।

সি ব্যবহারের দুর্দান্ত দুর্বলতাগুলির একটি হ'ল এটি আপনাকে যেভাবে ফিট দেখায় মেমরিটিকে ম্যানিপুলেট করতে দেয়।

কোনও অনিরাপদ ফাংশনের নিরাপদ সংস্করণ রয়েছে। তবে প্রোগ্রামার এবং সংকলক তাদের ব্যবহার কঠোরভাবে প্রয়োগ করে না।


2

সি এর নির্মাতারা কেন লাইব্রেরিগুলিকে সংশোধন করে এই সমস্যাগুলি সমাধান করবেন না?

সম্ভবত কারণ সি ++ ইতিমধ্যে এটি করেছে এবং সি কোডের সাথে পিছনে সুসংগত। সুতরাং আপনি যদি নিজের সি কোডে একটি নিরাপদ স্ট্রিং টাইপ চান তবে আপনি কেবল স্টডি :: স্ট্রিং ব্যবহার করুন এবং সি ++ সংকলক ব্যবহার করে আপনার সি কোডটি লিখুন।

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

আমি মনে করি সমস্যাটি হ'ল পুরানো স্ট্রিপিপি ইত্যাদির রুটিনগুলি এখনও বিদ্যমান। সেগুলি যদি স্ট্রঙ্কপি ইত্যাদির পক্ষে সরানো হয় তবে তা সাহায্য করবে।


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

-2

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

প্রোগ্রামিং সম্প্রদায়ের কিছু অংশ এই গর্তগুলি প্লাগ করতে চায় না। স্ট্রিং, অ্যারে, পয়েন্টার, আবর্জনা সংগ্রহ শুরু করে এমন সমস্ত শিখা যুদ্ধগুলি কেবল দেখুন ...


5
LOL, ভয়ানক এবং ভুল-মাথা উত্তর।
হাননিকট

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

1
@ ডেভিডথর্নলি: সি এর কাজ করার জন্য কেউ একটি ভাষা ডিজাইন করতে পারে তবে এটি তৈরি করতে পারে যাতে কাজগুলি করার স্বাভাবিক অভিব্যক্তিগুলি কমপক্ষে কোনও সংকলককে বাফার ওভারফ্লোগুলি যথাযথভাবে দক্ষতার সাথে পরীক্ষা করতে দেয়, যদি সংকলকটি এটি করার জন্য বেছে নেয় choose memcpy()উপলব্ধ থাকা এবং এটির দক্ষতার সাথে কোনও অ্যারের অংশটি অনুলিপি করার কেবলমাত্র মাধ্যম হওয়ার মধ্যে একটি বিশাল পার্থক্য রয়েছে ।
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.