আক্রমণকারীরা কী কী, কীভাবে সেগুলি ব্যবহার করা যায় এবং আপনি কি এটি কখনও আপনার প্রোগ্রামে ব্যবহার করেছেন?


48

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

আমার বিবরণটি সঠিক, বা আমি কিছু মিস করেছি? আপনি কি কখনও তাদের প্রোগ্রামে ব্যবহার করেছেন? এবং যদি তা হয় তবে তাদের কীভাবে উপকার হবে?



@ রবার্ট হার্ভে: হ্যাঁ, আমি আসলে এটি পড়েছি। তবে আমার কাছে মনে হয় যে আক্রমণকারীরা কেবল তখনই কার্যকর যখন আপনি কিছু প্রমাণ করার চেষ্টা করছেন। এটি কি সঠিক (কোনও পাং উদ্দেশ্য নয়)?
গ্যাবলিন

এটাই আমার বোঝাপড়া; আপনি যখন নিজের প্রোগ্রামটির বিষয়ে সঠিকতা প্রমাণ করার জন্য যুক্তি করার চেষ্টা করছেন।
রবার্ট হার্ভে

3
@ ইউজার 9094: একটি দৃser়তা হ'ল একটি ঘোষণা যা রানটাইমের কোনও নির্দিষ্ট সময়ে সত্য এবং কোডটিতে প্রতিনিধিত্ব করা হয়। আক্রমণকারী হ'ল একটি বিবৃতি (একজন আশা করি সুপ্রতিষ্ঠিত) যা যখনই প্রয়োগ হয় সর্বদা সত্য হবে এবং কোডটিতে নিজেই প্রতিনিধিত্ব করা হয় না।
ডেভিড থর্নলি

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

উত্তর:


41

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

আক্রমণকারীটির একটি উদাহরণ হতে পারে যে দুটি সদস্যের ভেরিয়েবলের মধ্যে ঠিক একটি শূন্য হওয়া উচিত। বা এটির যদি একটি প্রদত্ত মান থাকে তবে অন্যটির জন্য অনুমোদিত মানগুলির সেটটি হ'ল এটি বা এটি ...

আমি কিছুক্ষেত্রে অজানা ব্যক্তিটি ধরে আছে কিনা তা পরীক্ষা করতে অবজেক্টটির সদস্য ফাংশন ব্যবহার করি। যদি এটি না হয় তবে দৃ as়ভাবে উত্থাপিত হয়। এবং পদ্ধতিটিকে প্রতিটি পদ্ধতির শুরু এবং প্রস্থানটিতে বলা হয় যা বস্তু পরিবর্তন করে (সি ++ এ, এটি কেবল একটি লাইন ...)


11
আক্রমণকারীদের উল্লেখ করার জন্য +1 একটি নির্বাহী পদ্ধতির মাঝখানে সত্য হওয়া উচিত নয়।
42

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

3
@ আলেকজান্দার: অপ্রয়োজনীয় আক্রমণকারীদের পক্ষে এড়ানো প্রায় অসম্ভব। উত্তরে বর্ণিত হিসাবে আপনার যদি কোনও পদ্ধতিতে একাধিক ভেরিয়েবল আপডেট করার প্রয়োজন হয় তবে একটি পয়েন্ট রয়েছে যেখানে কেবলমাত্র একটি আপডেট করা হয়েছে এবং আক্রমণকারীটি মিথ্যা। নতুন কোড যুক্ত না করে ভাল কোড লেখার ক্ষেত্রে যথেষ্ট বাধা রয়েছে।
অপরাহ্ন এ 19th

হ্যাঁ, এটি প্রায়শই অনিবার্য। তবে উদাহরণস্বরূপ, যদি এখানে ভেরিয়েবলগুলির একটি গ্রুপ থাকে যা যৌক্তিকভাবে এক সাথে থাকে (যেমন একটি অ্যারে, এবং অ্যারেতে একটি "নির্বাচিত" আইটেমের সূচক), তবে সম্ভবত এগুলি কোনও প্রকারে বের করার উপযুক্ত worth সেখান থেকে অ্যারে বা প্রকারের রূপান্তরগুলি সেই ধরণের নতুন উদাহরণের একক অ্যাসাইনমেন্ট হিসাবে প্রকাশ করা যেতে পারে
আলেকজান্ডার

13

ঠিক আছে, আমি এই থ্রেডে যে জিনিসটি দেখছি তা সব দুর্দান্ত, তবে আমার কাছে একটি 'আক্রমণকারী' এর সংজ্ঞা রয়েছে যা আমার পক্ষে কর্মক্ষেত্রে অত্যন্ত সহায়ক।

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

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

এছাড়াও, এই সংজ্ঞাটি সহায়ক কারণ এটি আপনাকে সাধারণীকরণ, "ইনভেন্টেন্টরা খারাপ" "ব্যবহার করতে দেয়।

