আমি জানি যে প্রস্তুতিমূলক স্টেটমেন্টগুলি এসকিউএল ইনজেকশন এড়ানো / প্রতিরোধ করে। কীভাবে তা করে? প্রিপেইডস্টেটমেন্টস ব্যবহার করে নির্মিত চূড়ান্ত ফর্ম ক্যোয়ারী কি স্ট্রিং হবে না অন্যথায়?
আমি জানি যে প্রস্তুতিমূলক স্টেটমেন্টগুলি এসকিউএল ইনজেকশন এড়ানো / প্রতিরোধ করে। কীভাবে তা করে? প্রিপেইডস্টেটমেন্টস ব্যবহার করে নির্মিত চূড়ান্ত ফর্ম ক্যোয়ারী কি স্ট্রিং হবে না অন্যথায়?
উত্তর:
এসকিউএল ইঞ্জেকশনটিতে সমস্যাটি হ'ল এসকিউএল স্টেটমেন্টের অংশ হিসাবে কোনও ব্যবহারকারী ইনপুট ব্যবহৃত হয়। প্রস্তুত বিবৃতি ব্যবহার করে আপনি ব্যবহারকারীর ইনপুটটিকে প্যারামিটারের সামগ্রী হিসাবে (এবং এসকিউএল কমান্ডের অংশ হিসাবে নয়) পরিচালনা করতে বাধ্য করতে পারেন।
তবে আপনি যদি নিজের প্রস্তুত বিবৃতিটির জন্য প্যারামিটার হিসাবে ব্যবহারকারীর ইনপুটটি ব্যবহার না করেন তবে তার পরিবর্তে আপনার এসকিউএল কমান্ডটি একসাথে স্ট্রিংগুলিতে যোগ দিয়ে তৈরি করেন, তবে প্রস্তুত স্টেটমেন্টগুলি ব্যবহার করার পরেও আপনি এসকিউএল ইঞ্জেকশনের ঝুঁকিতে রয়েছেন ।
একই জিনিস করার দুটি উপায় বিবেচনা করুন:
PreparedStatement stmt = conn.createStatement("INSERT INTO students VALUES('" + user + "')");
stmt.execute();
অথবা
PreparedStatement stmt = conn.prepareStatement("INSERT INTO student VALUES(?)");
stmt.setString(1, user);
stmt.execute();
যদি "ব্যবহারকারী" ব্যবহারকারীর ইনপুট থেকে আসে এবং ব্যবহারকারী ইনপুট ছিল
Robert'); DROP TABLE students; --
তারপরে প্রথম দৃষ্টিতে আপনাকে পরাজিত করা হবে। দ্বিতীয়টিতে, আপনি নিরাপদ থাকুন এবং লিটল ববি টেবিলগুলি আপনার স্কুলের জন্য নিবন্ধিত হবে।
কীভাবে প্রিপার্ডস্টেটমেন্ট এসকিউএল ইনজেকশন প্রতিরোধ করে তা বুঝতে, আমাদের এসকিউএল কোয়েরি কার্যকর করার ধাপগুলি বুঝতে হবে।
1. সংকলন পর্ব। ২. কার্যনির্বাহী পর্ব
যখনই এসকিউএল সার্ভার ইঞ্জিন কোনও প্রশ্ন পেয়েছে, এটি নীচের পর্যায়গুলি দিয়ে যেতে হবে,
পার্সিং এবং নরমালাইজেশন পর্ব: এই পর্যায়ে বাক্য বাক্য গঠন এবং শব্দার্থবিজ্ঞানের জন্য পরীক্ষা করা হয়। এটি অনুসন্ধানে ব্যবহৃত রেফারেন্স টেবিল এবং কলামগুলি বিদ্যমান কিনা তা পরীক্ষা করে। এটির অন্যান্য অনেক কাজও রয়েছে তবে আসুন আমরা বিশদে যাব না।
সংকলন ফেজ: এই পর্যায়ে কোয়েরিতে ব্যবহৃত কীওয়ার্ডগুলি নির্বাচন করা, যেমন, ইত্যাদি থেকে মেশিনের দ্বারা বোধগম্য ফর্ম্যাটে রূপান্তরিত হয়। এটি এমন এক পর্যায়ে যেখানে ক্যোয়ারির ব্যাখ্যা করা হয় এবং এর সাথে সংশ্লিষ্ট পদক্ষেপ গ্রহণের সিদ্ধান্ত নেওয়া হয়। এটির অন্যান্য অনেক কাজও রয়েছে তবে আসুন আমরা বিশদে যাব না।
ক্যোয়ারী অপটিমাইজেশন প্ল্যান: এই পর্যায়ে কোয়েরি কার্যকর করা যেতে পারে এমন উপায়গুলি অনুসন্ধান করার জন্য সিদ্ধান্ত গাছ তৈরি করা হয়। এটি কোয়েরি কার্যকর করা যেতে পারে এবং কোয়েরি কার্যকর করার প্রতিটি পদ্ধতির সাথে সম্পর্কিত ব্যয়ের পরিমাণ খুঁজে বের করে। এটি একটি ক্যোয়ারি চালানোর জন্য সেরা পরিকল্পনাটি বেছে নেয়।
ক্যাশে: ক্যোয়ারী অপ্টিমাইজেশান পরিকল্পনায় নির্বাচিত সেরা পরিকল্পনাটি ক্যাশে সঞ্চিত রয়েছে, যাতে পরের বার যখন একই প্রশ্ন আসে তখনই এটিকে আবার প্রথম পর্যায় 1, দ্বিতীয় পর্ব এবং 3 পর্যায়ের মধ্য দিয়ে যেতে হবে না। পরবর্তী বারের জিজ্ঞাসাটি এলে এটি সরাসরি ক্যাশে পরীক্ষা করা হবে এবং সম্পাদন করতে সেখান থেকে তুলে নেওয়া হবে।
এক্সিকিউশন ফেজ:
এই পর্যায়ে সরবরাহকৃত ক্যোয়ারী কার্যকর করা হয় এবং ডেটা ব্যবহারকারীর কাছে ResultSet
বস্তু হিসাবে ফিরিয়ে দেওয়া হয় ।
প্রস্তুতিমূলক স্টেটমেন্টগুলি সম্পূর্ণ এসকিউএল কোয়েরি হয় না এবং এতে স্থানধারক (গুলি) থাকে, যা চালানোর সময় প্রকৃত ব্যবহারকারী-সরবরাহিত ডেটা দ্বারা প্রতিস্থাপিত হয়।
যখনই স্থানধারক সমন্বিত কোনও প্রিপার স্ট্যাটমেন্ট এসকিউএল সার্ভার ইঞ্জিনে প্রবেশ করা হয়, এটি নীচে পর্যায়ক্রমে চলে যায়
ব্যবহারকারী আপডেট ব্যবহারকারী নাম =? এবং পাসওয়ার্ড =? আইডি কোথায়?
উপরের ক্যোয়ারী বিশিষ্ট হবে, বিশেষ চিকিত্সা হিসাবে স্থানধারীদের সাথে সংকলিত হবে, অনুকূলিত হবে এবং ক্যাশে হবে। এই পর্যায়ে ক্যোয়ারী ইতিমধ্যে সংকলিত এবং মেশিন বোধগম্য ফর্ম্যাটে রূপান্তরিত হয়েছে। সুতরাং আমরা বলতে পারি যে ক্যাশে সঞ্চিত ক্যোয়ারী প্রাক-সংকলিত এবং কেবল স্থানধারককে ব্যবহারকারী-সরবরাহিত ডেটা দিয়ে প্রতিস্থাপন করা দরকার।
এখন রান-টাইমে যখন ব্যবহারকারী-সরবরাহিত ডেটা আসে, প্রাক-সংকলিত ক্যোয়ারী ক্যাশে থেকে নেওয়া হয় এবং স্থানধারকগুলি ব্যবহারকারী-সরবরাহিত ডেটা দ্বারা প্রতিস্থাপিত হয়।
(মনে রাখবেন, স্থানধারীদের ব্যবহারকারীর ডেটা দিয়ে প্রতিস্থাপনের পরে, চূড়ান্ত ক্যোয়ারী আবার সংকলন / ব্যাখ্যা করা হয় না এবং এসকিউএল সার্ভার ইঞ্জিন ব্যবহারকারীর ডেটাটিকে বিশুদ্ধ ডেটা হিসাবে বিবেচনা করে এবং কোনও এসকিউএল নয় যা আবার বিশ্লেষণ বা সংকলন করা প্রয়োজন; এটি প্রিপারেড স্টেটমেন্টের সৌন্দর্য। )
যদি ক্যোয়ারীটি আবার সংকলনের পর্যায়ে যেতে হয় না, তবে স্থানধারকগুলিতে যে কোনও ডেটা প্রতিস্থাপন করা হয়েছে তা খাঁটি তথ্য হিসাবে বিবেচনা করা হবে এবং এসকিউএল সার্ভার ইঞ্জিনটির কোনও অর্থ নেই এবং এটি সরাসরি ক্যোয়ারিকে কার্যকর করে।
দ্রষ্টব্য: এটি পার্সিং পর্বের পরে সংকলন পর্ব, এটি কোয়েরি কাঠামো বোঝে / ব্যাখ্যা করে এবং এর অর্থপূর্ণ আচরণ দেয়। প্রিপেইডস্টেটমেন্টের ক্ষেত্রে, ক্যোয়ারীটি কেবল একবারই সংকলিত হয় এবং ব্যবহারকারীর ডেটা প্রতিস্থাপন এবং সম্পাদন করতে কেশযুক্ত সংকলিত ক্যোয়ারী সমস্ত সময় নেওয়া হয়।
প্রিপার্ডস্টেটমেন্টের এক সময়ের সংকলন বৈশিষ্ট্যের কারণে এটি এসকিউএল ইঞ্জেকশন আক্রমণ থেকে মুক্ত।
আপনি এখানে উদাহরণ সহ বিশদ ব্যাখ্যা পেতে পারেন: https://javabypatel.blogspot.com/2015/09/how-prepared-statement-in-java-prevents-sql-inication.html
একটি প্রস্তুতিমূলক স্টেটমেন্টে ব্যবহৃত এসকিউএলটি ড্রাইভারের পূর্বনির্ধারিত। সেই দিক থেকে, প্যারামিটারগুলি ড্রাইভারকে আক্ষরিক মান হিসাবে প্রেরণ করা হয় এবং এসকিউএল এর এক্সিকিউটেবল অংশ নয়; এইভাবে কোনও এসকিউএল একটি পরামিতি ব্যবহার করে ইনজেকশন দেওয়া যায় না। প্রস্তুতিমূলক স্টেটমেন্টগুলির আরেকটি উপকারী পার্শ্ব প্রতিক্রিয়া (প্রিম্পম্পিলেশন + কেবলমাত্র পরামিতি প্রেরণ) পারফরম্যান্সের জন্য উন্নতি হয় যখন প্যারামিটারগুলির জন্য বিভিন্ন মান সহ একাধিক বার স্টেটমেন্ট চালানো হয় (ধরে নেওয়া যায় যে ড্রাইভার প্রিপার স্টেটমেন্টগুলি সমর্থন করে) কারণ ড্রাইভারকে এসকিউএল বিশ্লেষণ এবং সংকলন করতে হবে না। পরামিতি পরিবর্তন সময়।
আমার ধারণা এটি একটি স্ট্রিং হবে। তবে ইনপুট প্যারামিটারগুলি ডাটাবেসে প্রেরণ করা হবে এবং একটি সত্যিকারের এসকিউএল বিবৃতি তৈরি করার আগে যথাযথ কাস্ট / রূপান্তরগুলি প্রয়োগ করা হবে।
আপনাকে একটি উদাহরণ দেওয়ার জন্য এটি CAST / রূপান্তরটি কাজ করে কিনা তা চেষ্টা করে দেখতে পারে।
যদি এটি কাজ করে তবে এটি থেকে এটি একটি চূড়ান্ত বিবৃতি তৈরি করতে পারে।
SELECT * From MyTable WHERE param = CAST('10; DROP TABLE Other' AS varchar(30))
একটি এসকিউএল স্টেটমেন্টের সাথে একটি সংখ্যা পরামিতি গ্রহণ করে একটি উদাহরণ চেষ্টা করুন।
এখন, একটি স্ট্রিং ভেরিয়েবল পাস করার চেষ্টা করুন (সংখ্যার বিষয়বস্তু সহ যা সংখ্যার প্যারামিটার হিসাবে গ্রহণযোগ্য)। এটি কোনও ত্রুটি বাড়ায়?
এখন, একটি স্ট্রিং ভেরিয়েবল পাস করার চেষ্টা করুন (এমন সামগ্রী সহ যা সংখ্যার প্যারামিটার হিসাবে গ্রহণযোগ্য নয়)। দেখুন কি হয়?
প্রস্তুত বিবৃতি আরও সুরক্ষিত। এটি একটি প্যারামিটারকে নির্দিষ্ট ধরণের রূপান্তর করবে।
উদাহরণস্বরূপ প্যারামিটারটি একটি স্ট্রিংয়ে stmt.setString(1, user);
রূপান্তর করবে user
।
মনে করুন যে প্যারামিটারে একটি এক্সিকিউটেবল কমান্ডযুক্ত একটি এসকিউএল স্ট্রিং রয়েছে : একটি প্রস্তুত বিবৃতি ব্যবহারের অনুমতি দেয় না।
এটি এতে মেটাচার্যাক্টর (ওরফে অটো রূপান্তর) যুক্ত করে।
এটি আরও সুরক্ষিত করে তোলে।
এসকিউএল ইনজেকশন: যখন ব্যবহারকারীর এমন কিছু ইনপুট করার সুযোগ হয় যা স্কিল স্টেটমেন্টের অংশ হতে পারে
উদাহরণ স্বরূপ:
স্ট্রিং ক্যোয়ারী = "শিক্ষার্থীদের ভ্যালুতে অন্তর্ভুক্ত করুন ('" + ব্যবহারকারী + "')"
যখন ব্যবহারকারী ইনপুট "রবার্ট '); টেবিল ছাত্রদের ড্রপ; - "ইনপুট হিসাবে এটি এসকিউএল ইঞ্জেকশন সৃষ্টি করে
কীভাবে প্রস্তুত বিবৃতি এটি প্রতিরোধ করে?
স্ট্রিং ক্যোয়ারী = "শিক্ষার্থীদের ভ্যালুতে অন্তর্ভুক্ত করুন ('" + ": নাম" + "')"
পরামিতি.এডিডিভ্যালু ("নাম", ব্যবহারকারী);
=> যখন ব্যবহারকারী আবার "রবার্ট ') ইনপুট দেয়; টেবিল ছাত্রদের ড্রপ; - “, ইনপুট স্ট্রিংটি ড্রাইভারের উপর আক্ষরিক মান হিসাবে পূর্বনির্ধারিত এবং আমার ধারণা এটি কাস্ট করা যেতে পারে:
কাস্ট করুন ( 'রবার্ট'); টেবিল ছাত্রদের ড্রপ; - 'এএস ভারচার (৩০ শতাংশ)
সুতরাং শেষে, স্ট্রিংটি আক্ষরিকভাবে টেবিলের নাম হিসাবে inোকানো হবে।
http://blog.linguiming.com/index.php/2018/01/10/why-prepared-statement-avoids-sql-injection/
CAST(‘Robert’);
থেকে CAST(‘Robert’); DROP TABLE students; –‘ AS varchar(30))
বিরতি দেবে, তারপর এটি টেবিল ড্রপ যে যদি ক্ষেত্রে ছিল এগিয়ে যাওয়া যাবে। এটি ইঞ্জেকশনটি বন্ধ করে দেয়, তাই আমি বিশ্বাস করি উদাহরণটি দৃশ্যের ব্যাখ্যা দেওয়ার জন্য যথেষ্ট নয়।
প্রস্তুত বিবৃতি:
1) এসকিউএল স্টেটমেন্টের প্রাক-সংকলন এবং ডিবি-সাইড ক্যাচিং সামগ্রিক দ্রুত কার্যকরকরণ এবং ব্যাচগুলিতে একই এসকিউএল স্টেটমেন্ট পুনরায় ব্যবহার করার ক্ষমতা বাড়ে।
2) এসকিউএল ইঞ্জেকশন আক্রমণগুলি স্বয়ংক্রিয়ভাবে প্রতিরোধের সাথে কোটগুলি এবং অন্যান্য বিশেষ অক্ষরের অন্তর্নির্মিত পলায়ন। নোট করুন যে এর জন্য মান নির্ধারণের জন্য আপনি প্রস্তুতিমূলক সেটেক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স () পদ্ধতিগুলির যে কোনওটি ব্যবহার করুন।
এই পোস্টে ব্যাখ্যা হিসাবে ,PreparedStatement
আপনি এখনও স্ট্রিংকেটটিং করছেন একা আপনাকে সহায়তা করে না।
উদাহরণস্বরূপ, একজন দুর্বৃত্ত হামলাকারী এখনও নিম্নলিখিতটি করতে পারে:
আপনি যদি বাইন্ড প্যারামিটার ব্যবহার না করেন তবে কেবল এসকিউএল নয়, এমনকি জেপিকিউএল বা এইচকিউএলও আপস করা যেতে পারে।
নীচের লাইন, এসকিউএল স্টেটমেন্টগুলি তৈরি করার সময় আপনার কখনই স্ট্রিং সংক্ষেপণ ব্যবহার করা উচিত নয়। সেই উদ্দেশ্যে একটি উত্সর্গীকৃত API ব্যবহার করুন:
প্রস্তুত বিবৃতিগুলিতে ব্যবহারকারীকে পরামিতি হিসাবে ডেটা প্রবেশ করতে বাধ্য করা হয়। যদি ব্যবহারকারীরা ড্রপ টেবিল বা নির্বাচন করুন * যেমন ব্যবহারকারীদের থেকে কিছু দুর্বল বিবৃতি প্রবেশ করে তবে ডেটা প্রভাবিত হবে না কারণ এগুলি এসকিউএল স্টেটমেন্টের পরামিতি হিসাবে বিবেচিত হবে