আপনার বাহ্যিক API গুলি থেকে অপ্রত্যাশিত মান থেকে রক্ষা করা উচিত?


51

বলে একটি ফাংশন যে একটি বহিস্থিত API থেকে ইনপুট নেয় কোডিং দেয় MyAPI

বাহ্যিক এপিআই- MyAPIএর একটি চুক্তি রয়েছে যা জানিয়েছে যে এটি এক stringবা এটিকে ফিরিয়ে দেবে number

এটা ভালো জিনিস তাড়ান বাঞ্ছনীয় null, undefined, boolean, ইত্যাদি যদিও এটি API- এর অংশ নয় MyAPI? বিশেষত, যেহেতু সেই এপিআইতে আপনার কোনও নিয়ন্ত্রণ নেই আপনি স্থির ধরণের বিশ্লেষণের মতো কোনও কিছু দিয়ে গ্যারান্টিটি তৈরি করতে পারবেন না তাই দুঃখের চেয়ে নিরাপদ থাকা ভাল?

আমি দৃust়তা নীতি সম্পর্কে বিবেচনা করছি ।


16
যদি সেই অপ্রত্যাশিত মানগুলি ফিরিয়ে দেওয়া হয় না তবে তার প্রভাবগুলি কী? আপনি কি এই প্রভাবগুলি নিয়ে বেঁচে থাকতে পারেন? প্রভাবগুলি মোকাবেলা করতে বাধা দেওয়ার জন্য কী এই অপ্রত্যাশিত মানগুলি পরিচালনা করা জটিল?
ভিনসেন্ট সাভার্ড 18

55
যদি আপনি সেগুলি আশা করেন তবে সংজ্ঞা অনুসারে তারা অপ্রত্যাশিত নয়।
ম্যাসন হুইলার

28
মনে রাখবেন API কেবল আপনাকে বৈধ JSON ফিরিয়ে দিতে বাধ্য নয় (আমি ধরে নিচ্ছি যে এটি JSON)। আপনি যেমন একটি উত্তর পেতে পারেন<!doctype html><html><head><title>504 Gateway Timeout</title></head><body>The server was unable to process your request. Make sure you have typed the address correctly. If the problem persists, please try again later.</body></html>
ব্যবহারকারী 253751

5
"বাহ্যিক এপিআই" এর অর্থ কী? এটি কি এখনও আপনার নিয়ন্ত্রণে আছে?
Deduplicator

11
"একজন ভাল প্রোগ্রামার এমন একজন যিনি একমুখী রাস্তা পার হওয়ার আগে উভয় পথ দেখেন" "
jeroen_de_schutter

উত্তর:


103

উত্স নির্বিশেষে আপনার সফ্টওয়্যারটির ইনপুটগুলিকে কখনই বিশ্বাস করা উচিত নয়। কেবল প্রকারগুলি বৈধকরণই গুরুত্বপূর্ণ নয়, তবে ইনপুট এবং ব্যবসায়িক যুক্তিগুলিরও রয়েছে। একটি মন্তব্য প্রতি, OWASP দ্বারা এটি ভাল বর্ণনা করা হয়েছে

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


মন্তব্যগুলি থেকে আমি দেখতে পাচ্ছি যে সম্ভবত আমার উত্তরটি কিছুটা প্রসারিত হতে পারে।

"ইনপুটগুলিকে কখনই বিশ্বাস করবেন না" দ্বারা, আমি সহজভাবে বোঝাচ্ছি যে আপনি অনুমান করতে পারবেন না যে আপনি সর্বদা প্রবাহিত বা ডাউন স্ট্রিম সিস্টেমগুলি থেকে বৈধ এবং বিশ্বাসযোগ্য তথ্য পাবেন এবং তাই আপনাকে সর্বদা নিজের যোগ্যতার সেরাটিকে এই ইনপুটটি স্যানিটাইজ করা উচিত, বা প্রত্যাখ্যান করা উচিত এটা।

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

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

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


20
কিউভি কি জন্য দাঁড়ানো?
JONH

15
@ জোনএইচ মূলত "আরও দেখুন" ... টার্গেট হ্যাক একটি উদাহরণ যা তিনি এন.অক্সফোর্ডডিকোরিয়ালস / ডেফিনিশন / কিউভি উল্লেখ করছেন
অ্যান্ড্রুওয়েবার

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

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

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

