কেন আমরা সবসময় এসকিউএল স্টেটমেন্টগুলিতে প্যারামিটার ব্যবহার পছন্দ করি?


114

আমি ডাটাবেস নিয়ে কাজ করতে খুব নতুন। এখন আমি লিখতে পারি SELECT, UPDATE, DELETE, এবং INSERTকমান্ড। তবে আমি অনেক ফোরাম দেখেছি যেখানে আমরা লিখতে পছন্দ করি:

SELECT empSalary from employee where salary = @salary

...পরিবর্তে:

SELECT empSalary from employee where salary = txtSalary.Text

কেন আমরা সর্বদা পরামিতিগুলি ব্যবহার করতে পছন্দ করি এবং আমি কীভাবে সেগুলি ব্যবহার করব?

আমি প্রথম পদ্ধতির ব্যবহার এবং সুবিধাগুলি জানতে চেয়েছিলাম। এমনকি এসকিউএল ইঞ্জেকশনটি শুনেছি তবে আমি এটি পুরোপুরি বুঝতে পারি না। এসকিউএল ইঞ্জেকশনটি আমার প্রশ্নের সাথে সম্পর্কিত কিনা তাও আমি জানি না।


2
আপনি ঠিক বলেছেন, এটি এসকিউএল ইঞ্জেকশনের সাথে সম্পর্কিত। প্যারামিটারগুলি কীভাবে মোকাবেলা করা যায় তা আপনার প্রোগ্রামটি যে ভাষা / কাঠামোর সাথে চলছে তা দায়বদ্ধ এবং ভাষা নির্ভর হতে পারে। আপনার আরডিবিএমএস (সহায়ক) এবং ওআরএম ফ্রেমওয়ার্ক (প্রয়োজনীয়) উভয়ই পোস্ট করুন।
ক্লকওয়ার্ক-মিউজিক

1
আমি প্রোগ্রামিং ল্যাঙ্গুয়েজ হিসাবে সি # এবং এসকিএল সার্ভার 2008 ব্যবহার করি ডেটাবেস হিসাবে। আমি মাইক্রোসফ্ট ডটনেট ফ্রেমওয়ার্ক ৪.০ ব্যবহার করছি। আমি সত্যিই দুঃখিত, আপনি কী জিজ্ঞাসা করছেন তা সম্পর্কে আমি নিশ্চিত নই (আরডিবিএমএস বা ওআরএম), সম্ভবত আপনি এখন আমার আরডিবিএমএস এবং ওআরএম কাঠামো সংস্করণগুলি আমাকে দিতে পারেন :-)। অনেক অনেক ধন্যবাদ
স্যান্ডি

1
আরডিবিএমএস আপনার ডাটাবেস, আপনার ক্ষেত্রে এসকিউএল সার্ভার ২০০ Server Your অন্যদের মধ্যে লিনকিউ এসকিউএল এবং সত্তা ফ্রেমওয়ার্ক অন্তর্ভুক্ত রয়েছে । আসলে, আপনি একবার ADO.NET এবং এসকিউএল এর বেসিক বিষয়গুলি শিখলে, আমি লিনকুই বা ইএফ এর মতো একটি ওআরএম ব্যবহার করার পরামর্শ দিচ্ছি যেহেতু আপনি নিজেই এসকিউএল লেখার মাধ্যমে যে সমস্ত সমস্যার মুখোমুখি হতে পারেন সেগুলির যত্ন নেন।
চাদ লেভি

উত্তর:


129

ডেস্কটপ প্রোগ্রাম বা ওয়েব সাইটের মতো কোনও প্রোগ্রাম ইন্টারফেসের সাথে ডেটাবেস ব্যবহার করা হলে প্যারামিটারগুলি ব্যবহার করে এসকিউএল ইনজেকশন আক্রমণগুলিকে রোধ করতে সহায়তা করে ।

