SQL injection
- ডাটাবেস এর কুয়েরি করা হয় এমন ইনপুটে এট্যাকার পরিবর্তন করে, ফলে এপ্লিকেশন এর আসল কুয়েরি রান করে না
- এট্যাকার এর মাধম্যে সেনসিটিভ ডাটা(যেমন পাসওয়ার্ড, ক্রেডিড কার্ড ইনফরমেশন..) দেখতে পারে, ডাটা পরিবির্তন করতে বা এমনকি ডিলিট করেও দিতে পারে
কুয়েরি পরিবর্তন করা হয় অতিরিক্ত ডাঁটা বের করে আনার জন্য
সিস্টেম ডাঁটা
- কুয়েরি প্যারামিটার Gifts
- URL https://insecure-website.com/products?category=Gifts
- SELECT * FROM products WHERE category = 'Gifts' AND enabled = 1
এট্যাক ডাঁটা
- URL https://insecure-website.com/products?category=Gifts'--
- কুয়েরি SELECT * FROM products WHERE category = 'Gifts'--' AND enabled = 1
- ডাটাবেসে ডাবল ডেশ কমেন্ট এর কাজ করে, ফলে 'AND enabled = 1' এইটুকু আর কাজ করবে না
এপ্লিকেশন এর লজিকে পরিবর্তন আনার জন্য
সিস্টেম ডাঁটা
- কুয়েরি SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'
এট্যাক ডাঁটা
- username এর জায়গায় 'administrator'--
- কুয়েরি SELECT * FROM users WHERE username = 'administrator'--' AND password = ''
- মানে হচ্ছে এট্যাক এর ফলে সিস্টেম আর পাসওয়ার্ড চেক করবে না
অন্য টেবিলের ডাঁটা নিয়ে আসা
সিস্টেম ডাঁটা
- কুয়েরি প্যারামিটার Gifts
- কুয়েরি SELECT name, description FROM products WHERE category = 'Gifts'
এট্যাক ডাঁটা
- কুয়েরি প্যারামিটার ' UNION SELECT username, password FROM users--
- যার ফলে users টেবিলের সব ডাঁটা চলে আসবে
Detect SQL injection
- ইনপুটে সিঙ্গেল কোট ক্যারেক্টার ' সাবমিট
- ইনপুটে SQL সিন্টেক্সট সাবমিট করা
- ইনপুটে OR 1=1 বা এই ধরণের কিছু সিন্টেক্সট সাবমিট করা
Prevent SQL injection
- Validate input
- Escaping user Input data, so no special character allowed
- Use of Prepared Statements with Parameterized Queries
Example 1: Java
// validated input data
String custname = request.getParameter("customerName");
// Perform input validation to detect attacks
String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";
PreparedStatement pstmt = connection.prepareStatement( query );
pstmt.setString( 1, custname);
ResultSet results = pstmt.executeQuery( );
Example 2: Hibernate
//First is an unsafe HQL Statement
Query unsafeHQLQuery = session.createQuery("from Inventory where productID='"+userSuppliedParameter+"'");
//Here is a safe version of the same query using named parameters
Query safeHQLQuery = session.createQuery("from Inventory where productID=:productid"); safeHQLQuery.setParameter("productid", userSuppliedParameter);