33

হ্যাঁ , অবশ্যই তবে উত্তরটি আলাদা হতে পারে বলে আপনি কী ভাবছেন?

চুক্তিটি যা বলে, এপিআই যদি না ফেরায় তবে আপনি অবশ্যই আপনার প্রোগ্রামটিকে কিছুটা অনাকাঙ্ক্ষিত আচরণ করতে দিতে চান না, তাই না? সুতরাং কমপক্ষে আপনার কোনওরকম আচরণ এর সাথে মোকাবেলা করতে হবে । ত্রুটি পরিচালনার একটি সর্বনিম্ন ফর্ম সর্বদা (খুব ন্যূনতম!) প্রচেষ্টার পক্ষে মূল্যবান এবং এই জাতীয় কিছু বাস্তবায়ন না করার জন্য কোনও অজুহাত নেই।

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

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

সুতরাং আপনি যা করছেন তার প্রতিফলনের বিরুদ্ধে কোনও শর্টকাট নেই , আপনার সাধারণ জ্ঞান ব্যবহার সর্বদা বাধ্যতামূলক।


কী করবেন তা অন্য সিদ্ধান্ত। সমাধানে আপনার ব্যর্থতা থাকতে পারে। অ্যাসিঙ্ক্রোনাসের যে কোনও কিছু ব্যতিক্রম লগ (বা মৃত পত্র) তৈরি করার আগে পুনরায় চেষ্টা করা যেতে পারে। যদি সমস্যাটি অব্যাহত থাকে তবে বিক্রেতা বা সরবরাহকারীকে সক্রিয় সতর্কতা একটি বিকল্প হতে পারে।
mckenzm

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

1
হুঁ, ক্র্যাপ / কার্প / ডাই অ্যাপ্রোচ। খারাপ (তবে আইনী) অনুরোধগুলি পাস করার জন্য কি আমাদের দোষ? প্রতিক্রিয়া কি সম্ভব, তবে বিশেষত আমাদের জন্য ব্যবহারযোগ্য নয়? বা প্রতিক্রিয়াটি কি দুর্নীতিগ্রস্থ? বিভিন্ন পরিস্থিতিতে, এখন এটি হোম ওয়ার্কের মতো শোনাচ্ছে।
mckenzm

21

দৃust়তা নীতি - বিশেষত, "আপনি যা গ্রহণ করেন তাতে উদার হন" - এটি সফ্টওয়্যারটির একটি খুব খারাপ ধারণা। এটি মূলত হার্ডওয়্যার প্রসঙ্গে তৈরি করা হয়েছিল, যেখানে শারীরিক প্রতিবন্ধকতা প্রকৌশল সহিষ্ণুতাকে খুব গুরুত্বপূর্ণ করে তোলে, তবে সফ্টওয়্যারে, যখন কেউ আপনাকে ত্রুটিযুক্ত বা অন্যায়ভাবে ইনপুট প্রেরণ করে তখন আপনার দুটি পছন্দ থাকে have আপনি এটি এটিকে প্রত্যাখ্যান করতে পারেন, (মূলত কী ভুল হয়েছে তার ব্যাখ্যা দিয়ে) বা আপনি এটির অর্থ বোঝানোর চেষ্টা করার চেষ্টা করতে পারেন।

সম্পাদনা: দেখা যাচ্ছে উপরের বিবৃতিতে আমার ভুল হয়েছিল। দৃust়তা নীতি হার্ডওয়্যার জগত থেকে আসে না, ইন্টারনেট আর্কিটেকচার থেকে, বিশেষত আরএফসি 1958 । এতে বলা হয়েছে:

3.9 প্রেরণ করার সময় কঠোর হন এবং গ্রহণ করার সময় সহনশীল হন। নেটওয়ার্কগুলিতে প্রেরণের সময় অবশ্যই প্রয়োগগুলি অবশ্যই স্পেসিফিকেশন অনুসরণ করে এবং নেটওয়ার্ক থেকে ত্রুটিযুক্ত ইনপুট সহ্য করে। সন্দেহ হলে, কোনও ত্রুটি বার্তা না দিয়ে ত্রুটিযুক্ত ইনপুট নিঃশব্দে ফেলে দিন, যদি না এটি নির্দিষ্টকরণের প্রয়োজন হয়।