আপনার উদাহরণে, কোনও ব্যবহারকারী সরাসরি বিবরণী তৈরি করে আপনার ডাটাবেজে এসকিউএল কোড চালাতে পারে txtSalary

উদাহরণস্বরূপ, তারা লিখতে থাকলে 0 OR 1=1, কার্যকর করা এসকিউএল হবে

 SELECT empSalary from employee where salary = 0 or 1=1

এর মাধ্যমে সমস্ত এমপ্লেসগুলি ফেরত দেওয়া হবে।

তদ্ব্যতীত, কোনও ব্যবহারকারী আপনার ডাটাবেসের বিরুদ্ধে এটি মুছে ফেলা সহ আরও খারাপ কমান্ড সম্পাদন করতে পারে যদি তারা লিখে থাকে 0; Drop Table employee:

SELECT empSalary from employee where salary = 0; Drop Table employee

টেবিলটি employeeতখন মুছে ফেলা হবে।


আপনার ক্ষেত্রে, দেখে মনে হচ্ছে আপনি নেট ব্যবহার করছেন। পরামিতি ব্যবহার করা যেমন সহজ:

সি শার্প

string sql = "SELECT empSalary from employee where salary = @salary";

using (SqlConnection connection = new SqlConnection(/* connection info */))
using (SqlCommand command = new SqlCommand(sql, connection))
{
    var salaryParam = new SqlParameter("salary", SqlDbType.Money);
    salaryParam.Value = txtMoney.Text;

    command.Parameters.Add(salaryParam);
    var results = command.ExecuteReader();
}

VB.NET

Dim sql As String = "SELECT empSalary from employee where salary = @salary"
Using connection As New SqlConnection("connectionString")
    Using command As New SqlCommand(sql, connection)
        Dim salaryParam = New SqlParameter("salary", SqlDbType.Money)
        salaryParam.Value = txtMoney.Text

        command.Parameters.Add(salaryParam)

        Dim results = command.ExecuteReader()
    End Using
End Using

2016-4-25 সম্পাদনা করুন:

জর্জ স্টকারের মন্তব্য অনুসারে, আমি নমুনা কোডটি ব্যবহার না করে পরিবর্তন করেছি AddWithValue। এছাড়াও, সাধারণত IDisposableআপনি usingবিবৃতিতে রেকর্ড করার পরামর্শ দেওয়া হয় ।


দুর্দান্ত সমাধান তবে আপনি কীভাবে এবং কীভাবে প্যারামিটারগুলি ব্যবহার করা নিরাপদ তা আরও কিছুটা ব্যাখ্যা করতে পারেন। আমি বোঝাতে চাইছি এটি এখনও বোধহয় sql কমান্ডটি একই রকম হবে
Sandy

আমরা কি এসকিএল কমান্ডে একাধিক পরামিতি যুক্ত করতে পারি? যেমন আমাদের কোনও ইনসার্ট কমান্ডের প্রয়োজন হতে পারে?
স্যান্ডি

2
এসকিউএল সার্ভার প্যারামিটারের ভিতরে থাকা পাঠ্যকে কেবল ইনপুট হিসাবে বিবেচনা করে এবং কখনই এটি কার্যকর করে না।
চাদ লেভি

3
হ্যাঁ, আপনি একাধিক পরামিতি যোগ করতে পারেন: Insert Into table (Col1, Col2) Values (@Col1, @Col2)। আপনার কোডে আপনি একাধিক AddWithValueগুলি যুক্ত করবেন।
চাদ লেভি

1
দয়া করে অ্যাডউইথওয়ালু ব্যবহার করবেন না! এটি অন্তর্নিহিত রূপান্তর সমস্যার কারণ হতে পারে। সর্বদা আকার সুস্পষ্টভাবে সেট করুন এবং এর সাথে প্যারামিটার মান যুক্ত করুন parameter.Value = someValue
জর্জ স্টকার

75

