
Software Development
আজ আমরা WEB এর সবথেকে বড় এবং প্রচলিত দুটি সিকিউরিটি দুর্বলতা নিয়ে আলোচনা করবো। আপনারা যারা ইতিমধ্যেই PHP ডেভেলপার বা PHP নিয়ে কাজ করেন তারা অবশ্যই এই দুটি বিষয় সম্পর্কে অবগত। অথবা যারা নতুন PHP শুরু করেছেন তাদেরও এই দুটি সিকিউরিটি দুর্বলতা সম্পর্কে জানা উচিত।
আমরা এখানে SQL ইনজেকশন (SQL Injection) এবং ক্রস সাইট স্ক্রিপ্টিং (Cross Site Scriptig) সম্পর্কে জানব এবং এটা কিভাবে মেইনটেইন করা বা আটকানো যায় সে সম্পর্কে বিস্তারিত আলোচনা করবো।
তাহলে আর কথা বাড়িয়ে লাভ নেই😊 চলেন শুরু করা যাক।
* SQL ইনজেকশন কি ?
ইনজেকশন মানে তো সবাই বুঝি কোনো কিছু ইঞ্জেক্ট করা তাহলে SQL ইনজেকশন হলো SQL এ ইঞ্জেক্ট করা।
SQL ইনজেকশন হচ্ছে এক ধরণের হ্যাকিং মেথড/পদ্ধতি যা কোন ওয়েবসাইটের ইউজার ইনপুট সিস্টেমকে ব্যবহার করে SQL কোডে কোনো কিছু পরিবর্তন করাতে পারে। যেমন মনে করেন আপনি আপনার User লগইন সিস্টেম এর জন্য একটা SQL কুয়েরি লিখলেন কিন্তু User বা অন্য কেউ কোনো আলাদা ইনপুট দিয়ে আপনার ডাটাবেস সকল ডাটা পেয়ে গেলো। তাহলে তো বুঝতেই পারছেন এটা কত বড় একটা সিকিউরিটি দুর্বলতা।
আসুন একটা উদাহরণ এর মাধ্যমে বিষয়টা পরিষ্কার করে নি।
মনে করুন এইটা আপনার User এর জন্য লগইন ফর্ম এর কোড।
Image for post
Login Form Code
আর এটা হলো User এর ডাটা দেখানোর জন্য SQL কুয়েরি।
Image for post
Query for get User Data
এখন যদি ইউসার তার ইমেইল এবং পাসওয়ার্ড দেয় তাহলে সে তার ইনফরমেশন পাবে। কিন্তু এখানে সমস্যা হলো User যদি এমন কোনো ইনপুট দেয় যেটাতে আমাদের কুয়েরি অন্য ভাবে ব্যবহার করে। যেমন সে তার পাসওয়ার্ড এর পরিবর্তে অন্য কিছু দিলো যেটা তার পাসওয়ার্ড না কিন্তু এমন একটা স্ট্রিং পাস করলো যেটাতে সে তার ইনফরমেশন পেয়ে গেলো। কি অন্যরকম মনে হচ্ছে যে পাসওয়ার্ড ছাড়াই ডাটা পেয়ে যাচ্ছে 😱 আচ্ছা চলেন একটা উদাহরণ দিয়ে ভালো করে বুঝে নি কিভাবে পাসওয়ার্ড ছাড়াও User ডাটা পেয়ে গেলো 🙄
মনে করেন User ‘or ‘1’=’1’ পাসওয়ার্ড হিসেবে এই স্ট্রিং টা দিলো তাহলে কি হবে আমরা কুয়েরি টা দেখি
SELECT * FROM users WHERE email=’nayeem@mail.com’ AND password=’’ or ‘1’ = ‘1’;
এখানে 1=1 সব সময় true রিটার্ন করবে মানে তার পাসওয়ার্ড না দিলেও true রিটার্ন করলে কুয়েরি এর ডাটা পেয়ে যাচ্ছে।
এটা তো গেলো ছোট একটা উদাহরণ। আচ্ছা এমন কি হতে পারে যে User আমার পুরো ডাটাবেস এর তথ্য ই ডিলিট করে দিবে 🤔🤔 চলেন তো দেখি পারে কি না।
এখন যদি পাসওয়ার্ড হিসেবে এই ‘; DROP TABLE users; স্ট্রিং টা দেয় তাহলে কি হবে? এটা আপনি ই কুয়েরি হিসাব করে দেখতে পারেন এই স্ট্রিং দিলে আমাদের users টেবিল টা ডিলিট হয়ে যাবে 😢 । আশা করি বুঝতে পেরেছেন।
SQL ইনজেকশন ঠেকানোর উপায়
আসেন এবার দেখি কিভাবে আমরা এগুলো আটকাতে পারি। এই SQL ইনজেকশন আটকানোর অনেকগুলো উপায় আছে আমরা এখানে কয়েকটা আলোচনা করবো।
PHP এর Prepared স্টেটমেন্ট ব্যবহার করে
Prepared স্টেটমেন্ট এর কাজ হলো এটা ভ্যারিয়েবল গুলো সেভ না করে কুয়েরি এক্সেকিউট করে।
নিচের ছবিটি লক্ষ্য করি।
Image for post
Prepared Statement
এখানে লক্ষ্য করলে বুঝা যাচ্ছে যে প্রথমে কুয়েরি prepare হচ্ছে তারপর ইমেইল এবং পাসওয়ার্ড বাইন্ড হচ্ছে তারপরে কুয়েরি এক্সেকিউট হচ্ছে । Prepare স্টেটমেন্ট এ প্রথমে কুয়েরি prepare করার জন্য ‘?’ চিহ্ন ব্যবহার করা হয় তারপর bind এর মাধ্যমে ওই ‘?’ এর জায়গায় নির্দ্ধিষ্ট ভ্যারিয়েবল বসানো হয় তারপর কুয়েরি এক্সেকিউট করা হয়।
কুয়েরি Bind করার সময় যে ৩ টা প্যারামিটার দেওয়া হয়েছে সেগুলো হচ্ছে প্রথম টা ‘ss’ হলো ডাটা টাইপ প্রথম ‘s’ String যেটা ইমেইল এর জন্য এবং পরের টা পাসওয়ার্ড এর জন্য।
এর মাধ্যমে SQL ইনজেকশন আটকানো যায়।
PHP str_replace() ব্যবহার করে
আচ্ছা আমরা যদি এমন কোনো কাজ করতে পারি যে — যদি User যে ইনপুট দেবে তার থেকে Qoutation (“) বাদ দিতে পারি তাহলে তো আর সে আমার কুয়েরি কে পরিবর্তন করতে পারবে না। এটা করা যায় str_replace() এর মাধ্যমে । str_replace() এর কাজ হলো কোনো স্ট্রিং থেকে কিছু খুঁজে বের করে সেটা রিপ্লেস করা । str_replace() এ ৩ টা এরে প্যারামিটার পাস করতে হয় প্রথম টা হলো কি খুঁজে বের করতে হবে(Search) তারপর এর টা হলো যেটা খুঁজে বের করা হলো সেটার পরিবর্তে কি বসবে(Replace) এবং শেষের টা হলো কোথা থেকে খুঁজে বের করবে(String)।
নিচের ছবিতে উদাহরণ দেওয়া হলো:-
Image for post
Note: এই পদ্ধতি টার কিছু সমস্যা আছে তাই এইটার পরিবর্তে আমরা mysql_real_escape_string() অথবা PDO ব্যবহার করতে পারি।
আশা করি আমরা সবাই SQL ইনজেকশন সম্পর্কে বুঝতে পেরেছি এবং এটা থেকে কিভাবে বাঁচতে পারি বা এটা হ্যান্ডেল করতে পারি সেটা বুঝতে পেরেছি । এখন আমরা ক্রস সাইট স্ক্রিপ্টিং(Cross Site Scripting - XSS) সম্পর্কে আলোচনা করবো।
* ক্রস সাইট স্ক্রিপ্টিং কি ?
Cross Site Scripting (ক্রস সাইট স্ক্রিপ্টিং) হলো ওয়েব এপ্লিকেশন হ্যাকিং এর অন্যতম একটি জনপ্রিয় পদ্ধতি। এটাকে XSS ও বলা হয়। এই পদ্ধতিতে হ্যাকার বিভিন্ন ভাবে কোনো স্ক্রিপ্ট সাইট এ পুশ করে থাকে এবং যখন অন্য কেউ সেই সাইট ব্রাউস কর তখন সেই স্ক্রিপ্ট রান হয় বা সেই স্ক্রিপ্ট কাজ করে। সংজ্ঞা থেকে উদাহরণই ভালো বুঝা যায় তাই কথা না বাড়িয়ে চলেন একটা উদাহরণ দেখা যাক।
মনে করেন আপনি একটা ব্লগ সাইট তৈরী করেছেন PHP দিয়ে এবং সেখানে কমেন্ট করার অপশন ও আছে এবং সাধারণ ভাবেই সেই কমেন্ট আপনি ওই ব্লগ এ দেখাচ্ছেন অর্থাৎ কেউ যদি Good Post লিখে কমেন্ট করে তাহলে প্যারাগ্রাফ ট্যাগ এর ভিতর Good Post ই দেখাবে তাহলে হিসাব করেন কেউ যদি <script>alert(‘You are Hacked’)</script> এইটা কমেন্ট করে তাহলে কি হবে? <p><script>alert(‘You are Hacked’)</script></p> এইভাবে আসবে এবং স্ক্রিপ্ট এ লেখা এলার্ট এর কারণে একটা এলার্ট মেসেজ দেখাবে এবং এইটা কিন্তু এই ব্লগ এ থাকবে যতক্ষণ না আপনি এইটা ডিলিট করবেন। তাহলে যখন ই অন্য কেউ এই ব্লগ টা পড়তে ওই পেজ এ আসবে তখন এ এই স্ক্রিপ্ট টা রান করবে এবং ‘You are Hacked’ এলার্ট মেসেজ টা দেখাবে।
এটা একটা ছোট উদাহরণ এইরকম আরো অনেক পদ্ধতি আসে সাইট এ স্ক্রিপ্ট পুশ করার।
Image for post
Push Script in Comment
XSS দিয়ে কি কি ধরণের কাজ করা যায়:
জাভাস্ক্রিপ্ট ব্যাবহার করে সব ধরনের ক্ষতিকর কাজ করানো যায়।
সাইট মোডিফাই করে সাইটের ডিজাইন ও কাজের ধরন বদলে দেওয়া যায়।
ইউজারের কুকিজ চুরি করে সেই ইউজার হিসেবে ওয়েবসাইট ব্যাবহার করা যায়।
আপনি কোন ইউজার কে XSS এর মাধ্যমে অন্য কোন ওয়েবসাইটে, ম্যালওয়্যার অথবা অন্য যেকোন কিছুর ডাউনলোড লিংকে পাঠিয়ে দিতে পারবেন।
আসুন এবার এটার সমাধান কি সেটা জানা যাক।
ক্রস সাইট স্ক্রিপ্টিং XSS এর সমাধানের উপায়
ইনপুট ভ্যালিডেশন এর মাধ্যমে
ইনপুট ভ্যালিডেশন বলতে যখন আমরা কিছু ইনপুট নেয় তখন প্রথম এ সেটা যাচাই করে নেব যে আমরা যে ধরণের ইনপুট চাচ্ছি সেটাই দিচ্ছে কি না। যেমন উদাহরণ হিসাবে একটা নাম এর কথা হিসাব করতে পারি। আমাদের নাম এ শুধু character ডাটা থাকবে কোনো স্পেশাল ইনপুট যেমন ‘-’ থাকবে না তাহলে এটার ভ্যালিডেশন আমরা এভাবে করতে পারি
Image for post
ডাটা Sanitization এর মাধ্যমে
আচ্ছা মনে করেন ডাটা ভ্যালিডেশন কোনো ভাবে কাজ করলো না। তাহলে যদি ইউসার স্ক্রিপ্ট পুশ করে তাহলে সেই স্ক্রিপ্ট এ দেখাবে এখন আমরা আর একটা কাজ করতে পারি যখন আমরা ডাটাটা দেখাবো তখন ডাটাকে Sanitize বা পরিষ্কার করে দেখাবো এটাই হলো ডাটা Sanitization। যেমন আমরা আমাদের ব্লগ কমেন্ট এ যে কমেন্ট টা দেখাচ্ছিলাম সেটা যদি এমন ভাবে দেখতে পারি যে কোনো HTML বা Script থাকবে না তাহলেই তো আমাদের কাজ হয়ে যায়। এটা করার জন্য আমরা PHP এর strip_tags() ব্যবহার করতে পারি চলুন দেখা যাক।
Image for post
এখানে প্রথমে আমরা কমেন্ট তাকে strip_tags() করছি তারপর সেটাকে echo করেছি তাহলে এখানে যদি কমেন্ট এ কোনো স্ক্রিপ্ট থাকতো তাহলে সেগুলো বাদ হয়ে যেত। যদিও এটা এক লাইন এই করা যেত এভাবে😄