এটি, স্পষ্টভাবে বলতে গেলে, শুরু থেকে শেষ করা সহজ। এই পোস্টে প্রদত্ত কারণগুলির কারণে "ত্রুটি বার্তা না দিয়ে নিঃশব্দে ত্রুটিযুক্ত ইনপুট বাতিল করুন" এর চেয়ে ত্রুটি পরিচালনার আরও বেশি ভুল মাথার ধারণাটি ধারণ করা কঠিন।

এই বিষয়টির আরও বিশদ বিবরণের জন্য আইইটিএফ পত্রিকাটি দৃust়তা নীতির ক্ষতিকারক ফলাফলগুলিও দেখুন

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

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

এই কারণেই ফেইল ফাস্ট নীতিটি উপস্থিত রয়েছে; আপনার এপিআইগুলিতে প্রয়োগ করে মাথা ব্যাথার সাথে জড়িত সবাইকে বাঁচান।


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

9
@ মরজেন: দৃ rob়তার নীতিটি ব্রাউজারদের বরং স্লোপি এইচটিএমএল গ্রহণ করা উচিত বলে পরামর্শ দেওয়ার জন্য ব্যবহৃত হয়েছিল এবং ব্রাউজারগুলি যথাযথ এইচটিএমএল দাবি করে থাকলে তারা মোতায়েন করা ওয়েব সাইটগুলির তুলনায় অনেক opালু হতে পারে। যদিও সমস্যার একটি বড় অংশ হ'ল মানব-উত্পাদিত এবং মেশিন-উত্পাদিত সামগ্রীর জন্য একটি সাধারণ ফর্ম্যাট ব্যবহার করা ছিল, তাদের মধ্যে রূপান্তর করার জন্য ইউটিলিটিগুলির পাশাপাশি পৃথক মানব-সম্পাদনযোগ্য এবং মেশিন-পার্সেবল ফর্ম্যাটগুলি ব্যবহার করার বিপরীতে।
সুপারক্যাট

9
@ সুপের্যাট: তবুও - বা ঠিক তাই - এইচটিএমএল এবং ডাব্লুডাব্লুডাব্লু অত্যন্ত সফল ছিল ;-)
ডক ব্রাউন

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

5
নিখুঁতভাবে জাভাস্ক্রিপ্ট অবিলম্বে মাথায় আসে, উদাহরণস্বরূপ ...
ম্যাসন হুইলারের

13

সাধারণভাবে, কোডটি অন্তত নিম্নলিখিত সীমাবদ্ধতাগুলি সমর্থন করার জন্য তৈরি করা উচিত যখনই ব্যবহারিক:

  1. সঠিক ইনপুট দেওয়া হলে সঠিক আউটপুট উত্পাদন করুন।

  2. যখন বৈধ ইনপুট দেওয়া হয় (যা সঠিক হতে পারে বা নাও হতে পারে), বৈধ আউটপুট উত্পাদন করুন (একইভাবে)।

  3. যখন অবৈধ ইনপুট দেওয়া হয়, তখন সাধারণ ইনপুট বা ত্রুটি সংকেত হিসাবে সংজ্ঞায়িত হিসাবে সংজ্ঞায়িত হয়ে ওঠা কোনও পার্শ্ব-প্রতিক্রিয়া ছাড়াই এটি প্রক্রিয়া করুন।

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

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

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


তারপরে এপিআই কলের ফলাফলটি একটি "ইনপুট" কিনা তা সিদ্ধান্ত নেওয়ার জন্য এটি সমস্ত নেমে আসে।
mastov

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

3

আসুন দুটি পরিস্থিতিতে তুলনা করুন এবং একটি সিদ্ধান্তে আসতে চেষ্টা করুন।

দৃশ্য 1 1 আমাদের অ্যাপ্লিকেশন ধরে নিয়েছে বাহ্যিক এপিআই চুক্তি অনুসারে আচরণ করবে।