আপনি ঠিক বলেছেন, এটি এসকিউএল ইনজেকশনের সাথে সম্পর্কিত , এটি একটি দুর্বলতা যা কোনও ম্যালিসিওয়াস ব্যবহারকারীকে আপনার ডাটাবেসের বিরুদ্ধে স্বেচ্ছাসেবী বিবৃতি কার্যকর করতে দেয়। এই পুরানো সময়ের প্রিয় এক্সকেসিডি কমিক ধারণাটি চিত্রিত করে:

তার মেয়ের নাম দেওয়া হয়েছে হেল্প আমি ড্রাইভার লাইসেন্স কারখানায় আটকা পড়েছি।


আপনার উদাহরণে, যদি আপনি কেবল ব্যবহার করেন:

var query = "SELECT empSalary from employee where salary = " + txtSalary.Text;
// and proceed to execute this query

আপনি এসকিউএল ইঞ্জেকশনের জন্য উন্মুক্ত। উদাহরণস্বরূপ, বলুন যে কেউ txtSalary তে প্রবেশ করেছে:

1; UPDATE employee SET salary = 9999999 WHERE empID = 10; --
1; DROP TABLE employee; --
// etc.

আপনি যখন এই কোয়েরিটি কার্যকর করেন, এটি একটি SELECTএবং একটি UPDATEবা DROP, বা যা তারা চাইবে তা সম্পাদন করবে । --শেষে কেবল আপনার প্রশ্নের বাকি, যা হামলায় দরকারী হবে যদি আপনি পরে কিছু concatenating হয় আউট মন্তব্য txtSalary.Text


সঠিক উপায় হ'ল প্যারামিটারাইজড কোয়েরি ব্যবহার করা, যেমন (সি #):

