অনেক দরকারী উত্তর সম্পর্কে, আমি এই থ্রেড কিছু মান যোগ করতে আশা করি।
এসকিউএল ইঞ্জেকশন হ'ল একটি আক্রমণ যা ব্যবহারকারীর ইনপুট (ইনপুটগুলি যা কোনও ব্যবহারকারী পূরণ করে এবং তারপরে কোয়েরিগুলির অভ্যন্তরে ব্যবহৃত হয়) এর মাধ্যমে করা যেতে পারে। এসকিউএল ইঞ্জেকশন নিদর্শনগুলি সঠিক কোয়েরি সিনট্যাক্স, যখন আমরা এটি বলতে পারি: খারাপ কারণে খারাপ অনুসন্ধানগুলি, এবং আমরা ধরে নিয়েছি যে কোনও খারাপ ব্যক্তি থাকতে পারে যা গোপন তথ্য (অ্যাক্সেস নিয়ন্ত্রণকে বাইপাস করে) সুরক্ষার তিনটি নীতিকে প্রভাবিত করার চেষ্টা করে (গোপনীয়তা) , সততা এবং উপলব্ধতা))
এখন, আমাদের বক্তব্যটি এসকিউএল ইনজেকশন আক্রমণগুলির মতো সুরক্ষা হুমকি প্রতিরোধ করা, প্রশ্ন জিজ্ঞাসা (পিএইচপি ব্যবহার করে কীভাবে এসকিউএল ইনজেকশন আক্রমণ প্রতিরোধ করতে হবে) আরও বাস্তবসম্মত হোন, ডাটা ফিল্টারিং বা সাফাই ইনপুট ডেটা ব্যবহারকারীর অভ্যন্তরে ব্যবহারকারীর ক্ষেত্রে এই জাতীয় ক্যোয়ারী, পিএইচপি বা অন্য কোনও প্রোগ্রামিং ল্যাঙ্গুয়েজ ব্যবহার করা ঘটনা নয়, বা আধুনিক প্রযুক্তি যেমন প্রস্তুত বিবৃতি বা এসকিউএল ইনজেকশন প্রতিরোধকে সমর্থনকারী কোনও অন্যান্য সরঞ্জাম ব্যবহার করার জন্য আরও বেশি লোকের পরামর্শ অনুসারে, এই সরঞ্জামগুলি আর পাওয়া যায় না তা বিবেচনা করুন? আপনি কীভাবে আপনার আবেদনটি সুরক্ষিত করবেন?
এসকিউএল ইনজেকশনের বিরুদ্ধে আমার পদ্ধতির বিষয়টি হল: ডাটাবেসে প্রেরণের আগে ব্যবহারকারী-ইনপুট ডেটা সাফ করা (কোনও প্রশ্নের মধ্যে এটি ব্যবহারের আগে)।
এর জন্য ডেটা ফিল্টারিং (নিরাপদ ডেটাতে অনিরাপদ ডেটা রূপান্তর করা)
বিবেচনা করুন যে PDO এবং MySQLi উপলব্ধ নয়। আপনি কীভাবে আপনার আবেদনটি সুরক্ষিত করতে পারেন? আপনি কি আমাকে এগুলি ব্যবহার করতে বাধ্য করেন? পিএইচপি বাদে অন্য ভাষার কি হবে? আমি সাধারণ ধারণা সরবরাহ করতে পছন্দ করি কারণ এটি কেবল নির্দিষ্ট ভাষার জন্য নয়, বিস্তৃত সীমান্তের জন্য ব্যবহার করা যেতে পারে।
- এসকিউএল ব্যবহারকারী (ব্যবহারকারীর সুবিধাগুলি সীমাবদ্ধ করে): সর্বাধিক সাধারণ এসকিউএল অপারেশনগুলি (নির্বাচন করুন, আপডেট, INSERT) হয়, তবে, কোনও আপডেটের দরকার নেই এমন কোনও ব্যবহারকারীকে আপডেট আপডেট কেন দিন? উদাহরণস্বরূপ, লগইন এবং অনুসন্ধান পৃষ্ঠাগুলি কেবলমাত্র নির্বাচন নির্বাচন করছে, তারপরে, কেন এই পৃষ্ঠাগুলিতে উচ্চতর সুবিধাগুলি সহ ডিবি ব্যবহারকারীদের ব্যবহার করবেন?
বিধি: সমস্ত সুযোগ-সুবিধার জন্য একটি ডাটাবেস ব্যবহারকারী তৈরি করবেন না। সমস্ত এসকিউএল ক্রিয়াকলাপের জন্য, আপনি সহজেই ব্যবহারের জন্য ব্যবহারকারীর নাম হিসাবে আপনার প্রকল্পটি (বিতরণকারী, নির্বাচনকারী, আপডেটকারী) তৈরি করতে পারেন।
ন্যূনতম সুযোগ সুবিধার নীতি দেখুন ।
ডেটা ফিল্টারিং: কোনও ক্যোয়ারী ব্যবহারকারী ইনপুট তৈরি করার আগে, এটি বৈধ ও ফিল্টার করা উচিত। প্রোগ্রামারদের জন্য প্রতিটি ব্যবহারকারীর ইনপুট ভেরিয়েবলের জন্য কিছু বৈশিষ্ট্য নির্ধারণ করা গুরুত্বপূর্ণ:
ডেটা টাইপ, ডেটা প্যাটার্ন এবং ডেটা দৈর্ঘ্য । একটি ক্ষেত্র যা (x এবং y) এর মধ্যে একটি সংখ্যা অবশ্যই সঠিক নিয়মটি ব্যবহার করে অবশ্যই বৈধ হওয়া উচিত, এবং একটি ক্ষেত্রের একটি স্ট্রিং (পাঠ্য): প্যাটার্নটি কেস হ'ল উদাহরণস্বরূপ, ব্যবহারকারীর নামটিতে অবশ্যই কয়েকটি অক্ষর থাকতে হবে, আসুন [a-zA-Z0-9_-।] বলুন। দৈর্ঘ্য (x এবং n) এর মধ্যে পরিবর্তিত হয় যেখানে x এবং n (পূর্ণসংখ্যা, x <= n)।
বিধি: সঠিক ফিল্টার তৈরি করা এবং বৈধতা নিয়ম করা আমার পক্ষে সেরা অনুশীলন।
অন্যান্য সরঞ্জামগুলি ব্যবহার করুন: এখানে, আমি আপনার সাথে একমত হব যে একটি প্রস্তুত বিবৃতি (প্যারাম্যাট্রাইজড ক্যোয়ারী) এবং সঞ্চিত পদ্ধতি অসুবিধাগুলি এখানে এই উপায়গুলির জন্য উন্নত দক্ষতার প্রয়োজন যা বেশিরভাগ ব্যবহারকারীর জন্য বিদ্যমান নয়। এখানে মূল ধারণাটি এসকিউএল কোয়েরি এবং অভ্যন্তরীণ যে ডেটা ব্যবহার করা হয় তার মধ্যে পার্থক্য করা। উভয় পন্থাগুলিও অনিরাপদ ডেটা সহ ব্যবহার করা যেতে পারে, কারণ এখানে ব্যবহারকারী-ইনপুট ডেটা মূল ক্যোয়ারিতে কিছু যোগ করে না, যেমন (যে কোনও বা x = x)।
আরো তথ্যের জন্য, দয়া করে পড়ুন OWASP এসকিউএল ইনজেকশন প্রতিরোধ চিট শিট ।
এখন, আপনি যদি উন্নত ব্যবহারকারী হন তবে আপনার পছন্দ মতো এই প্রতিরক্ষাটি ব্যবহার শুরু করুন, তবে, নতুনদের জন্য যদি তারা দ্রুত কোনও সঞ্চিত পদ্ধতি প্রয়োগ করতে না পারে এবং বিবৃতিটি প্রস্তুত না করতে পারে তবে তারা যতটা পারে ইনপুট ডেটা ফিল্টার করা ভাল।
অবশেষে, বিবেচনা করা যাক যে কোনও ব্যবহারকারী তার / তার ব্যবহারকারীর নাম প্রবেশের পরিবর্তে নীচে এই পাঠ্যটি প্রেরণ করেছেন:
[1] UNION SELECT IF(SUBSTRING(Password,1,1)='2',BENCHMARK(100000,SHA1(1)),0) User,Password FROM mysql.user WHERE User = 'root'
এই ইনপুটটি কোনও প্রস্তুত বিবৃতি এবং সঞ্চিত পদ্ধতি ছাড়াই তাড়াতাড়ি যাচাই করা যেতে পারে, তবে সেগুলি ব্যবহার করে ব্যবহারকারীর ডেটা ফিল্টারিং এবং বৈধতার পরে শুরু হয়।
শেষ পয়েন্টটি অপ্রত্যাশিত আচরণ সনাক্ত করছে যার জন্য আরও প্রচেষ্টা এবং জটিলতা প্রয়োজন; এটি সাধারণ ওয়েব অ্যাপ্লিকেশনগুলির জন্য প্রস্তাবিত নয়।
উপরের ব্যবহারকারী ইনপুটটিতে অপ্রত্যাশিত আচরণ হ'ল নির্বাচন, ইউনিয়ন, আইএফ, সাবস্ট্রাকিং, বেঞ্চমার্ক, এসএএ এবং রুট root এই শব্দগুলি শনাক্ত হয়ে গেলে আপনি ইনপুটটি এড়াতে পারবেন।
আপডেট 1:
একজন ব্যবহারকারী মন্তব্য করেছেন যে এই পোস্টটি অকেজো, ঠিক আছে! OWASP.ORG যা সরবরাহ করেছে তা এখানে :
প্রাথমিক প্রতিরক্ষা:
বিকল্প # 1: প্রস্তুত বিবৃতি ব্যবহার (প্যারামিটারাইজড কোয়েরি)
বিকল্প # 2: সঞ্চিত পদ্ধতি ব্যবহার
বিকল্প # 3: সমস্ত ব্যবহারকারী সরবরাহিত ইনপুটকে
ছাড়িয়ে নেওয়া
অতিরিক্ত প্রতিরক্ষা:
এছাড়াও কার্যকর করুন: স্বল্প
তালিকার প্রাপ্যতা সম্পাদন করুন: সাদা তালিকা ইনপুট বৈধকরণ
আপনি যেমন জানেন যে কোনও নিবন্ধ দাবি করার পক্ষে কমপক্ষে একটি রেফারেন্স দ্বারা একটি বৈধ যুক্তি দ্বারা সমর্থন করা উচিত! অন্যথায়, এটি আক্রমণ এবং একটি খারাপ দাবি হিসাবে বিবেচিত!
আপডেট 2:
পিএইচপি ম্যানুয়াল থেকে, পিএইচপি: প্রস্তুত বিবৃতি - ম্যানুয়াল :
এসকেপিং এবং এসকিউএল ইঞ্জেকশন
বাউন্ডের ভেরিয়েবলগুলি সার্ভার দ্বারা স্বয়ংক্রিয়ভাবে পালানো হবে। সার্ভার কার্যকর স্থগিতের পূর্বে বিবৃতি টেম্পলেটে উপযুক্ত স্থানগুলিতে তাদের পালানো মান সন্নিবেশ করায়। উপযুক্ত রূপান্তর তৈরি করতে বাউন্ড ভেরিয়েবলের ধরণের জন্য সার্ভারকে একটি ইঙ্গিত সরবরাহ করতে হবে। আরও তথ্যের জন্য mysqli_stmt_bind_param () ফাংশনটি দেখুন।
সার্ভারের মধ্যে মানগুলি স্বয়ংক্রিয়ভাবে পালিয়ে যাওয়া কখনও কখনও এসকিউএল ইনজেকশন প্রতিরোধের জন্য সুরক্ষা বৈশিষ্ট্য হিসাবে বিবেচিত হয়। যদি ইনপুট মানগুলি সঠিকভাবে অব্যাহতি দেওয়া হয় তবে প্রস্তুত না হওয়া বিবৃতিগুলির সাথে একই ডিগ্রি সুরক্ষা অর্জন করা যেতে পারে।
আপডেট 3:
আমি প্রস্তুত বিবৃতি ব্যবহার করার সময় পিডিও এবং মাইএসকিউলি কীভাবে মাইএসকিউএল সার্ভারে কোয়েরি প্রেরণ করে তা জানার জন্য পরীক্ষার কেস তৈরি করেছি:
PDO:
$user = "''1''"; // Malicious keyword
$sql = 'SELECT * FROM awa_user WHERE userame =:username';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':username' => $user));
অনুসন্ধান লগ:
189 Query SELECT * FROM awa_user WHERE userame ='\'\'1\'\''
189 Quit
MySQLi:
$stmt = $mysqli->prepare("SELECT * FROM awa_user WHERE username =?")) {
$stmt->bind_param("s", $user);
$user = "''1''";
$stmt->execute();
অনুসন্ধান লগ:
188 Prepare SELECT * FROM awa_user WHERE username =?
188 Execute SELECT * FROM awa_user WHERE username ='\'\'1\'\''
188 Quit
এটি স্পষ্ট যে একটি প্রস্তুত বিবৃতি ডেটা এড়িয়ে চলেছে, অন্য কিছুই নয়।
উপরের বিবৃতিতে যেমন উল্লেখ করা হয়েছে,
সার্ভারের মধ্যে মানগুলি স্বয়ংক্রিয়ভাবে পালিয়ে যাওয়া কখনও কখনও এসকিউএল ইনজেকশন প্রতিরোধের জন্য সুরক্ষা বৈশিষ্ট্য হিসাবে বিবেচিত হয়। ইনপুট মানগুলি সঠিকভাবে এড়িয়ে গেলে, প্রস্তুত না হওয়া বিবৃতিগুলির সাথে একই ডিগ্রি সুরক্ষা অর্জন করা যেতে পারে
সুতরাং, এটি প্রমাণ করে যে ডেটা বৈধকরণ যেমন intval()
কোনও জিজ্ঞাসা প্রেরণের আগে পূর্ণসংখ্যার মানগুলির জন্য একটি ভাল ধারণা। তদ্ব্যতীত, ক্যোয়ারী প্রেরণের আগে দূষিত ব্যবহারকারীর ডেটা প্রতিরোধ করা একটি সঠিক এবং বৈধ পদ্ধতির ।
দয়া করে আরও বিস্তারিত তথ্যের জন্য এই প্রশ্নটি দেখুন: পিডিও মাইএসকিউএলে কাঁচা কোয়েরি প্রেরণ করে যখন মাইস্ক্লি প্রস্তুত কোয়েরি প্রেরণ করে, উভয়ই একই ফলাফল দেয়
তথ্যসূত্র:
- এসকিউএল ইঞ্জেকশন চিট শীট
- এসকিউএল ইনজেকশন
- তথ্য নিরাপত্তা
- সুরক্ষা নীতি
- তথ্য বৈধতা