পরিস্থিতি 2 আমাদের অ্যাপ্লিকেশন ধরে নিয়েছে বাহ্যিক এপিআই খারাপ ব্যবহার করতে পারে, তাই সতর্কতা যুক্ত করুন।

সাধারণভাবে, কোনও এপিআই বা সফ্টওয়্যার চুক্তি লঙ্ঘনের সুযোগ রয়েছে; কোনও বাগ বা অপ্রত্যাশিত অবস্থার কারণে হতে পারে। এমনকি কোনও এপিআই-তে অভ্যন্তরীণ সিস্টেমে সমস্যা হতে পারে যার ফলে অপ্রত্যাশিত ফলাফল পাওয়া যায়।

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

উদাহরণস্বরূপ, নাল মানগুলি যা আপনি বেছে নিয়েছেন। বলুন, এপিআই চুক্তি অনুসারে প্রতিক্রিয়ার নালিকাগুলি থাকা উচিত; তবে এটি হঠাৎ লঙ্ঘন করা হলে আমাদের প্রোগ্রামের ফলাফল এনপিইতে আসবে।

সুতরাং, আমি বিশ্বাস করি যে আপনার অ্যাপ্লিকেশনটিতে অপ্রত্যাশিত পরিস্থিতিগুলি সমাধান করার জন্য কিছু অতিরিক্ত কোড রয়েছে তা নিশ্চিত করে নেওয়া ভাল better


1

আপনার সর্বদা আগত ডেটা বৈধ করা উচিত - ব্যবহারকারী-প্রবেশ করা বা অন্যথায় - যাতে আপনার বাহ্যিক এপিআই থেকে প্রাপ্ত তথ্য অবৈধ হয় তখন হ্যান্ডেল করার জায়গায় আপনার একটি প্রক্রিয়া থাকা উচিত।

সাধারণভাবে বলতে গেলে, অতিরিক্ত-অরগানাইজেশনাল সিস্টেমগুলির যে কোনও সিউমের সাথে সাক্ষাত করতে প্রমাণীকরণ, অনুমোদন (যদি কেবলমাত্র প্রমাণীকরণ দ্বারা সংজ্ঞায়িত না হয়) এবং বৈধকরণের প্রয়োজন হয়।


1

সাধারণভাবে, হ্যাঁ, আপনাকে অবশ্যই সর্বদা ত্রুটিযুক্ত ইনপুট থেকে রক্ষা করতে হবে, তবে এপিআইর ধরণের উপর নির্ভর করে "গার্ড" বলতে বিভিন্ন জিনিস বোঝায়।

কোনও সার্ভারের বাহ্যিক এপিআইয়ের জন্য, আপনি দুর্ঘটনাক্রমে কোনও কমান্ড তৈরি করতে চান না যা সার্ভারের অবস্থাকে ক্র্যাশ করে বা আপস করে তোলে, সুতরাং আপনাকে অবশ্যই এটির বিরুদ্ধে রক্ষা করতে হবে।

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


0

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

"ত্রুটি থাকার কারণে আমি যথেষ্ট পরিমাণে ইনপুট পরীক্ষা করি না" এবং "আমি বৈধ ডেটা প্রত্যাখ্যান করি কারণ আমি খুব কঠোর" এর মধ্যে ভারসাম্য থাকতে হবে।


2
"আমার একটি এপিআই রয়েছে যা অন্য এপিআই দ্বারা সরবরাহ করা ডেটার মাত্র 1% প্রয়োজন" " এরপরে আপনার এপিআই কেন এটির প্রয়োজনের তুলনায় 100 গুণ বেশি ডেটা আশা করে তা প্রশ্নটি উন্মুক্ত করে । যদি আপনাকে পাস করার জন্য অস্বচ্ছ ডেটা সংরক্ষণ করতে হয় তবে এটি আসলে কী তা সম্পর্কে আপনাকে অবশ্যই সুনির্দিষ্ট হতে হবে এবং কোনও নির্দিষ্ট ফর্ম্যাটে এটি ঘোষণা করতে হবে না, সেক্ষেত্রে ফোনকারী আপনার চুক্তি লঙ্ঘন করছে না ।
ভু

