কীভাবে একটি প্রিপার স্টেটমেন্ট এসকিউএল ইঞ্জেকশনটিকে এড়ানো বা প্রতিরোধ করে?


122

আমি জানি যে প্রস্তুতিমূলক স্টেটমেন্টগুলি এসকিউএল ইনজেকশন এড়ানো / প্রতিরোধ করে। কীভাবে তা করে? প্রিপেইডস্টেটমেন্টস ব্যবহার করে নির্মিত চূড়ান্ত ফর্ম ক্যোয়ারী কি স্ট্রিং হবে না অন্যথায়?


3
প্রযুক্তিগতভাবে জেডিবিসি স্পেক জোর দেয় না যে এসকিউএল ইঞ্জেকশন ত্রুটি নেই। আমি প্রভাবিত এমন কোনও ড্রাইভ সম্পর্কে জানি না।
টম হাটিন -

3
@ জয়েশ আমি উত্তর হিসাবে এখানে আপনার ব্লগ সামগ্রী যুক্ত করার পরামর্শ দিচ্ছি। বেশিরভাগ উত্তর কেবলমাত্র বি / ডাব্লু ডায়নামিক এসকিউএল কোয়েরি জেনারেশন এবং প্রস্তুত স্টেমিটের পার্থক্য জানাচ্ছে। তারা বিষয়টি অ্যাড্রেসিং নেই কেন প্রস্তুত বিবৃতি ভাল যা আপনার ব্লগ আছে কাজ করি।
পবন মঞ্জুনাথ

1
উত্তর হিসাবে যুক্ত, আমি আশা করি এটি সাহায্য করবে।
জয়েশ

উত্তর:


78

এসকিউএল ইঞ্জেকশনটিতে সমস্যাটি হ'ল এসকিউএল স্টেটমেন্টের অংশ হিসাবে কোনও ব্যবহারকারী ইনপুট ব্যবহৃত হয়। প্রস্তুত বিবৃতি ব্যবহার করে আপনি ব্যবহারকারীর ইনপুটটিকে প্যারামিটারের সামগ্রী হিসাবে (এবং এসকিউএল কমান্ডের অংশ হিসাবে নয়) পরিচালনা করতে বাধ্য করতে পারেন।

তবে আপনি যদি নিজের প্রস্তুত বিবৃতিটির জন্য প্যারামিটার হিসাবে ব্যবহারকারীর ইনপুটটি ব্যবহার না করেন তবে তার পরিবর্তে আপনার এসকিউএল কমান্ডটি একসাথে স্ট্রিংগুলিতে যোগ দিয়ে তৈরি করেন, তবে প্রস্তুত স্টেটমেন্টগুলি ব্যবহার করার পরেও আপনি এসকিউএল ইঞ্জেকশনের ঝুঁকিতে রয়েছেন


1
অবশ্যই, তবে আপনি এখনও কিছু বা সমস্ত পরামিতি হার্ডকোড করতে পারেন।
স্পর্শকাতর

16
উদাহরণটি দয়া করে - তবে আপনি যদি আপনার প্রস্তুত বিবৃতিটির জন্য প্যারামিটার হিসাবে ব্যবহারকারীর ইনপুটটি ব্যবহার না করেন তবে তার পরিবর্তে আপনার এসকিউএল কমান্ডটি একসাথে স্ট্রিংগুলিতে যোগ দিয়ে তৈরি করেন, তবে প্রস্তুত স্টেটমেন্টগুলি ব্যবহার করার পরেও আপনি এসকিউএল ইঞ্জেকশনের ঝুঁকিতে রয়েছেন।
ডেভিড ব্লেইন

4
এফডাব্লুআইডাব্লু প্রস্তুত বিবৃতি কোনও জেডিবিসি জিনিস নয় - এগুলি একটি এসকিউএল জিনিস। আপনি এসকিউএল কনসোলের মধ্য থেকে প্রস্তুত বিবৃতি প্রস্তুত এবং কার্যকর করতে পারেন। প্রস্তুতিমূলক স্টেটমেন্ট কেবল তাদের জেডিবিসির মধ্যে থেকেই সমর্থন করে।
বেলডাজ

198

একই জিনিস করার দুটি উপায় বিবেচনা করুন:

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; --

