টি এল; ডিআর
- অ্যাপ্লিকেশন ইনপুট গ্রহণ করে, এক্ষেত্রে 'ন্যান্সি', চেষ্টা না করেই
- ইনপুট স্যানিটাইজ করুন, যেমন বিশেষ অক্ষরগুলি এড়িয়ে যাওয়ার মাধ্যমে
স্কুল => ঢোকান এমনটা ছাত্র মূল্যবোধ ( 'ন্যান্সি' );
সংযুক্ত 0 1
- এসকিউএল ইঞ্জেকশনটি ঘটে যখন কোনও ডাটাবেস কমান্ডের ইনপুটটি ম্যানিপুলেটেড হয়
- ডাটাবেস সার্ভারকে স্বেচ্ছাসেবী এসকিউএল চালিত করার কারণ দিন
স্কুল => ঢোকান এমনটা ছাত্র মূল্যবোধ ( 'রবার্ট' ); টেবিল ছাত্রদের ড্রপ ; - ');
সংযুক্ত 0 1
টেবিল ড্রপ
- শিক্ষার্থীদের রেকর্ড এখন শেষ - এটি আরও খারাপ হতে পারে!
স্কুল => নির্বাচন করুন * শিক্ষার্থী থেকে ;
ত্রুটি : সম্পর্ক "ছাত্র" নেই না অস্তিত্ব
লাইন 1 : শিক্ষার্থী থেকে * নির্বাচন করুন ;
^
এটি শিক্ষার্থীর টেবিলটি (মুছে ফেলা) করে।
( এই উত্তরের সমস্ত কোড উদাহরণ পোস্টগ্র্রেএসকিউএল 9.1.2 ডাটাবেস সার্ভারে চালিত হয়েছিল ))
কী হচ্ছে তা পরিষ্কার করার জন্য, আসুন একটি সাধারণ টেবিল দিয়ে এটি কেবল নাম ক্ষেত্র সহ চেষ্টা করুন এবং একটি একক সারি যুক্ত করুন:
স্কুল => তৈরি সারণী ছাত্র ( নাম টেক্সট প্রাথমিক চাবিকাঠি );
বিজ্ঞপ্তি : তৈরি করুন সারণী / প্রাথমিক চাবিকাঠি হবে তৈরি অন্তর্নিহিত সূচক "students_pkey" জন্য টেবিল "ছাত্র" তৈরি করুন সারণী
স্কুল => ঢোকান এমনটা ছাত্র মূল্যবোধ ( 'জন' ); সংযুক্ত 0 1
আসুন ধরে নেওয়া যাক টেবিলে ডেটা toোকাতে অ্যাপ্লিকেশনটি নিম্নলিখিত এসকিউএল ব্যবহার করে:
ঢোকান এমনটা ছাত্র মূল্যবোধ ( 'FOOBAR' );
foobar
শিক্ষার্থীর আসল নামটি প্রতিস্থাপন করুন । একটি সাধারণ sertোকানো ক্রিয়াকলাপটি এর মতো দেখায়:
- ইনপুট: ন্যান্সি
স্কুল => ঢোকান এমনটা ছাত্র মূল্যবোধ ( 'ন্যান্সি' ); সংযুক্ত 0 1
যখন আমরা টেবিলটি জিজ্ঞাসা করি তখন আমরা এটি পাই:
স্কুল => নির্বাচন করুন * শিক্ষার্থী থেকে ;
নাম
-------
জন
ন্যান্সি
( ২ টি সারি )
আমরা যখন টেবিলের মধ্যে লিটল ববি টেবিলের নামটি সন্নিবেশ করি তখন কী ঘটে?
- ইনপুট: রবার্ট '); টেবিল ছাত্রদের ড্রপ; -
স্কুল => ঢোকান এমনটা ছাত্র মূল্যবোধ ( 'রবার্ট' ); টেবিল ছাত্রদের ড্রপ ; - '); সংযোজন 0 1 ড্রপ টেবিল
এখানে এসকিউএল ইঞ্জেকশনটি হল শিক্ষার্থীর নামটি বিবৃতিটি সমাপ্ত করা এবং একটি পৃথক DROP TABLE
কমান্ড সহ ফলাফল ; ইনপুট শেষে দুটি ড্যাশগুলি অন্য কোনও ত্রুটির কারণ হতে পারে এমন কোনও অবশিষ্ট কোডটি মন্তব্য করার উদ্দেশ্যে। আউটপুটটির শেষ লাইনটি নিশ্চিত করে যে ডাটাবেস সার্ভারটি টেবিলটি বাদ দিয়েছে।
এটি লক্ষ্য করা গুরুত্বপূর্ণ যে INSERT
অপারেশন চলাকালীন অ্যাপ্লিকেশনটি কোনও বিশেষ অক্ষরের জন্য ইনপুটটি পরীক্ষা করছে না এবং তাই এসকিউএল কমান্ডের মধ্যে স্বেচ্ছাসেবক ইনপুট প্রবেশের অনুমতি দিচ্ছে। এর অর্থ হ'ল কোনও দূষিত ব্যবহারকারী সাধারণত ব্যবহারকারী ইনপুটটির জন্য নির্দিষ্ট ক্ষেত্রের মধ্যে সন্নিবেশ করতে পারে, ডাটাবেস সিস্টেমটি কার্যকর করার জন্য স্বেচ্ছাসেবী এসকিউএল কোড সহ উদ্ধৃতিগুলির মতো বিশেষ চিহ্নগুলি, তাই এসকিউএল ইঞ্জেকশন দেয় ।
ফলাফল?
স্কুল => নির্বাচন করুন * শিক্ষার্থী থেকে ;
ত্রুটি : সম্পর্ক "ছাত্র" নেই না অস্তিত্ব
লাইন 1 : শিক্ষার্থী থেকে * নির্বাচন করুন ; ^
এসকিউএল ইঞ্জেকশন হ'ল অপারেটিং সিস্টেম বা অ্যাপ্লিকেশনটিতে দূরবর্তী স্বেচ্ছাসেবক কোড প্রয়োগের দুর্বলতার ডাটাবেস সমতুল্য । একটি সফল এসকিউএল ইঞ্জেকশন আক্রমণের সম্ভাব্য প্রভাবটিকে হ্রাস করা যায় না - ডাটাবেস সিস্টেম এবং অ্যাপ্লিকেশন কনফিগারেশনের উপর নির্ভর করে এটি আক্রমণকারী দ্বারা ডেটা ক্ষতির কারণ হতে পারে (যেমন এই ক্ষেত্রে) ডেটাতে অননুমোদিত অ্যাক্সেস অর্জন করতে পারে, এমনকি মৃত্যুদন্ড কার্যকর করতে পারে হোস্ট মেশিনে নিজেই নির্বিচারে কোড।
এক্স কেসিডি কমিকের হিসাবে উল্লেখ করা হয়েছে, এসকিউএল ইনজেকশন আক্রমণ থেকে রক্ষা করার এক উপায় হ'ল ডেটাবেস ইনপুটগুলিকে স্যানিটাইজ করা, যেমন বিশেষ অক্ষরগুলি থেকে বেরিয়ে আসা, যাতে তারা অন্তর্নিহিত এসকিউএল কমান্ডটি সংশোধন করতে না পারে এবং এ কারণে নির্বিচারে এসকিউএল কোড কার্যকর করতে পারে না। আপনি যদি প্যারামিটারাইজড ক্যোয়ারী ব্যবহার করেন, যেমন SqlParameter
ADO.NET ব্যবহার করে , ইনপুটটি কমপক্ষে, এসকিউএল ইঞ্জেকশন থেকে রক্ষা করার জন্য স্বয়ংক্রিয়ভাবে স্যানিটাইজ হবে।
তবে অ্যাপ্লিকেশন স্তরে স্যানিটাইজিং ইনপুটগুলি আরও উন্নত এসকিউএল ইঞ্জেকশন কৌশলগুলি বন্ধ করতে পারে না। উদাহরণস্বরূপ, পিএইচপি ফাংশন অবরুদ্ধ করার উপায় আছেmysql_real_escape_string
। অতিরিক্ত সুরক্ষার জন্য, অনেক ডাটাবেস সিস্টেম প্রস্তুত বিবৃতি সমর্থন করে । যদি ব্যাকএন্ডে সঠিকভাবে প্রয়োগ করা হয় তবে প্রস্তুত বিবৃতিগুলি এসকিউএল ইঞ্জেকশনটিকে ডেটা ইনপুটগুলিকে বাকী কমান্ড থেকে শব্দার্থগতভাবে পৃথক হিসাবে বিবেচনা করে অসম্ভব করে তুলতে পারে।