যদি সম্ভব হয় তবে এটি করবেন না।
এটি উত্তর - এটি একটি বিরোধী-নিদর্শন। যদি ক্লায়েন্টটি টেবিলটি জানে তবে এটি থেকে ডেটা চায় SELECT FROM ThatTable
। যদি কোনও ডাটাবেস এমনভাবে ডিজাইন করা হয় যাতে এটি প্রয়োজনীয় হয় তবে মনে হয় এটি উপ-অনুকূলভাবে ডিজাইন করা হয়েছে। যদি কোনও ডেটা অ্যাক্সেস লেয়ারটি যদি কোনও টেবিলের মধ্যে কোনও মান বিদ্যমান কিনা তা জানতে প্রয়োজন হয় তবে সেই কোডটিতে এসকিউএল রচনা করা সহজ, এবং এই কোডটিকে ডাটাবেসে ঠেলা ভাল নয় not
আমার কাছে এটি লিফ্টের অভ্যন্তরে কোনও ডিভাইস ইনস্টল করার মতো মনে হয় যেখানে পছন্দসই মেঝেতে কেউ টাইপ করতে পারে। গো বোতাম টিপে যাওয়ার পরে, এটি একটি যান্ত্রিক হাতকে পছন্দসই তলটির জন্য সঠিক বোতামের দিকে নিয়ে যায় এবং টিপে দেয়। এটি অনেক সম্ভাব্য সমস্যাগুলির পরিচয় দেয়।
দয়া করে নোট করুন: এখানে উপহাস করার কোনও উদ্দেশ্য নেই। এই নিখুঁতভাবে এই কৌশলটি দিয়ে সমস্যাগুলি ইঙ্গিত করার জন্য আমার নির্বোধ লিফ্টের উদাহরণটি ছিল * আমি সবচেয়ে সেরা ডিভাইসটি * কল্পনা করতে পারি। এটি সংক্ষিপ্ত / উদ্ভট সার্ভার-সাইড এসকিউএল কোড ব্যবহার করে একটি হাইব্রিডে কলার স্পেস থেকে টেবিলের নাম পছন্দ (একটি শক্তিশালী এবং ভালভাবে বোঝা ডিএসএল, এসকিউএল) ব্যবহার করে ইন্ডিয়ারেশনের একটি অকেজো স্তর যুক্ত করে।
গতিশীল এসকিউএল-তে ক্যোয়ারি নির্মাণ লজিকের চলাফেরার মাধ্যমে এই জাতীয় দায়িত্ব-বিভাজন কোডটিকে বোঝা আরও শক্ত করে তোলে। এটি ত্রুটির সম্ভাবনার সাথে ভরা কাস্টম কোডের নামে একটি স্ট্যান্ডার্ড এবং নির্ভরযোগ্য কনভেনশন (কীভাবে একটি এসকিউএল কোয়েরি চয়ন করবে) তা লঙ্ঘন করে।
এই পদ্ধতির সাথে কিছু সম্ভাব্য সমস্যার উপর বিশদ পয়েন্ট এখানে দেওয়া হয়েছে:
ডায়নামিক এসকিউএল এসকিউএল ইঞ্জেকশনটির সম্ভাবনা সরবরাহ করে যা সামনের শেষ কোড বা ব্যাক এন্ড কোডে একা সনাক্ত করা শক্ত (এটি দেখতে তাদের অবশ্যই একসাথে পরিদর্শন করতে হবে)।
সঞ্চিত পদ্ধতি এবং ফাংশনগুলি এমন সংস্থানগুলিতে অ্যাক্সেস করতে পারে যেগুলিতে এসপি / ফাংশনের মালিকের অধিকার রয়েছে তবে কলারের তা নেই। আমি যতদূর বুঝতে পারি, বিশেষ যত্ন ছাড়াই, তারপরে ডিফল্টরূপে আপনি যখন কোডটি ব্যবহার করেন যা গতিশীল এসকিউএল তৈরি করে এবং এটি চালায়, ডেটাবেস কলারের অধিকারের অধীনে গতিশীল এসকিউএল চালায়। এর অর্থ আপনি হয় কোনও সুবিধাযুক্ত বস্তু ব্যবহার করতে পারবেন না, বা আপনাকে এগুলি সমস্ত ক্লায়েন্টের জন্য উন্মুক্ত করতে হবে, সম্ভাব্য আক্রমণের পৃষ্ঠের ক্ষেত্রটিকে সুবিধাগুলিযুক্ত ডেটাতে বাড়িয়ে তুলতে হবে। সর্বদা নির্দিষ্ট ব্যবহারকারীর (এসকিউএল সার্ভারে EXECUTE AS
) চালানোর জন্য এসপি / ফাংশন নির্ধারণের ফলে সমস্যাটি সমাধান হতে পারে তবে জিনিসগুলি আরও জটিল করে তোলে। এটি গতিশীল এসকিউএলকে খুব প্ররোচিত আক্রমণকারী ভেক্টর করে পূর্ববর্তী পয়েন্টে উল্লিখিত এসকিউএল ইঞ্জেকশনের ঝুঁকি বাড়িয়ে তোলে।
যখন কোনও বিকাশকারীকে বুঝতে হবে যে অ্যাপ্লিকেশন কোডটি এটি সংশোধন করতে বা কোনও ত্রুটি সংশোধন করার জন্য কী করছে, তখন সঠিক এসকিউএল কোয়েরি কার্যকর করা খুব কঠিন মনে হবে find এসকিউএল প্রোফাইলার ব্যবহার করা যেতে পারে তবে এটি বিশেষ সুবিধা নেয় এবং উত্পাদন সিস্টেমে নেতিবাচক কর্মক্ষমতা প্রভাব ফেলতে পারে। মৃত্যুদন্ডপ্রাপ্ত জিজ্ঞাসাটি এসপি দ্বারা লগইন করা যেতে পারে তবে এটি সন্দেহজনক সুবিধার জন্য জটিলতা বৃদ্ধি করে (নতুন টেবিলের সমন্বিত প্রয়োজন, পুরানো ডেটা বিশুদ্ধ করা ইত্যাদি) এবং এটি একেবারে স্পষ্ট নয়। আসলে, কিছু অ্যাপ্লিকেশনগুলি এমনভাবে আর্কিটেক্ট করা হয় যে বিকাশকারীর ডেটাবেস শংসাপত্রগুলি না থাকে, সুতরাং কোয়েরিটি জমা দেওয়া আসলে তার পক্ষে দেখা প্রায় অসম্ভব হয়ে পড়ে।
যখন কোনও ত্রুটি দেখা দেয়, যেমন আপনি যখন উপস্থিত নন এমন একটি টেবিল নির্বাচন করার চেষ্টা করেন তখন আপনি ডাটাবেস থেকে "অবৈধ অবজেক্টের নাম" এর লাইনে একটি বার্তা পাবেন। আপনি ঠিক পেছনের প্রান্তে বা ডাটাবেসটিতে এসকিউএল রচনা করছেন কিনা তা ঠিক একই ঘটবে তবে পার্থক্যটি হ'ল কিছু দুর্বল বিকাশকারী যিনি সিস্টেমটির সমস্যা সমাধানের চেষ্টা করছেন তার একের নিচে অন্য একটি গুহায় এক স্তর আরও গভীরভাবে ছড়িয়ে দিতে হবে যেখানে সমস্যাটি রয়েছে, বিস্ময়কর পদ্ধতিটি খনন করতে সমস্যাটি কী তা বোঝার চেষ্টা করার চেষ্টা করে। লগগুলি "গেটউইজেটে ত্রুটি" দেখাবে না, এটি "ওয়ানপ্রসেসটোটোরুলেটেমালআররনারে ত্রুটি" প্রদর্শন করবে। এই বিমূর্ততা সাধারণত একটি সিস্টেমকে আরও খারাপ করে দেবে ।
প্যারামিটারের উপর ভিত্তি করে টেবিলের নাম স্যুইচ করা সিউডো-সি # এর একটি উদাহরণ:
string sql = $"SELECT * FROM {EscapeSqlIdentifier(tableName)};"
results = connection.Execute(sql);
যদিও এটি প্রতিটি সম্ভাব্য সমস্যাটি কল্পনাপ্রসূতভাবে দূর করে না, অন্য কৌশলগুলির সাথে আমি যে ত্রুটিগুলি উল্লেখ করেছি সেগুলি এই উদাহরণ থেকে অনুপস্থিত।