তারপরে প্রথম দৃষ্টিতে আপনাকে পরাজিত করা হবে। দ্বিতীয়টিতে, আপনি নিরাপদ থাকুন এবং লিটল ববি টেবিলগুলি আপনার স্কুলের জন্য নিবন্ধিত হবে।


8
সুতরাং, যদি আমি এটি সঠিকভাবে পেলাম, তবে দ্বিতীয় উদাহরণে যে প্রশ্নটি কার্যকর করা হবে তা হ'ল: শিক্ষার্থীর ভ্যালুতে অন্তর্ভুক্ত করুন ("রবার্ট"); টেবিলের ছাত্ররা ফেলে দিন; - ") - বা কমপক্ষে এরকম কিছু। এটা কি সত্য?
সর্বোচ্চ

18
না, প্রথম নজরে আপনি সেই বিবৃতিটি পেয়ে যাবেন। দ্বিতীয়টিতে এটি "রবার্ট '); ড্রপ টেবিল শিক্ষার্থীদের; -" ব্যবহারকারীর টেবিলে প্রবেশ করানো হবে।
পল টমবলিন

3
আমি যা বোঝাতে চেয়েছিলাম, দ্বিতীয় উদাহরণে ("নিরাপদ" একটি), স্ট্রিং রবার্ট '); টেবিল ছাত্রদের ড্রপ; - ছাত্র টেবিলে মাঠে সংরক্ষণ করা হবে। আমি কি অন্য কিছু লিখেছি? ;)
সর্বাধিক

7
দুঃখিত, নেস্টিংয়ের উদ্ধৃতি এমন কিছু যা আমি এ জাতীয় বিভ্রান্তির কারণে এড়াতে চেষ্টা করি। এজন্য প্যারামিটার সহ আমি রেডিয়ার স্টেটমেন্টগুলি পছন্দ করি।
পল টমলিন

59
লিটল ববি টেবিল এক্সডি দুর্দান্ত রেফারেন্স
অমলগোভিনাস

128

কীভাবে প্রিপার্ডস্টেটমেন্ট এসকিউএল ইনজেকশন প্রতিরোধ করে তা বুঝতে, আমাদের এসকিউএল কোয়েরি কার্যকর করার ধাপগুলি বুঝতে হবে।

1. সংকলন পর্ব। ২. কার্যনির্বাহী পর্ব

যখনই এসকিউএল সার্ভার ইঞ্জিন কোনও প্রশ্ন পেয়েছে, এটি নীচের পর্যায়গুলি দিয়ে যেতে হবে,

কার্য সম্পাদন পর্যায়ের পর্যায়ের

  1. পার্সিং এবং নরমালাইজেশন পর্ব: এই পর্যায়ে বাক্য বাক্য গঠন এবং শব্দার্থবিজ্ঞানের জন্য পরীক্ষা করা হয়। এটি অনুসন্ধানে ব্যবহৃত রেফারেন্স টেবিল এবং কলামগুলি বিদ্যমান কিনা তা পরীক্ষা করে। এটির অন্যান্য অনেক কাজও রয়েছে তবে আসুন আমরা বিশদে যাব না।

  2. সংকলন ফেজ: এই পর্যায়ে কোয়েরিতে ব্যবহৃত কীওয়ার্ডগুলি নির্বাচন করা, যেমন, ইত্যাদি থেকে মেশিনের দ্বারা বোধগম্য ফর্ম্যাটে রূপান্তরিত হয়। এটি এমন এক পর্যায়ে যেখানে ক্যোয়ারির ব্যাখ্যা করা হয় এবং এর সাথে সংশ্লিষ্ট পদক্ষেপ গ্রহণের সিদ্ধান্ত নেওয়া হয়। এটির অন্যান্য অনেক কাজও রয়েছে তবে আসুন আমরা বিশদে যাব না।

  3. ক্যোয়ারী অপটিমাইজেশন প্ল্যান: এই পর্যায়ে কোয়েরি কার্যকর করা যেতে পারে এমন উপায়গুলি অনুসন্ধান করার জন্য সিদ্ধান্ত গাছ তৈরি করা হয়। এটি কোয়েরি কার্যকর করা যেতে পারে এবং কোয়েরি কার্যকর করার প্রতিটি পদ্ধতির সাথে সম্পর্কিত ব্যয়ের পরিমাণ খুঁজে বের করে। এটি একটি ক্যোয়ারি চালানোর জন্য সেরা পরিকল্পনাটি বেছে নেয়।

  4. ক্যাশে: ক্যোয়ারী অপ্টিমাইজেশান পরিকল্পনায় নির্বাচিত সেরা পরিকল্পনাটি ক্যাশে সঞ্চিত রয়েছে, যাতে পরের বার যখন একই প্রশ্ন আসে তখনই এটিকে আবার প্রথম পর্যায় 1, দ্বিতীয় পর্ব এবং 3 পর্যায়ের মধ্য দিয়ে যেতে হবে না। পরবর্তী বারের জিজ্ঞাসাটি এলে এটি সরাসরি ক্যাশে পরীক্ষা করা হবে এবং সম্পাদন করতে সেখান থেকে তুলে নেওয়া হবে।

  5. এক্সিকিউশন ফেজ: এই পর্যায়ে সরবরাহকৃত ক্যোয়ারী কার্যকর করা হয় এবং ডেটা ব্যবহারকারীর কাছে ResultSetবস্তু হিসাবে ফিরিয়ে দেওয়া হয় ।

