সঞ্চিত পদ্ধতিগুলি যাদুকরীভাবে এসকিউএল ইঞ্জেকশনটিকে আটকাতে পারে না, তবে তারা এটিকে আরও সহজ করে তোলে। আপনাকে যা করতে হবে তা হ'ল নীচের মতো কিছু (পোস্টগ্রিস উদাহরণ):
CREATE OR REPLACE FUNCTION my_func (
IN in_user_id INT
)
[snip]
SELECT user_id, name, address FROM my_table WHERE user_id = in_user_id; --BAM! SQL INJECTION IMMUNE!!
[snip]
এটাই! স্ট্রিং কনটেনটেশন (অর্থাত্ ডাইনামিক এসকিউএল) এর মাধ্যমে কোয়েরি গঠনের সময় সমস্যাটি কেবল তখনই আসে এবং এমনকি সেই ক্ষেত্রে আপনি বাঁধতে সক্ষম হতে পারেন! (ডাটাবেসের উপর নির্ভর করে))
আপনার গতিশীল ক্যোয়ারিতে কীভাবে এসকিউএল ইঞ্জেকশন এড়ানো যায়:
পদক্ষেপ 1) নিজেকে জিজ্ঞাসা করুন আপনার যদি সত্যিই একটি গতিশীল কোয়েরি প্রয়োজন হয়। আপনি যদি কেবল ইনপুট সেট করতে স্ট্রিংগুলি একসাথে আঁটেন, তবে আপনি সম্ভবত এটি ভুল করছেন। (এই নিয়মের ব্যতিক্রম রয়েছে - একটি ব্যতিক্রম কিছু ডাটাবেসে অনুসন্ধানের রিপোর্ট দেওয়ার জন্য, যদি আপনি প্রতিটি মৃত্যুদন্ড কার্যকর করে একটি নতুন ক্যোয়ারী সংকলন করতে বাধ্য না করেন তবে আপনার পারফরম্যান্সের সমস্যা থাকতে পারে But তবে আপনি এইটিতে ঝাঁপ দেওয়ার আগে এই বিষয়টি নিয়ে গবেষণা করুন। )
পদক্ষেপ 2) আপনার নির্দিষ্ট আরডিবিএমএসের জন্য ভেরিয়েবল সেট করার সঠিক উপায়ে গবেষণা করুন। উদাহরণস্বরূপ ওরাকল আপনাকে নিম্নলিখিতটি করতে দেয় (তাদের ডক্স থেকে উদ্ধৃতি):
sql_stmt := 'UPDATE employees SET salary = salary + :1 WHERE '
|| v_column || ' = :2';
EXECUTE IMMEDIATE sql_stmt USING amount, column_value; --INJECTION IMMUNE!!
এখানে আপনি এখনও ইনপুট কনকনটেটিং করছেন না। আপনি নিরাপদে বাঁধাই করছেন! হুররে!
যদি আপনার ডাটাবেস উপরের মতো কিছু সমর্থন করে না (আশা করি এর মধ্যে কোনওটিই এখনও এই খারাপ নয় তবে আমি অবাক হব না) - বা যদি এখনও আপনার সত্যিকার অর্থে আপনার ইনপুটকে অবশ্যই মনোযোগ দিতে হয় (যেমন "কখনও কখনও" প্রশ্নের প্রতিবেদনের ক্ষেত্রে আমি উপরের দিকে ইঙ্গিত দিয়েছি), তবে আপনাকে অবশ্যই একটি যথাযথ পালানোর ফাংশন ব্যবহার করতে হবে। নিজে লিখবেন না। উদাহরণস্বরূপ পোস্টগ্রিজ কোট_লাইটারাল () ফাংশন সরবরাহ করে। সুতরাং আপনি চালাতে চান:
sql_stmt := 'SELECT salary FROM employees WHERE name = ' || quote_literal(in_name);
এইভাবে যদি ইন_নামটি '[স্নিপ]' বা 1 = 1 '("বা 1 = 1" অংশের মতো কিছু ছদ্মবেশী হয় তবে ব্যবহারকারীকে তার বেতন না দেখার মঞ্জুরি দিয়ে সমস্ত সারি নির্বাচন করুন!), তারপর উদ্ধৃতি_লাইটারাল আপনার বাট সংরক্ষণ করে ফলাফল তৈরি স্ট্রিং তৈরি:
SELECT salary FROM employees WHERE name = '[snip] or 1=1'
কোনও ফলাফল পাওয়া যাবে না (যদি না আপনার সত্যিকারের অদ্ভুত নাম সহ কিছু কর্মচারী থাকে))
এটাই এর টুকরো কথা! এখন আমাকে এসকিউএল ইঞ্জেকশন সম্পর্কিত ওরাকল গুরু টম কিটের একটি ক্লাসিক পোস্টের লিঙ্কটি রেখেই পয়েন্টটি বাড়িটি চালানোর জন্য: লিঙ্কি