Header Ads

Sql Injection Basics

Sql Injection Basics 

 

হ্যাকাররা বিভিন্ন পাদ্ধতিতে ওয়েবসাইটকে হ্যাক করে থাকে । আক্রমন করার অনেক ধরনের কারণ থাকতে পারে কিন্তু প্রধানত ডাটা চুরি করার জন্য ৮৫% আক্রমন হয়ে থাকে । এখন প্রশ্ন জাগতে পারে আমার ওয়েব ডাটা অন্যের কাছে এত গুরুত্বপূর্ণ কেন? ধরুন আপনার একটি ব্লগ সাইট রয়েছে, যেখানে কয়েক হাজার ব্লগার তাদের লেখা প্রকাশ করে । কিন্তু কোনো ধরনের টাকা পয়সা লেনদেন করে না । এই ধরনের ওয়েবসাইট মূলত হ্যাক হয়ে থাকে তথ্য চুরি করার জন্য । ইউজার
তথ্য বলতে ই-মেইল, ফোন নাম্বার ইত্যাদি । পরবর্তীতে এই তথ্য হ্যাকাররা ই-মেইল এবং ফোন মার্কেটিং কোম্পানির কাছে বিক্রি করে । বিভিন্ন ধরনের সফটওয়্যার এর সাহায্যে হ্যাকাররা এই ধরনের আক্রমন করে থাকে – যা সয়ংক্রিয় ভাবে আপনার ওয়েবসাইটের দুর্বল দিক খুঁজে ডাটা চুরি করার পদ্ধতি বলে দেয় ।
ডাটা চুরির সবচেয়ে বড় এবং সহজ উপায় SQL Injection । SQL Injection এতটাই ভয়ানক যে এর মাধ্যামে শুধু চুরি করা না , ওয়েবসাইটের সকল তথ্য বদলে দেওয়া সম্ভব।
এখন দেখা যাক SQL Injection কি?
ডাইনামিক ওয়েবসাইটে মূলত দুটি অংশ থাকে । একটি হলো ওয়েব ইন্টারফেস যা আমরা ব্রাউজারে দেখে থাকি আর অপরটি হলো ডাটাবেস যা সকল ধরনের তথ্য জমা রাখে । ওয়েব ইন্টারফেসে যে ধরনের ডাটা দেখানো হয় তা ওয়েব ইন্টারফেস SQL Command আকারে ডাটাবেসে রিকুয়েস্ট পাঠায়।
এখন ধরা যাক আমদের ওয়েবসাইটে একটি লগিন পেজ আছে যা ডাটাবেস হতে ইউজারের একাউন্ট পরীক্ষা করে। Username এবং password ইনপুট করার জন্য সাধারনত আমরা নিচের মত কোড লিখে থাকি
<form method="post" action=" login.asp">
<input name="tfUName" type="text" id="tfUName">
<input name="tfUPass" type="password" id="tfUPass">
</form>