উদাহরণস্বরূপ, একটি ম্যানুয়াল ট্রান্সমিশন গাড়ীর শিফটারটি কোনও আক্রমণকারীকে এড়াতে ইঞ্জিনিয়ার করা হয়। আমি চাইলে প্রতিটি গিয়ারের জন্য একটি লিভার দিয়ে একটি সংক্রমণ তৈরি করতে পারতাম। এই লিভারটি এগিয়ে ("নিযুক্ত") বা পিছনে ("ছদ্মবেশী") হতে পারে। এই জাতীয় সিস্টেমে আমি একটি "আক্রমণকারী" তৈরি করেছি, যা নথিভুক্ত হতে পারে:

"এটি গুরুত্বপূর্ণ যে বর্তমানে নিযুক্ত গিয়ারটি আলাদা গিয়ারটি নিযুক্ত করার আগেই তা ছিন্ন করা উচিত ge একই সাথে দুটি গিয়ার জড়িত করা যান্ত্রিক চাপ সৃষ্টি করবে যা সংক্রমণকে ছিন্ন করে দেবে Always

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

এইভাবে, আমরা বলতে পারি যে সংক্রমণটি 'আক্রমণকারীকে সরানোর' জন্য ইঞ্জিনিয়ার করা হয়েছে, কারণ এটি নিজেকে যৌক্তিকভাবে এমনভাবে কনফিগার করার অনুমতি দেয় না যা লজিকাল নিয়ম লঙ্ঘন করে।

আপনি আপনার কোড থেকে এই ধরণের প্রতিটি আক্রমণকারী হ'ল একটি উন্নতি, কারণ এটি এর সাথে কাজ করার জ্ঞানীয় লোডকে হ্রাস করে।


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

1
গাড়ির গিয়ার্সের সাথে আমার তুলনা খুব স্পষ্ট। ধন্যবাদ!
মেরেকি

"একজন আক্রমণকারী হ'ল এমন কোনও যৌক্তিক নিয়ম যা আপনার প্রোগ্রামটি কার্যকর করার সময় অবশ্যই মেনে চলতে হবে যা কোনও মানুষের কাছে জানানো যেতে পারে, তবে আপনার সংকলককে নয়" " - আমি এটি বেশ পছন্দ করি, সংক্ষিপ্ত এবং মনে রাখা সহজ।
জিরো নাইট

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

জমকালো ব্যাখ্যা! আমি এখন সত্যিই বুঝতে পারি যে কেন আপনার কোডে আক্রমণকারী থাকা খারাপ অভ্যাস।
বেন সি ওয়াং

3

একটি আক্রমণকারী (সাধারণ অর্থে) এর অর্থ এমন কিছু শর্ত যা আপনার প্রোগ্রামটি কার্যকর হওয়ার সময় কিছু সময় বা এমনকি সর্বদা সত্য হওয়া উচিত। উদাহরণস্বরূপ PreConditions এবং PostConditions কিছু শর্ত জোর দেওয়ার জন্য ব্যবহার করা যেতে পারে যা কোনও ফাংশন যখন ডাকা হয় এবং কখন ফিরে আসে তখন সত্য হওয়া আবশ্যক। অবজেক্ট ইনগ্রেন্টেন্টরা দৃ as়রূপে ব্যবহার করতে পারেন যে কোনও অবজেক্টের বিদ্যমান থাকার সময়কালে তার বৈধ অবস্থা থাকতে হবে। এটি চুক্তির নীতি দ্বারা নকশা।
আমি কোডগুলিতে চেক ব্যবহার করে অনানুষ্ঠানিকভাবে আক্রমণকারীদের ব্যবহার করেছি। তবে খুব সাম্প্রতিককালে আমি। নেট এর জন্য কোড চুক্তির লাইব্রেরির সাথে খেলছি যা সরাসরি আক্রমণকারীদের সমর্থন করে।


3

কোডার এট ওয়ার্কের নিম্নলিখিত কোটের উপর ভিত্তি করে ...

তবে একবার যদি আপনি আক্রমণকারীটিকে এটি রক্ষণাবেক্ষণ করে জানেন তবে আপনি দেখতে পাবেন, আহ, আমরা যদি সেই আক্রমণকারীটি বজায় রাখি তবে আমরা লগ দেখার সময় পাব।

... আমার ধারণা "আক্রমণকারী" = "আপনি পছন্দসই প্রভাব নিশ্চিত করতে শর্তটি বজায় রাখতে চান" "

দেখে মনে হয় যে আক্রমণকারীটির দুটি ইন্দ্রিয় রয়েছে যা সূক্ষ্ম উপায়ে পৃথক:

  1. কিছু যে একই থাকে।
  2. এক্স লক্ষ্য অর্জনের জন্য আপনি যা কিছু রাখার চেষ্টা করছেন সেটি (যেমন উপরে "লগ দেখার সময়")।