উপরোক্ত পদক্ষেপগুলিতে প্রস্তুতিমূলক স্টিপমেন্ট API এর আচরণ

  1. প্রস্তুতিমূলক স্টেটমেন্টগুলি সম্পূর্ণ এসকিউএল কোয়েরি হয় না এবং এতে স্থানধারক (গুলি) থাকে, যা চালানোর সময় প্রকৃত ব্যবহারকারী-সরবরাহিত ডেটা দ্বারা প্রতিস্থাপিত হয়।

  2. যখনই স্থানধারক সমন্বিত কোনও প্রিপার স্ট্যাটমেন্ট এসকিউএল সার্ভার ইঞ্জিনে প্রবেশ করা হয়, এটি নীচে পর্যায়ক্রমে চলে যায়

    1. পার্সিং এবং নরমালাইজেশন পর্ব
    2. সংকলন পর্ব
    3. অনুসন্ধান অনুকূলিতকরণ পরিকল্পনা
    4. ক্যাশে (স্থানধারীদের সাথে সঙ্কলিত ক্যোয়ারী ক্যাশে সংরক্ষণ করা হয়))

ব্যবহারকারী আপডেট ব্যবহারকারী নাম =? এবং পাসওয়ার্ড =? আইডি কোথায়?

  1. উপরের ক্যোয়ারী বিশিষ্ট হবে, বিশেষ চিকিত্সা হিসাবে স্থানধারীদের সাথে সংকলিত হবে, অনুকূলিত হবে এবং ক্যাশে হবে। এই পর্যায়ে ক্যোয়ারী ইতিমধ্যে সংকলিত এবং মেশিন বোধগম্য ফর্ম্যাটে রূপান্তরিত হয়েছে। সুতরাং আমরা বলতে পারি যে ক্যাশে সঞ্চিত ক্যোয়ারী প্রাক-সংকলিত এবং কেবল স্থানধারককে ব্যবহারকারী-সরবরাহিত ডেটা দিয়ে প্রতিস্থাপন করা দরকার।

  2. এখন রান-টাইমে যখন ব্যবহারকারী-সরবরাহিত ডেটা আসে, প্রাক-সংকলিত ক্যোয়ারী ক্যাশে থেকে নেওয়া হয় এবং স্থানধারকগুলি ব্যবহারকারী-সরবরাহিত ডেটা দ্বারা প্রতিস্থাপিত হয়।

PrepareStatementWorking

(মনে রাখবেন, স্থানধারীদের ব্যবহারকারীর ডেটা দিয়ে প্রতিস্থাপনের পরে, চূড়ান্ত ক্যোয়ারী আবার সংকলন / ব্যাখ্যা করা হয় না এবং এসকিউএল সার্ভার ইঞ্জিন ব্যবহারকারীর ডেটাটিকে বিশুদ্ধ ডেটা হিসাবে বিবেচনা করে এবং কোনও এসকিউএল নয় যা আবার বিশ্লেষণ বা সংকলন করা প্রয়োজন; এটি প্রিপারেড স্টেটমেন্টের সৌন্দর্য। )

