SQL Injection
SQL Injection হলো কোড ইঞ্জেক্ট করার একটি কৌশল যা আপনার ডেটাবেজকে ধ্বংস করে দিতে পারে।
ওয়েবপেজ এর মাধ্যমে ডেটাবেজে খারাপ(malicious ) কোড ইনপুট/জমা করে রাখাই হলো SQL Injection।
ওয়েব সাইট হ্যাকিং কৌশলগুলোর মধ্য SQL Injection অন্যতম।
ওয়েব পেজে SQL এর ব্যবহার
পূর্ববর্তী অধ্যায়গুলোতে আমরা শিখে এসেছি SQL ব্যবহার করে কিভাবে ডেটাবেজের তথ্য আপডেট এবং পুনরূদ্ধার করতে হয়।
ওয়েব পেজে ইউজারদেরকে প্রায়ই তাদের নিজস্ব সার্চ ভ্যালু ব্যবহার করার অনুমতি দেওয়া হয় যা ব্যবহার করে তারা ওয়েব পেজের তথ্য প্রদর্শন করতে পারে।
SQL স্টেটমেন্ট-সমূহ শুধুমাত্র টেক্সট হওয়ায় ইউজার খুব সহজেই ডায়নামিকভাবে SQL কোড গুলোকে পরিবর্তন করে ফেলতে পারেঃ
ওয়েবপেজ থেকে আপনি যখন ইউজারকে তথ্য ইনপুট এর সুযোগ দেন কেবল তখনই SQL Injection ঘটে। যেমন- আপনি ইউজারকে তার নাম/আইডি ইনপুট করতে বললেন, কিন্তু সে নাম/আইডি এর পরিবর্তে ইনপুট হিসাবে নিম্নের ন্যায় SQL কমান্ড ইনপুট দিল এবং যা আপনি আপনার নিজের অজান্তেই আপনার ডেটাবেজে রান করালেন।
solidUserId = getRequestString("User_Id");
solidSQL = "SELECT * FROM Total_Users
WHERE User_Id = " + solidUserId;
উপরের উদাহরণে সিলেক্ট স্ট্রিং এর সাথে solidUserId ভ্যারিয়েবলটি যোগ করে একটি SELECT
স্টেটমেন্ট তৈরি করা হয়েছে যা ইউজার এর নিকট হতে তথ্য ইনপুট নিয়ে ডেটাবেজ থেকে সংশ্লিষ্ট তথ্য নিয়ে আসে।
আবারও SQL Injection
SQL Injection
এমন একটি কৌশল যা ওয়েব পেজের মাধ্যমে ডেটাবেজে খারাপ কোড ইনপুট দিয়ে SQL কমান্ড ইঞ্জেক্ট করতে পারে।
ইঞ্জেক্টকৃত SQL কমান্ড পূর্ববর্তী SQL কমান্ড গুলোকে পরিবর্তন করতে পারে যা ওয়েব এপ্লিকেশনের নিরাপত্তায় বিঘ্ন সৃষ্টি করে।
SQL Injection 1=1 এর উপর ভিত্তি করে সর্বদাই সত্য
উপরের উদাহরণটিতে আরো একবার লক্ষ্য করুন, ঐ কোডের মূল উদ্দেশ্য ছিল ইউজার আইডির মাধ্যমে একটি ইউজারকে সিলেক্ট করার জন্য SQL স্টেটমেন্ট তৈরি করা।
যদি ইউজারকে ভুল ইনপুট প্রদানে বাধা দেওয়া না হয়, তাহলে ইউজার নিম্নের মত কিছু স্মার্ট ইনপুট প্রবেশ করাবেঃ
User_Id:
SELECT * FROM Total_Users WHERE User_Id = 103 or 1=1
উপরের কোড একটি বৈধ SQL স্টেটমেন্ট। যেহেতু WHERE 1 = 1 সর্বদাই সত্য, সুতরাং ইহা ইউজার টেবিল থেকে সকল তথ্য রিটার্ন করবে।
উপরের উদাহরণটি কি আপনার কাছে বিপজ্জনক বলে মনে হচ্ছে?
একবার ভেবে দেখুন যদি এই টেবিলে ইউজার এর নাম এবং পাসওয়ার্ড থাকতো তাহলে কি হত?
নিম্নের SQL স্টেটমেন্টি অনেকটা উপরের স্টেটমেন্ট এর মতইঃ
SELECT User_Id, User_Name, User_Pass
FROM Total_Users WHERE User_Id = 103 or 1=1
এক্ষেত্রে একজন স্মার্ট হ্যাকার ইনপুট ফিল্ডে 103 অথবা 1=1 ইনপুট করে ডেটাবেজ থেকে খুব সহজেই ইউজারের সকল তথ্য অ্যাক্সেস করতে পারবে।
SQL Injection ""="" এর উপর ভিত্তিকরে সর্বদাই সত্য
ইউজার লগ-ইন ভেরিফাই করার জন্য নিম্নে একটি সাধারন এইচটিএমএল ফর্ম এর গঠন দেওয়া হলোঃ
User Name:
Password:
সার্ভার কোড
User_Name = getRequestString("User_Name");
User_Pass = getRequestString("User_Pass");
sql = "SELECT * FROM Total_Users WHERE User_Name ='" + User_Name + "'
AND User_Pass ='" + User_Pass + "'"
এক্ষেত্রে একজন স্মার্ট হ্যাকার ইনপুট ফিল্ডে " " OR " "=" " ইনপুট করে খুব সহজেই ডেটাবেজ থেকে ইউজারের সকল তথ্য অ্যাক্সেস করতে পারে।
সার্ভার কোড নিম্নের মত একটি বৈধ SQL স্টেটমেন্ট তৈরি করবেঃ
ফলাফল
SELECT * FROM Total_Users WHERE User_Name ="" or ""=""
AND User_Pass ="" or ""=""
উপরের স্টেটমেন্টটি একটি বৈধ SQL স্টেটমেন্ট। এটি টেবিল থেকে ইউজারের সকল তথ্য রিটার্ন করবে যেখানে WHERE ""="" সর্বদাই সত্য।
Batched SQL স্টেটমেন্ট এর উপর ভিত্তিকরে SQL Injection
অধিকাংশ ডেটাবেজই ব্যাচ SQL স্টেটমেন্ট সাপোর্ট করে। দুই বা ততোধিক SQL স্টেটমেন্ট এর সমষ্টিই হলো ব্যাচ SQL স্টেটমেন্ট। একটি স্টেটমেন্ট থেকে অন্য একটি স্টেটমেন্টকে আলাদা করতে সেমিকোলন ব্যবহার করা হয়।
উদাহরণ
SELECT * FROM Total_Users;
DROP TABLE Users_Student;
উপরের SQL স্টেটমেন্টটি "Total_Users" টেবিলের সকল তথ্য রিটার্ন করবে এবং "Users_Student" টেবিলটিকে ডিলেট করে দিবে।
ধরুন, নিম্নের ন্যায় আমাদের সার্ভার কোড আছেঃ
সার্ভার কোড
solidUserId = getRequestString("User_Id");
solidSQL = "SELECT * FROM Total_Users WHERE User_Id = " + solidUserId;
এবং একজন ইউজার নিম্নের মত ইনপুট দিলঃ
User id:
তাহলে সার্ভারে নিম্নের মত একটি বৈধ SQL স্টেটমেন্ট তৈরি হবেঃ
ফলাফল
SELECT * FROM Total_Users WHERE UserId = 103;
DROP TABLE Users_Student;
সুরক্ষার জন্য প্যারামিটার ব্যবহার করুন
কোনো কোনো ওয়েব ডেভেলোপার কিছু নির্দিষ্ট শব্দ বা ক্যারেক্টারকে "blacklist" করে রাখে। হ্যাকাররা যেন এই শব্দ বা ক্যারেক্টার গুলো ইনপুট ফিল্ডের সার্স প্যারামিটার হসাবে ব্যবহার করে SQL ইনজেকশন ঘটাতে না পারে।
ইহা খুব একটা কার্যকরী পদ্ধতি নয়। কিছু শব্দ যেমন- delete
অথবা drop
এবং কিছু ক্যারেক্টার যেমন- সেমিকোলন(;) অথবা উদ্ধৃতি চিহ্ন("") সকল SQL ভাষাতেই ব্যবহত হয়। তাই এই শব্দ বা ক্যারেক্টারসমূহ ইনপুটে সম্মতি দেওয়া উচিৎ।
SQL ইনজেকশন আক্রমণকে প্রতিরোধ করার সবচেয়ে কার্যকরী এবং সঠিক পদ্ধতি হলো SQL প্যারামিটার ব্যবহার করা।
SQL প্যারামিটার হলো ভ্যালু যা SQL কুয়েরি সম্পাদনের সময় যুক্ত করা হয়। ইহা SQL এর কন্ট্রোলার হিসাবে কাজ করে।