1
@ ভু - আমার সন্দেহ হ'ল তারা কিছু বাহ্যিক এপিআই কল করছে (যেমন "সিটির এক্সের জন্য আবহাওয়ার বিশদ পান") এবং তারপরে চেরি-প্রয়োজনীয় ডেটাগুলি বাছাই করে ("বর্তমানের তাপমাত্রা") এবং বাকি ডেটা উপেক্ষা করে ("বৃষ্টিপাত") "," বায়ু "," পূর্বাভাস তাপমাত্রা "," বায়ু চিল ", ইত্যাদি ...)
স্টোবর

@ ক্রিশ্চিয়ানসৌর - আমি মনে করি আপনি যে বৃহত্তর sensকমত্যের চেয়ে বেশি দূরে নন - আপনি যে ডেটা ব্যবহার করেন এটির 1% যাচাই করার জন্য বুদ্ধি করে তবে আপনি যে 99% ব্যবহার করেন না তা পরীক্ষা করার প্রয়োজন হয় না। আপনার কেবলমাত্র সেই জিনিসগুলি যাচাই করতে হবে যা আপনার কোডটি ট্রিপ করতে পারে।
স্টোবার

0

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

পরীক্ষার কারণ হ'ল যদি কোনও কারণে এপিআই / ইনপুট ভুল হয় তবে আমার প্রোগ্রামটি কোনও কিছুর উপর নির্ভর করতে পারে না। হতে পারে আমার প্রোগ্রামটি API এর একটি পুরানো সংস্করণের সাথে লিঙ্কযুক্ত ছিল যা আমি বিশ্বাস করি তার থেকে আলাদা কিছু করে? আমার প্রোগ্রামটি বাহ্যিক প্রোগ্রামে এমন একটি বাগে হোঁচট খাচ্ছে যা এর আগে কখনও হয়নি। বা আরও খারাপ, সারাক্ষণ ঘটে কিন্তু কেউ পাত্তা দেয় না! হতে পারে যে বাহ্যিক প্রোগ্রামটি হ্যাকার দ্বারা বোকা বানাচ্ছে যাতে আমার প্রোগ্রাম বা সিস্টেমকে ক্ষতিগ্রস্থ করতে পারে এমন জিনিসগুলি ফেরত দিতে?

আমার বিশ্বের প্রতিটি কিছুর পরীক্ষার জন্য দুটি ব্যতিক্রম হ'ল:

  1. পারফরম্যান্সের যত্ন সহকারে পরিমাপের পরে:

    • আপনি পরিমাপ করার আগে কখনই অনুকূলিত হন না। সমস্ত ইনপুট / ফেরত ডেটা পরীক্ষা করা বেশিরভাগ ক্ষেত্রে আসল কলের তুলনায় খুব অল্প সময় নেয় তাই এটি সরিয়ে ফেলা প্রায়শই অল্প বা কিছুই বাঁচায়। আমি তবুও ত্রুটি সনাক্তকরণ কোড রাখব, তবে এটিকে মন্তব্য করুন, সম্ভবত কোনও ম্যাক্রো দ্বারা বা কেবল এটিকে মন্তব্য করে।
  2. যখন আপনার কোনও ত্রুটি নেই তখন কী করা উচিত

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

সঠিকভাবে ইনপুট / রিটার্নের মানগুলি কীভাবে পরীক্ষা করা যায় তা একটি গুরুত্বপূর্ণ প্রশ্ন। উদাহরণস্বরূপ, যদি API কে কোনও স্ট্রিং ফিরিয়ে দেওয়া হয় বলা হয়, আমি এটি যাচাই করব:

  • অ্যাক্টুলি ডেটা টাইপ একটি স্ট্রিং

  • এবং সেই দৈর্ঘ্যটি ন্যূনতম এবং সর্বোচ্চ মানের মধ্যে। সর্বদা সর্বোচ্চ আকারের স্ট্রিংগুলি পরীক্ষা করুন যা আমার প্রোগ্রামটি হ্যান্ডেল করার আশা করতে পারে (নেটওয়ার্কিং সিস্টেমে খুব বড় স্ট্রিংগুলি ফিরিয়ে আনা একটি ধ্রুপদী সুরক্ষা সমস্যা)।

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

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

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