যদি ক্যোয়ারীটি আবার সংকলনের পর্যায়ে যেতে হয় না, তবে স্থানধারকগুলিতে যে কোনও ডেটা প্রতিস্থাপন করা হয়েছে তা খাঁটি তথ্য হিসাবে বিবেচনা করা হবে এবং এসকিউএল সার্ভার ইঞ্জিনটির কোনও অর্থ নেই এবং এটি সরাসরি ক্যোয়ারিকে কার্যকর করে।

দ্রষ্টব্য: এটি পার্সিং পর্বের পরে সংকলন পর্ব, এটি কোয়েরি কাঠামো বোঝে / ব্যাখ্যা করে এবং এর অর্থপূর্ণ আচরণ দেয়। প্রিপেইডস্টেটমেন্টের ক্ষেত্রে, ক্যোয়ারীটি কেবল একবারই সংকলিত হয় এবং ব্যবহারকারীর ডেটা প্রতিস্থাপন এবং সম্পাদন করতে কেশযুক্ত সংকলিত ক্যোয়ারী সমস্ত সময় নেওয়া হয়।

প্রিপার্ডস্টেটমেন্টের এক সময়ের সংকলন বৈশিষ্ট্যের কারণে এটি এসকিউএল ইঞ্জেকশন আক্রমণ থেকে মুক্ত।

আপনি এখানে উদাহরণ সহ বিশদ ব্যাখ্যা পেতে পারেন: https://javabypatel.blogspot.com/2015/09/how-prepared-statement-in-java-prevents-sql-inication.html


3
সুন্দর ব্যাখ্যা
ধীররাজ জোশী

4
আক্ষরিক অর্থে এটি সম্পূর্ণরূপে সম্পূর্ণ উত্তরটি টুকরো টুকরো করে
jouell

এটা অনেক সাহায্যকারী ছিল। বিস্তারিত ব্যাখ্যার জন্য ধন্যবাদ।
অজানা

26

একটি প্রস্তুতিমূলক স্টেটমেন্টে ব্যবহৃত এসকিউএলটি ড্রাইভারের পূর্বনির্ধারিত। সেই দিক থেকে, প্যারামিটারগুলি ড্রাইভারকে আক্ষরিক মান হিসাবে প্রেরণ করা হয় এবং এসকিউএল এর এক্সিকিউটেবল অংশ নয়; এইভাবে কোনও এসকিউএল একটি পরামিতি ব্যবহার করে ইনজেকশন দেওয়া যায় না। প্রস্তুতিমূলক স্টেটমেন্টগুলির আরেকটি উপকারী পার্শ্ব প্রতিক্রিয়া (প্রিম্পম্পিলেশন + কেবলমাত্র পরামিতি প্রেরণ) পারফরম্যান্সের জন্য উন্নতি হয় যখন প্যারামিটারগুলির জন্য বিভিন্ন মান সহ একাধিক বার স্টেটমেন্ট চালানো হয় (ধরে নেওয়া যায় যে ড্রাইভার প্রিপার স্টেটমেন্টগুলি সমর্থন করে) কারণ ড্রাইভারকে এসকিউএল বিশ্লেষণ এবং সংকলন করতে হবে না। পরামিতি পরিবর্তন সময়।


এটির মতো প্রয়োগ করা হবে না এবং আমি বিশ্বাস করি এটি প্রায়শই হয় না।
টম হাটিন -

4
আসলে এসকিউএল সাধারণত ডাটাবেসে প্রাক-কম্পাইল করা হয়। এটি একটি ডাটাবেসে কার্যকর করার পরিকল্পনা প্রস্তুত করা হয়। আপনি যখন ক্যোয়ারি চালাবেন প্ল্যানটি সেই পরামিতিগুলির সাথে কার্যকর করা হবে। অতিরিক্ত সুবিধা হ'ল একই বিবৃতিটি ক্যোয়ারী প্রসেসর ছাড়াই প্রতিটি সময় নতুন পরিকল্পনা সংকলন না করে বিভিন্ন প্যারামিটার দিয়ে কার্যকর করা যেতে পারে।
বেলডাজ

3