ইউজার এর কাছ হতে উপরের ফরমের মাধ্যমে রিকুয়েস্ট পাবার পর login.asp পেজ নিচের মত একটি SQL command ডাটাবেসে পাঠায়
Select Count(0) as NN from Member where Username=’$username’ and ‘$password’
SQL command এর দুটি ভেরিএবল ($username , $password) এর ডাটা আসে ইউজার ইনপুট হতে । এখন ইউজার যদি Username এ ABCD দেয় এবং Password এ 123456 দেয় তবে command টি দেখতে নিচের মত হবে।
Select Count(0) as NN from Member where Username=’ABCD’ and ‘123456’
এবং ডাটাবেস ওই ইউজারকে যদি না পায় তবে জিরো পাঠায় অন্ন্যথায় জিরো হতে বেশি পাঠায়।
কিন্তু ইউজার যদি Username এ ‘john’ এবং Password এ ‘anything’ OR ‘X’=’X’ পাঠায় তাহলে SQL Command টি হবে নিচের মত
Select Count(0) as NN from Member where Username=’জহ্ন’ and ‘anything’ OR ‘X’=’X’
ঊপরের command টি খেয়াল করলে দেখা যায় – এটি AND এবং OR অপারেশন এর কম্বিনেশন । এটি জিরো রিটারন করবে যদি প্রথম অংশটি (Username=’ABCD’ and ‘anything’ ) অথবা দ্বিতীয় অংশটি (‘X’=’X’) সত্যি হয় । যেহেতু
দ্বিতীয় অংশটি X=X (যা সব সময় সত্যি) এটি সব সময় জিরোর অধিক রিটারন করবে । যার অর্থ দাঁড়ায় Username and Password না মিললেও যেকোনো কেউ লগিন করতে পারবে ।
এটাকেই SQL Injection বলে।
উপরের উদাহরনটি আমরা login পেজ এর ক্ষেত্রে দিলাম , এই ধরনের ক্ষেত্রে কিন্তু অন্য পেজেও হতে পারে । যেমন মেম্বার পেজ এ – ধরুন মেম্বার পেজ আপনাকে শুধু প্রথম ১০ জন মেম্বার অথবা যেসব মেম্বার আপনার বন্ধু তাদেরকে দেখাবে । কিন্তু SQL Injection এর মাধ্যমে সব মেম্বারের তথ্য একই পেজ এ শো করে তাদের ডাটা চুরি করতে পারে অনায়সে।
ই-কমার্স সাইটে এই ধরনের হ্যাক ভয়াভয় পরিনতি আনতে পারে । যেমন হ্যাকাররা অন্যের হয়ে লগিন করে নিজের জন্য কেনাকাটা করতে পারে ।
আশা করছি আপনারা SQL Injection কি এবং এটা কেন ভয়ংকর তা বুঝেছেন, এখন দেখা যাক SQL Injection হতে ওয়েবসাইটকে কিভাবে রক্ষা করা যায় ।
অনেক উপায়ে SQL Injection প্রতিহত করা যায় । একটি উপায় হল ডাটা ভেলিডেটির মাধ্যমে –
যে ধরনের ডাটা ইনপুট দেওয়ার কথা তার পরিবর্তে অন্য ডাটা ইনপুট দেওয়ার কারনেই যেহেতু SQL Injection হয়ে থাকে, তাই ইনপুট ডাটার ধরন পরীক্ষা করে সহজেই SQL Injection রোধ করা সাম্ভব ।
দুটি অক্ষর ‘ এবং ; মুলত অতিরিক্ত command যোগ করার জন্য ব্যবহৃত হয়, তাই input data হতে এই দুটি অক্ষর আছে কিনা চেক করে অথবা থাকলে মুছে আমরা SQL Injection রোধ করতে পারি ।
কিন্তু এমন হতে পারে Search Page এ ইউজার “St Thoma’s Hospital” দিয়ে search করল, যেহেতু আমরা ’ মুছে দিচ্ছি তাই ডাটাবেস কখনও সাঠিক তথ্য দিতে পারবেনা । যে সকল পেজ এ এই ধরনের ইনপুট দেওয়ার প্রয়োজন হতে পারে, সে সকল পেজ এ অন্য পদ্ধতিতে SQL Inject রোধ করা হয় । আর তা হল SQL Command Parameter
ডাইনামিক পেজ এ SQL Search Command সাধারনত নিচের মতো করে লিখা হয়
Select * from Data where title=’query’
এর পরিবর্তে আমরা লিখতে পারি
SELECT * from Data where query =@query

Dim selectString As String = "SELECT * from Data where query =@query"
Dim cmd As SqlCommand = New SqlCommand(selectString, cn)
cmd.Parameters.Add("query", SqlDbType.Varchar, 100, "query")
cmd.Parameters("query").Value = "St Thoma’s Hospital"
এই @query হলো command parameter যেখানে ডাটাটাইপ উল্লেখ করে দিতে হয় । Input data এর ডাটাটাইপ যদি command parameter এর ডাটাটাইপের সাথে না মিলে তবে SQL তা Execute করবে না ।
আমরা যদি @query= St Thoma’s Hospital পাঠাই, ডাটাবেস সম্পূর্ণ ইনপুট টিকে একটি string হিসেবে নিবে এবং ‘ আলাদা কোন command character হিসাবে নিবে না।
আমি আশা করছি SQL Injection আপনাদের কাছে পরিষ্কার হয়েছে

No comments:

Powered by Blogger.