SqlCommand query =  new SqlCommand("SELECT empSalary FROM employee 
                                    WHERE salary = @sal;");
query.Parameters.AddWithValue("@sal", txtSalary.Text);

এটির সাথে, আপনি নিরাপদে কোয়েরিটি কার্যকর করতে পারেন।

কিভাবে বিভিন্ন অন্যান্য ভাষায় এসকিউএল ইনজেকশন এড়াতে, চেক উপর অবগতির জন্য bobby-tables.com , একটি ওয়েবসাইট একটি দ্বারা পরিচালিত তাই ব্যবহারকারী


1
দুর্দান্ত সমাধান তবে আপনি কীভাবে এবং কীভাবে প্যারামিটারগুলি ব্যবহার করা নিরাপদ তা আরও কিছুটা ব্যাখ্যা করতে পারেন। আমি বোঝাতে চাইছি এটি এখনও বোধ হয় sql কমান্ডটি একই হবে।
স্যান্ডি

1
@ user815600: একটি সাধারণ ভুল ধারণা - আপনি এখনও বিশ্বাস করেন যে পরামিতি সঙ্গে ক্যোয়ারী মান গ্রহণ করা এবং হবে প্রতিস্থাপন প্রকৃত মানের জন্য পরামিতি - ডান? না এটা হচ্ছে না! - পরিবর্তে, পরামিতি সঙ্গে SQL বক্তব্য SQL সার্ভার প্রেরণ করা হবে, এবং তাদের মান পরামিতি একটি তালিকা সহ - SQL বক্তব্য হয় না হতে একই যাচ্ছে
marc_s

1
এর অর্থ স্ক্যালি সার্ভারের অভ্যন্তরীণ প্রক্রিয়া বা সুরক্ষা দ্বারা স্কুয়েল ইঞ্জেকশনটি পর্যবেক্ষণ করা হচ্ছে। ধন্যবাদ।
স্যান্ডি

4
আমি কার্টুনকে অনেকটা পছন্দ করি, আপনি যদি টেবিলগুলি ফেলে দেওয়ার পর্যাপ্ত অধিকার নিয়ে আপনার কোডটি চালাচ্ছেন তবে আপনার সম্ভবত আরও বিস্তৃত সমস্যা রয়েছে।
ফিলিপ করুন

9

অন্যান্য উত্তরের পাশাপাশি যুক্ত করা দরকার যে প্যারামিটারগুলি কেবল এসকিউএল ইনজেকশন প্রতিরোধ করতে সহায়তা করে না তবে অনুসন্ধানগুলির কার্য সম্পাদন করতে পারে । এসকিএল সার্ভারের ক্যাচিং প্যারামিটারাইজড ক্যোয়ারী প্ল্যান করে এবং পুনরাবৃত্তি অনুসন্ধানের প্রয়োগে তাদের পুনরায় ব্যবহার করুন। যদি আপনি আপনার ক্যোয়ারিকে প্যারামিটারাইজ না করে থাকেন তবে কোয়েরিটির পাঠ্য পৃথক হলে সিকিএল সার্ভার প্রতিটি ক্যোয়ারিতে (কিছু বাদ দিয়ে) নির্বাহের ক্ষেত্রে নতুন পরিকল্পনা তৈরি করে

ক্যোয়ারী প্ল্যান ক্যাশে সম্পর্কিত আরও তথ্য


1
এটি যতটা ভাবেন তার চেয়ে প্রাসঙ্গিক। এমনকি একটি "ছোট" ক্যোয়ারী কার্যকরভাবে পুরো ক্যোয়ারী ক্যাশে ফ্লাশ করে কয়েক হাজার বা লক্ষ লক্ষ বার কার্যকর করা যেতে পারে।
জেমস

5

আমার প্রথম যাওয়ার দু'বছর পরে , আমি আবারও পুনরুক্তি করছি ...

কেন আমরা পরামিতি পছন্দ করি? এসকিউএল ইনজেকশন স্পষ্টতই একটি বড় কারণ, তবে এটি কি এমন হতে পারে যে আমরা গোপনে একটি ভাষা হিসাবে এসকিউএল ফিরে পেতে আগ্রহী । স্ট্রিং লিটারালগুলিতে এসকিউএল ইতিমধ্যে একটি অদ্ভুত সাংস্কৃতিক অনুশীলন, তবে কমপক্ষে আপনি নিজের অনুরোধটি ম্যানেজমেন্ট স্টুডিওতে অনুলিপি করে আটকে দিতে পারেন। এসকিউএল ডায়নামিকভাবে হোস্ট ল্যাঙ্গুয়েজ কন্ডিশনাল এবং কন্ট্রোল স্ট্রাকচারের সাহায্যে তৈরি করা হয়, যখন এসকিউএল এর শর্তাদি এবং নিয়ন্ত্রণ কাঠামো থাকে কেবল মাত্র 0 বর্বরতা। আপনার অ্যাপ্লিকেশনটি ডিবাগে চালাতে হবে, বা কোনও ট্রেস দিয়ে, এটি এসকিউএল কী উত্পন্ন করে তা দেখতে।

শুধু পরামিতি দিয়ে থামবেন না। সমস্ত উপায়ে যান এবং কোয়েরি ফার্স্ট ব্যবহার করুন (অস্বীকার: যা আমি লিখেছি)। আপনার এসকিউএল একটি .sql ফাইলে বাস করে। আপনি আপনার টেবিল এবং কলামগুলির সিনট্যাক্স বৈধতা এবং ইন্টেলিসেন্স সহ এটি কল্পিত টিএসকিউএল সম্পাদক উইন্ডোতে সম্পাদনা করুন। আপনি বিশেষ মন্তব্য বিভাগে পরীক্ষার ডেটা বরাদ্দ করতে পারেন এবং উইন্ডোটিতে ঠিক আপনার ক্যোয়ারী চালাতে "খেলুন" এ ক্লিক করতে পারেন। একটি প্যারামিটার তৈরি করা আপনার এসকিউএলে "@myParam" লাগানোর মতোই সহজ। তারপরে, প্রতিবার সংরক্ষণ করার পরে, কোয়েরি ফার্স্ট আপনার ক্যোয়ারির জন্য সি # র‌্যাপার তৈরি করে। আপনার পরামিতিগুলি কার্যকর করুন () পদ্ধতিগুলির আর্গুমেন্ট হিসাবে দৃ strongly়ভাবে টাইপ করা হয়েছে pop আপনার ফলাফলগুলি একটি IEnumerable বা দৃ P়ভাবে টাইপ করা POCOs এর তালিকায় ফিরে আসবে, প্রকৃত স্কিমা থেকে উত্পন্ন প্রকারগুলি আপনার কোয়েরিতে ফিরে এসেছে। যদি আপনার কোয়েরিটি না চালায় তবে আপনার অ্যাপ্লিকেশনটি সংকলন করবে না। যদি আপনার ডিবি স্কিমা পরিবর্তন হয় এবং আপনার ক্যোয়ারি চলতে থাকে তবে কিছু কলামগুলি অদৃশ্য হয়ে যায় তবে সংকলন ত্রুটিটি আপনার কোডের রেখায় নির্দেশ করেএটি অনুপস্থিত ডেটা অ্যাক্সেস করার চেষ্টা করে। এবং অন্যান্য অনেক সুবিধা আছে। আপনি কেন অন্য কোনও উপায়ে ডেটা অ্যাক্সেস করতে চান?


4

SQL- এ যখন কোনও শব্দের @ সাইন থাকে তার অর্থ এটি পরিবর্তনশীল এবং আমরা এটিতে মান নির্ধারণ করতে এবং একই স্কয়ার স্ক্রিপ্টের নম্বরের ক্ষেত্রে এটি ব্যবহার করি কারণ এটি কেবলমাত্র একক স্ক্রিপ্টে সীমাবদ্ধ যখন আপনি প্রচুর ভেরিয়েবল ঘোষণা করতে পারবেন অনেক স্ক্রিপ্টে একই ধরণের এবং নাম। আমরা এই পরিবর্তনশীলটিকে স্টোরেজ পদ্ধতিতে ব্যবহার করি কারণ সঞ্চিত পদ্ধতিটি প্রাক-সংকলিত ক্যোয়ারী হয় এবং আমরা আরও তথ্যের জন্য স্ক্রিপ্ট, ডেস্কটপ এবং ওয়েবসাইটগুলি থেকে এই ভেরিয়েবলের মানগুলি পাস করতে পারি লোকাল ভেরিয়েবল , এসকিউএল স্টোরার্ড পদ্ধতি এবং এসকিএল ইনজেকশন পড়ুন

এসকিএল ইনজেকশন থেকে সুরক্ষা পড়ুন এটি আপনাকে কীভাবে আপনার ডাটাবেসটিকে সুরক্ষা দিতে পারে তা গাইড করবে।

আশা করি এটি কোনও প্রশ্ন আমার মন্তব্য করার জন্য আপনাকে বুঝতে সহায়তা করবে।


3

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

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

সি শার্প

var bldr = new SqlBuilder( myCommand );
bldr.Append("SELECT * FROM CUSTOMERS WHERE ID = ").Value(myId);
//or
bldr.Append("SELECT * FROM CUSTOMERS WHERE NAME LIKE ").FuzzyValue(myName);
myCommand.CommandText = bldr.ToString();

আপনার কোডটি খাটো হবে এবং আরও অনেক বেশি পাঠযোগ্য। এমনকি আপনার অতিরিক্ত লাইনও লাগবে না এবং আপনি যখন আবার পড়ছেন তখন প্যারামিটারগুলির মানটির জন্য আপনার খোঁজ করতে হবে না। আপনার প্রয়োজনীয় ক্লাসটি এখানে ...

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

public class SqlBuilder
{
private StringBuilder _rq;
private SqlCommand _cmd;
private int _seq;
public SqlBuilder(SqlCommand cmd)
{
    _rq = new StringBuilder();
    _cmd = cmd;
    _seq = 0;
}
public SqlBuilder Append(String str)
{
    _rq.Append(str);
    return this;
}
public SqlBuilder Value(Object value)
{
    string paramName = "@SqlBuilderParam" + _seq++;
    _rq.Append(paramName);
    _cmd.Parameters.AddWithValue(paramName, value);
    return this;
}
public SqlBuilder FuzzyValue(Object value)
{
    string paramName = "@SqlBuilderParam" + _seq++;
    _rq.Append("'%' + " + paramName + " + '%'");
    _cmd.Parameters.AddWithValue(paramName, value);
    return this;
}
public override string ToString()
{
    return _rq.ToString();
}
}

আপনার পরামিতিগুলির নামকরণ সার্ভারটি চলমান ক্যোয়ারীগুলি প্রোফাইল করার সময় অবশ্যই সহায়তা করে।
ডেভ আর।

আমার বস একই জিনিস বলেছেন। যদি অর্থবোধক প্যারামিটারের নামগুলি আপনার কাছে গুরুত্বপূর্ণ হয় তবে মান পদ্ধতিতে একটি প্যারামনেম যুক্তি যুক্ত করুন। আমি সন্দেহ করি যে আপনি অযথা জিনিস জটিল করে তুলছেন।
bbsimonbb

খারাপ ধারণা। যেমনটি আগে বলা হয়েছিল, AddWithValueঅন্তর্নিহিত রূপান্তর সমস্যার কারণ হতে পারে।
আদম কালভেট বোহল

@ অ্যাডাম আপনি ঠিকই বলেছেন, তবে এটি অ্যাডউইথওয়ালু () কে খুব বেশি ব্যবহৃত হতে বাধা দেয় না এবং আমি মনে করি না এটি ধারণাটি অকার্যকর করে দিয়েছে। তবে এরই মধ্যে আমি প্যারামিটারাইজড কোয়েরিগুলি লেখার আরও ভাল উপায় নিয়ে এসেছি এবং এটি অ্যাডউইথওয়ালু () :-) ব্যবহার করে না
বিবিসিমোনববি