আমার ধারণা এটি একটি স্ট্রিং হবে। তবে ইনপুট প্যারামিটারগুলি ডাটাবেসে প্রেরণ করা হবে এবং একটি সত্যিকারের এসকিউএল বিবৃতি তৈরি করার আগে যথাযথ কাস্ট / রূপান্তরগুলি প্রয়োগ করা হবে।

আপনাকে একটি উদাহরণ দেওয়ার জন্য এটি CAST / রূপান্তরটি কাজ করে কিনা তা চেষ্টা করে দেখতে পারে।
যদি এটি কাজ করে তবে এটি থেকে এটি একটি চূড়ান্ত বিবৃতি তৈরি করতে পারে।

   SELECT * From MyTable WHERE param = CAST('10; DROP TABLE Other' AS varchar(30))

একটি এসকিউএল স্টেটমেন্টের সাথে একটি সংখ্যা পরামিতি গ্রহণ করে একটি উদাহরণ চেষ্টা করুন।
এখন, একটি স্ট্রিং ভেরিয়েবল পাস করার চেষ্টা করুন (সংখ্যার বিষয়বস্তু সহ যা সংখ্যার প্যারামিটার হিসাবে গ্রহণযোগ্য)। এটি কোনও ত্রুটি বাড়ায়?

এখন, একটি স্ট্রিং ভেরিয়েবল পাস করার চেষ্টা করুন (এমন সামগ্রী সহ যা সংখ্যার প্যারামিটার হিসাবে গ্রহণযোগ্য নয়)। দেখুন কি হয়?


3

প্রস্তুত বিবৃতি আরও সুরক্ষিত। এটি একটি প্যারামিটারকে নির্দিষ্ট ধরণের রূপান্তর করবে।

উদাহরণস্বরূপ প্যারামিটারটি একটি স্ট্রিংয়ে stmt.setString(1, user);রূপান্তর করবে user

মনে করুন যে প্যারামিটারে একটি এক্সিকিউটেবল কমান্ডযুক্ত একটি এসকিউএল স্ট্রিং রয়েছে : একটি প্রস্তুত বিবৃতি ব্যবহারের অনুমতি দেয় না।

এটি এতে মেটাচার্যাক্টর (ওরফে অটো রূপান্তর) যুক্ত করে।

এটি আরও সুরক্ষিত করে তোলে।


2

এসকিউএল ইনজেকশন: যখন ব্যবহারকারীর এমন কিছু ইনপুট করার সুযোগ হয় যা স্কিল স্টেটমেন্টের অংশ হতে পারে

উদাহরণ স্বরূপ:

স্ট্রিং ক্যোয়ারী = "শিক্ষার্থীদের ভ্যালুতে অন্তর্ভুক্ত করুন ('" + ব্যবহারকারী + "')"

যখন ব্যবহারকারী ইনপুট "রবার্ট '); টেবিল ছাত্রদের ড্রপ; - "ইনপুট হিসাবে এটি এসকিউএল ইঞ্জেকশন সৃষ্টি করে

কীভাবে প্রস্তুত বিবৃতি এটি প্রতিরোধ করে?

স্ট্রিং ক্যোয়ারী = "শিক্ষার্থীদের ভ্যালুতে অন্তর্ভুক্ত করুন ('" + ": নাম" + "')"

পরামিতি.এডিডিভ্যালু ("নাম", ব্যবহারকারী);

=> যখন ব্যবহারকারী আবার "রবার্ট ') ইনপুট দেয়; টেবিল ছাত্রদের ড্রপ; - “, ইনপুট স্ট্রিংটি ড্রাইভারের উপর আক্ষরিক মান হিসাবে পূর্বনির্ধারিত এবং আমার ধারণা এটি কাস্ট করা যেতে পারে:

কাস্ট করুন ( 'রবার্ট'); টেবিল ছাত্রদের ড্রপ; - 'এএস ভারচার (৩০ শতাংশ)

সুতরাং শেষে, স্ট্রিংটি আক্ষরিকভাবে টেবিলের নাম হিসাবে inোকানো হবে।

http://blog.linguiming.com/index.php/2018/01/10/why-prepared-statement-avoids-sql-injection/