সুতরাং 1 একটি দাবির মত; 2 নির্ভুলতা, কার্য সম্পাদন, বা অন্যান্য বৈশিষ্ট্য প্রমাণ করার জন্য একটি সরঞ্জামের মতো - আমি মনে করি। 2 এর উদাহরণের জন্য উইকিপিডিয়া নিবন্ধটি দেখুন (এমউ ধাঁধাটির সমাধানের সঠিকতা প্রমাণ করে)।

প্রকৃতপক্ষে তৃতীয় জ্ঞানের আক্রমণকারীটি হ'ল:

.3। প্রোগ্রাম (বা মডিউল বা ফাংশন) কী করার কথা রয়েছে; অন্য কথায়, এর উদ্দেশ্য।

একই কোডার অ্যাট ওয়ার্কের সাক্ষাত্কার থেকে:

তবে যেটি বড় সফ্টওয়্যারকে পরিচালনাযোগ্য করে তোলে তাতে কিছু বিশ্বব্যাপী আক্রমণকারী বা বড়-চিত্রের বিবৃতি দেওয়া হয় যা এটি করা উচিত এবং কোনটি সত্য বলে মনে করা হচ্ছে about


1

একটি আক্রমণকারী হ'ল নিয়ম বা অনুমানের মতো যা আপনার প্রোগ্রামের লজিক নির্দেশ করতে ব্যবহার করা যেতে পারে।

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

এটি কোনও ডিবি রেকর্ড বা অন্য কিছু হতে পারে তবে এখনই ধরে নেওয়া যাক প্রতিটি ব্যবহারকারীর অ্যাকাউন্টটি একটি শ্রেণি অবজেক্ট দ্বারা প্রতিনিধিত্ব করা হয়েছে।

শ্রেণীর ব্যবহারকারী অ্যাকাউন্ট {বেসরকারী চর * pUserName; বেসরকারী চর * পিয়ারেন্টএকউন্ট অ্যাকাউন্টের নাম;

...

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


আক্রমণকারীরা একটি প্রোগ্রামের স্থিতি পরীক্ষা করে। তারা সিদ্ধান্তের নকশা করে না।
জাভিয়ের নোডেট

3
আক্রমণকারীরা কিছুই পরীক্ষা করে না। কোনও আক্রমনকারী সত্য বা মিথ্যা কিনা তা দেখতে আপনি প্রোগ্রামের স্থিতি পরীক্ষা করতে পারেন, তবে আক্রমণকারীরা নিজেরাই কিছু করেন না।
পেমদাস

2
সাধারণত, সি ++ তে আপনি দেখতে পাবেন কিছু ধরণের শ্রেণীর আগ্রাসন যেমন সদস্য এক্স অবশ্যই 25 এর চেয়ে কম এবং 0 এর চেয়ে বেশি হবে। এটি হানাদার। সেই আক্রমণকারী বিরুদ্ধে যে কোনও চেক হ'ল জোর দেওয়া। আমার উপরের উদাহরণটিতে আমার আক্রমণকারীটি হ'ল যদি প্যারেন্টঅ্যাক্টাউন্টউজারনেম নুল বা খালি হয় তবে এটি প্যারেন্ট অ্যাকাউন্ট account আক্রমণকারীরা সিদ্ধান্ত নকশা করা হয়।
পেমদাস

আপনি কীভাবে পরীক্ষা করতে পারেন যে যদি পিয়ারেন্টএকাউন্টস ব্যবহারকারীর নাম নুল বা খালি হয় তবে এই অবজেক্টটি প্যারেন্ট অ্যাকাউন্ট? আপনার বিবৃতিটি কেবল নাল / ফাঁকা মানকে কী উপস্থাপন করবে বলে নির্ধারণ করে। আক্রমণকারীটি হ'ল সিস্টেমটি সেই অনুসারে কাজ করে, অর্থাত্ পিটারেন্টস্যাক্টাউন্টউজারনেম কেবল নালিকা বা খালি হতে পারে যদি এটি প্যারেন্ট অ্যাকাউন্ট হয়। এটি একটি সূক্ষ্ম পার্থক্য।
ক্যামেরন

1

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

সাধারণভাবে, এই বিষয়গুলি স্যানিটি চেক হিসাবে গুরুত্বপূর্ণ, তবে তারা নিজেরাই এগুলি সঠিকতা প্রমাণ করতে পারে না।


1
-১ পদার্থবিজ্ঞানের ইনগ্রায়েন্ট আলাদা। একটি দ্রষ্টব্য গণনা করা অ্যালগরিদম সঠিক কিনা তা প্রমাণ করার মতো নয়। পরবর্তীকালের জন্য, আক্রমণকারীরা সঠিকতা প্রমাণ করতে পারে।
অ্যারোনাস্টারিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.