রাইট! প্রতিশ্রুতি আমি শীঘ্রই এটি দেখতে যাচ্ছি!
অ্যাডাম কালভেট বোহল

3

পুরাতন পোস্ট কিন্তু সঞ্চিত প্রক্রিয়া সম্পর্কে নতুন আগতগণ সচেতন তা নিশ্চিত করতে চেয়েছিলেন ।

আমার এখানে 10 ¢ মূল্য হ'ল যদি আপনি আপনার এসকিউএল বিবৃতি একটি সঞ্চিত পদ্ধতি হিসাবে লিখতে সক্ষম হন তবে আমার দৃষ্টিতে এটি সর্বোত্তম পদ্ধতির approach আমি সর্বদা সঞ্চিত প্রকটগুলি ব্যবহার করি এবং কখনই আমার প্রধান কোডে রেকর্ডটি লুপ করি না। উদাহরণস্বরূপ: SQL Table > SQL Stored Procedures > IIS/Dot.NET > Class

আপনি সঞ্চিত পদ্ধতি ব্যবহার করেন, তখন আপনাকে ব্যবহারকারী সীমিত করতে পারে EXECUTE শুধুমাত্র অনুমতি, এইভাবে নিরাপত্তা ঝুঁকি হ্রাস

আপনার সঞ্চিত পদ্ধতিটি অন্তর্নিহিত প্যারামাইরিজড এবং আপনি ইনপুট এবং আউটপুট পরামিতিগুলি নির্দিষ্ট করতে পারেন।

সঞ্চিত পদ্ধতি (যদি এটি SELECTস্টেটমেন্টের মাধ্যমে ডেটা ফেরত দেয় ) অ্যাক্সেস করা যায় এবং আপনি নিয়মিত যেমন হতেন ঠিক তেমনভাবে পড়া যায়SELECT বিবৃতি দেন।

এটি এসকিউএল সার্ভারে সংকলিত হওয়ার সাথে সাথে এটি আরও দ্রুত চলে।

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

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