1
যদি আমি ভুল না করে থাকি, অংশ CAST(‘Robert’);থেকে CAST(‘Robert’); DROP TABLE students; –‘ AS varchar(30))বিরতি দেবে, তারপর এটি টেবিল ড্রপ যে যদি ক্ষেত্রে ছিল এগিয়ে যাওয়া যাবে। এটি ইঞ্জেকশনটি বন্ধ করে দেয়, তাই আমি বিশ্বাস করি উদাহরণটি দৃশ্যের ব্যাখ্যা দেওয়ার জন্য যথেষ্ট নয়।
হেক্টর আলভারেজ

1

প্রস্তুত বিবৃতি:

1) এসকিউএল স্টেটমেন্টের প্রাক-সংকলন এবং ডিবি-সাইড ক্যাচিং সামগ্রিক দ্রুত কার্যকরকরণ এবং ব্যাচগুলিতে একই এসকিউএল স্টেটমেন্ট পুনরায় ব্যবহার করার ক্ষমতা বাড়ে।

2) এসকিউএল ইঞ্জেকশন আক্রমণগুলি স্বয়ংক্রিয়ভাবে প্রতিরোধের সাথে কোটগুলি এবং অন্যান্য বিশেষ অক্ষরের অন্তর্নির্মিত পলায়ন। নোট করুন যে এর জন্য মান নির্ধারণের জন্য আপনি প্রস্তুতিমূলক সেটেক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স () পদ্ধতিগুলির যে কোনওটি ব্যবহার করুন।


1

এই পোস্টে ব্যাখ্যা হিসাবে ,PreparedStatement আপনি এখনও স্ট্রিংকেটটিং করছেন একা আপনাকে সহায়তা করে না।

উদাহরণস্বরূপ, একজন দুর্বৃত্ত হামলাকারী এখনও নিম্নলিখিতটি করতে পারে:

  • একটি স্লিপ ফাংশন কল করুন যাতে আপনার সমস্ত ডাটাবেস সংযোগ ব্যস্ত থাকে, সুতরাং আপনার অ্যাপ্লিকেশনটি অনুপলব্ধ করে তুলুন
  • ডিবি থেকে সংবেদনশীল ডেটা আহরণ করা হচ্ছে
  • ব্যবহারকারী প্রমাণীকরণ বাইপাস

আপনি যদি বাইন্ড প্যারামিটার ব্যবহার না করেন তবে কেবল এসকিউএল নয়, এমনকি জেপিকিউএল বা এইচকিউএলও আপস করা যেতে পারে।

নীচের লাইন, এসকিউএল স্টেটমেন্টগুলি তৈরি করার সময় আপনার কখনই স্ট্রিং সংক্ষেপণ ব্যবহার করা উচিত নয়। সেই উদ্দেশ্যে একটি উত্সর্গীকৃত API ব্যবহার করুন:


1
প্যারামিটার বাইন্ডিং ব্যবহারের গুরুত্বকে নির্দেশ করার জন্য আপনাকে ধন্যবাদ, শুধুমাত্র প্রস্তুতিমূলক স্টেটমেন্টের চেয়ে। আপনার উত্তরটি অবশ্য বোঝাচ্ছে যে এসকিউএল ইঞ্জেকশন থেকে রক্ষা করার জন্য একটি উত্সর্গীকৃত API ব্যবহার করা প্রয়োজনীয়। যেহেতু এটি নয়, এবং প্যারামিটার বাইন্ডিং সহ প্রিপেইডস্টেটমেন্ট ব্যবহার করাও কাজ করে, আপনি কি সংস্কারের যত্ন নেবেন?
ওয়াইল্ড পটোক

-3

প্রস্তুত বিবৃতিগুলিতে ব্যবহারকারীকে পরামিতি হিসাবে ডেটা প্রবেশ করতে বাধ্য করা হয়। যদি ব্যবহারকারীরা ড্রপ টেবিল বা নির্বাচন করুন * যেমন ব্যবহারকারীদের থেকে কিছু দুর্বল বিবৃতি প্রবেশ করে তবে ডেটা প্রভাবিত হবে না কারণ এগুলি এসকিউএল স্টেটমেন্টের পরামিতি হিসাবে বিবেচিত হবে


কম নির্ভুলতা সহ নির্বাচিত উত্তর হিসাবে একই উত্তর।
জুলিয়েন মেরে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.