প্যারামিটার ছাড়াই এসকিউএল ইঞ্জেকশন এড়ানো


109

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

আমি আপনাকে সি # তে একটি সাধারণ উদাহরণ দিই:

আমি আমাদের এটি ব্যবহার করতে চাই:

string sql = "SELECT * FROM Users WHERE Name=@name";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe

অন্য ছেলেরা এটি করতে চাইলে:

string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?

যেখানে SafeDBString ফাংশনটি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়েছে:

string SafeDBString(string inputValue) 
{
    return "'" + inputValue.Replace("'", "''") + "'";
}

এখন, যতক্ষণ না আমরা আমাদের অনুসন্ধানগুলিতে সমস্ত স্ট্রিং মানগুলিতে SafeDBString ব্যবহার করি আমাদের নিরাপদ থাকা উচিত। রাইট?

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

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

কেউ কি আছে যে এটাকে ভেঙে দিতে পারে? তুমি এটা কি ভাবে করবে?

সম্পাদনা: এখন পর্যন্ত উত্তরগুলি সংক্ষিপ্ত করতে:

  • স্কেল সার্ভার ২০০৫ বা ২০০৮ এ সেফডিবিএস স্ট্রিংয়ের আশেপাশে যাওয়ার কোনও উপায় এখনও কেউ খুঁজে পায়নি। এটা ভাল, আমি মনে করি?
  • বেশ কয়েকটি জবাব নির্দেশ করেছে যে প্যারামিট্রাইজড কোয়েরিগুলি ব্যবহার করার সময় আপনি একটি পারফরম্যান্স লাভ পাবেন। কারণটি হ'ল ক্যোয়ারী প্ল্যানগুলি পুনরায় ব্যবহার করা যেতে পারে।
  • আমরা এও সম্মত হই যে প্যারামিট্রাইজড কোয়েরিগুলি ব্যবহার করে আরও পড়ার যোগ্য কোড দেয় যা বজায় রাখা সহজ
  • এরপরে SafeDBString এর বিভিন্ন সংস্করণ, সংখ্যার রূপান্তর থেকে স্ট্রিং থেকে তারিখ রূপান্তরগুলিতে স্ট্রিমিংয়ের চেয়ে পরামিতিগুলি সর্বদা ব্যবহার করা সহজ।
  • প্যারামিটারগুলি ব্যবহার করে আপনি স্বয়ংক্রিয় ধরণের রূপান্তর পান, এমন কিছু যা বিশেষভাবে কার্যকর যখন আমরা তারিখ বা দশমিক সংখ্যার সাথে কাজ করি।
  • এবং সবশেষে: জুলিয়ানআর লিখেছেন বলে নিজেকে সুরক্ষা দেওয়ার চেষ্টা করবেন না । ডাটাবেস বিক্রেতারা সুরক্ষার জন্য প্রচুর সময় এবং অর্থ ব্যয় করে। আমাদের আরও ভাল করার কোনও উপায় নেই এবং তাদের কাজটি করার চেষ্টা করার কোনও কারণ নেই।

সুতরাং কেউই সেফডিবিএস স্ট্রিংয়ের ফাংশনটির সাধারণ সুরক্ষা ভঙ্গ করতে সক্ষম না হওয়ায় আমি আরও অনেক ভাল যুক্তি পেয়েছি। ধন্যবাদ!


16
আপনার সহকর্মীরা পথ, উপায়, বেস থেকে দূরে। তাদের অবস্থানের সমর্থনে একটি একক সাহিত্যের সন্ধানের জন্য তাদেরকে চ্যালেঞ্জ করুন। প্রাক্তন নিওলিথোস যুক্তিটি হাস্যকর, জিনিসগুলি পরিবর্তিত হয়, কেবলমাত্র পাথরের যুগে আটকে থাকা কোনও ব্যক্তি মানিয়ে নিতে ব্যর্থ হয়।
অন্নাকাটা

1
আচ্ছা, কমপক্ষে আপনার সহকর্মীরা হ্যাকের বিভিন্ন ফর্মগুলির মধ্যে একটির বিরুদ্ধে সুরক্ষা দিন ... তারা কি নিশ্চিত যে সমস্ত প্যারামিটারাইজড ক্যোয়ারীগুলি কাজ করে? (আমি নই ...)
আরজান আইনবু

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

3
এমনকি একক উদ্ধৃতি ব্যতীত, আপনি এখনও যুক্তিকে আপনার কোডটি ভেঙে ফেলতে পারেন। ব্যবহারকারীর নাম "পরীক্ষার OR 1 = 1" ব্যবহার করে দেখুন - আপনি ব্যবহারকারীর নাম পরীক্ষার পরিবর্তে সমস্ত সারি ফেরত পাবেন!
সেতু

1
দীর্ঘশ্বাস. আমি সত্যিই পাই না যে আমরা শিল্প হিসাবে কীভাবে এই ধরণের অপেশাদারী আচরণকে সহ্য করতে পারি manage
jeroenh

উত্তর:


83

আমি মনে করি সঠিক উত্তরটি হ'ল:

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

পরামিতি ব্যবহার করুন।


পুনরায় "বিশ্বাসযোগ্য, শিল্প মানক লাইব্রেরি যা আছে তা ব্যবহার করুন" - আপনি নেট .NET- র জন্য একটি সুপারিশ করতে পারেন? ডিবির উপর নির্ভর করে একের বেশি হতে পারে: এসকিউএল সার্ভার, মাইএসকিউএল, পোস্টগ্র্যাস এসকিউএল? আমি এসকিউএল-স্যানিটাইজারের সন্ধান করেছি তবে অনেক ভাগ্য ছাড়াই, এইচএসভিকে আমার নিজের প্রয়োগ করতে বাধ্য করা হয়েছে, সর্বোপরি আমি যা করতে পারি (যা নির্দোষ থেকে দূরে কোনও সন্দেহ নেই)।
পিএসইউ

72

এবং তারপরে কেউ গিয়ে "পরিবর্তে 'ব্যবহার করে Para প্যারামিটারগুলি হ'ল আইএমও, একমাত্র নিরাপদ পথ।

এটি খেজুর / সংখ্যা সহ প্রচুর আই 18 এন ইস্যুও এড়িয়ে যায়; 01/02/03 তারিখ কত? 123,456 কত? আপনার সার্ভারগুলি (অ্যাপ্লিকেশন-সার্ভার এবং ডিবি-সার্ভার) একে অপরের সাথে একমত?

যদি ঝুঁকি ফ্যাক্টর তাদের কাছে বিশ্বাসী না হয় তবে কর্মক্ষমতা সম্পর্কে কীভাবে? আরডিবিএমএস আপনি যদি প্যারামিটার ব্যবহার করে, পারফরম্যান্সে সহায়তা করে তবে ক্যোয়ারী প্ল্যানটি পুনরায় ব্যবহার করতে পারে। এটি কেবল স্ট্রিং দিয়ে এটি করতে পারে না।


আমি ফরম্যাটিং এবং পারফরম্যান্স যুক্তি চেষ্টা করেছি, কিন্তু তারা এখনও নিশ্চিত হয় না।
রুন গ্রিমস্টাড

5
প্রকৃতপক্ষে, স্ক্যুয়াল সার্ভার আপনি প্যারামিটারগুলি ব্যবহার করেন বা না করে ক্যোয়ারী প্ল্যানটিকে পুনরায় ব্যবহার করতে পারেন। আমি অন্যান্য যুক্তিগুলির সাথে একমত, তবে বেশিরভাগ ক্ষেত্রে প্যারামিটারাইজড স্কয়ারের পারফরম্যান্স যুক্তিটি আর উড়ে যায় না।
tnyfst

1
@ টনিফস্ট: প্রতিটি প্যারামিটার মানগুলির সংমিশ্রণের জন্য ক্যোরি স্ট্রিং পরিবর্তিত হলে এটি কার্যকরকরণ পরিকল্পনাটি পুনরায় ব্যবহার করতে পারে? আমি তা সম্ভব ভাবিনি।
জন স্যান্ডার্স

4
কোয়েরির পাঠ্যটি পূর্বের ক্যোয়ারী পাঠ্যে আইডেন্টিকাল হলে পুনরায় ব্যবহার করা হবে। সুতরাং আপনি যদি দু'বার নির্ভুল সেম ক্যোয়ারী প্রেরণ করেন তবে এটি পুনরায় ব্যবহৃত হবে। তবে, আপনি যদি কেবল একটি স্থান বা কমা বা কিছু পরিবর্তন করেন তবে একটি নতুন ক্যোয়ারী পরিকল্পনা নির্ধারণ করতে হবে।
marc_s

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

27

তর্কটি কোনও জয়ের নয়। যদি আপনি কোনও দুর্বলতা সন্ধান করতে পরিচালনা করেন তবে আপনার সহকর্মীরা কেবল সেফডিবিএসটিং ফাংশনটির জন্য এটির জন্য পরিবর্তন করবেন এবং তারপরে আপনাকে প্রমাণ করতে বলবেন যে এটি আবারও নিরাপদ নয়।

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

যদি সমস্যাটি সমস্ত লিগ্যাসি কোডটি পুনরায় লিখতে থাকে তবে সহজেই আপস হ'ল নতুন কোডে প্যারামিট্রাইজড কোয়েরিগুলি ব্যবহার করা এবং সেই কোডটিতে কাজ করার সময় রিফ্যাক্টর পুরানো কোডগুলি সেগুলি ব্যবহার করা।

আমার অনুমানটি হ'ল আসল সমস্যাটি হ'ল অহংকার এবং একগুঁয়েমি, এবং এটি সম্পর্কে আপনি আরও কিছু করতে পারবেন না।


19

প্রথমত, "প্রতিস্থাপন" সংস্করণটির জন্য আপনার নমুনাটি ভুল is আপনাকে পাঠ্যের চারপাশে অ্যাডাস্ট্রোফগুলি রাখতে হবে:

string sql = "SELECT * FROM Users WHERE Name='" + SafeDBString(name) & "'";
SqlCommand getUser = new SqlCommand(sql, connection);

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

আর একটি বিষয় হল পারফরম্যান্স: প্যারামিটারাইজড ক্যোয়ারী প্ল্যানগুলি প্রায়শই কনটেনটেটেড প্ল্যানগুলির চেয়ে ভাল ক্যাশে হয়, সুতরাং কোয়েরিটি চালানোর সময় সম্ভবত সার্ভারকে একটি পদক্ষেপ সংরক্ষণ করতে হবে।

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

x \ 'বা 1 = 1; -


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

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


5
প্রতিস্থাপনের কাজটি
অ্যাডোস্টোফেস

5
তারপরে এটি বাগের আরও একটি উত্স। এটি একটি নাল মান হিসাবে নুল এবং একটি পাঠ্য স্ট্রিং হিসাবে নুলের মধ্যে পার্থক্যটি কীভাবে জানতে পারে? বা একটি সংখ্যার ইনপুট এবং একটি স্ট্রিংয়ের মধ্যে যা কেবল অঙ্কগুলি সংঘটিত হয়?
জোয়েল কোহোর্ন

ভাল যুক্তি. আপনার কেবলমাত্র স্ট্রিংগুলির জন্য ফাংশনটি ব্যবহার করা উচিত এবং সম্ভবত তারিখগুলি ব্যবহার করা উচিত, তাই আপনাকে সতর্কতা অবলম্বন করতে হবে। প্যারামিটার ব্যবহারের এটি আরও একটি কারণ! হ্যাঁ!
রুন গ্রিমস্টাড

10

সুতরাং আমি বলব:

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

2) আপনি কখনই সেফডিবিএসট্রিংয়ে কোনও কল মিস করবেন না তার গ্যারান্টি দেওয়ার জন্য কোন প্রক্রিয়াগুলি স্থানে রয়েছে? এটি 1 টি জায়গায় হারিয়ে যাওয়া সমস্যার পুরো হোস্ট খুলতে পারে। আপনি এই বিষয়গুলিতে কতটা নজরকাড়া করতে যাচ্ছেন এবং যখন গ্রহণযোগ্য সঠিক উত্তরটি পৌঁছানো সহজ হয় তখন সেই প্রচেষ্টাটি কতটা অপচয় হয় তা বিবেচনা করুন।

3) আপনি কতটা নিশ্চিত যে আপনি মাইক্রোসফ্ট (ডিবি এবং অ্যাক্সেস লাইব্রেরিটির লেখক) আপনার সেফডিবিএস স্ট্রিং বাস্তবায়নে জেনেছেন এমন প্রতিটি আক্রমণকারী ভেক্টরকে coveredেকে রেখেছেন ...

৪) বর্গের কাঠামো পড়া কতটা সহজ? উদাহরণটি + কনটেনটেশন ব্যবহার করে, প্যারামিটারগুলি স্ট্রিংয়ের মতো For ফর্ম্যাট, যা আরও পঠনযোগ্য।

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

আমাদের লগকম্যান্ড ফাংশনটি সহজভাবে:

    string LogCommand(SqlCommand cmd)
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendLine(cmd.CommandText);
        foreach (SqlParameter param in cmd.Parameters)
        {
            sb.Append(param.ToString());
            sb.Append(" = \"");
            sb.Append(param.Value.ToString());
            sb.AppendLine("\"");
        }
        return sb.ToString();
    }

সঠিক বা ভুল, এটি আমাদের সুরক্ষা সমস্যা ছাড়াই প্রয়োজনীয় তথ্য দেয়।


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

1
আসল পরামিতি প্রয়োগ করার উপায় নেই ব্যাতিক্রম আইটেম # 2 এর জন্য +1।
জোয়েল কোহোর্ন

7

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


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

5

এসকিউএল ইনজেকশন আক্রমণগুলি এড়াতে এবং অবশ্যই প্যারামেট্রাইজড কোয়েরিগুলিকে পছন্দ করতে আমি উভয় পন্থা ব্যবহার করেছি। আমি যখন কনটেনেটেড ক্যোয়ারী ব্যবহার করেছি তখন আমি ভেরিয়েবলগুলি (যেমন mysql_real_escape_string) এড়ানোর জন্য একটি লাইব্রেরি ফাংশন ব্যবহার করেছি এবং আত্মবিশ্বাসী হব না যে আমি মালিকানা বাস্তবায়নে সমস্ত কিছু কভার করেছি (যেমন মনে হয় আপনি খুব বেশি)।


2
+1 টি কারণ mysql_real_escape_string () বেরিয়ে \ x00, \ x1a, \ n \ n R 'এবং "এটি অক্ষর সেট বিষয় পরিচালনা ওপি এর সহকর্মীদের সাদাসিধা ফাংশন যা কোন করি
বিল Karwin

4

প্যারামিটারগুলি ব্যবহার না করে আপনি সহজেই কোনওভাবে ব্যবহারকারী ইনপুট পরীক্ষা করতে পারবেন না।

আপনি যদি ডিবি কল করার জন্য যদি আপনি এসকিউএলকম্যান্ড এবং এসকিউএলপ্যারামিটার ক্লাস ব্যবহার করেন তবে আপনি এখনও কার্যকর হওয়া এসকিউএল কোয়েরিটি দেখতে পাচ্ছেন। এসকিউএলকম্যান্ডের কমান্ডটেক্সট সম্পত্তিটি দেখুন।

প্যারামিটারাইজড কোয়েরিগুলি ব্যবহার করা খুব সহজ হলে আমি সর্বদা এসকিউএল ইঞ্জেকশন প্রতিরোধের রোল-আপনার নিজস্ব পদ্ধতির সম্পর্কে সন্দেহজনক। দ্বিতীয়ত, "কারণ এটি" সর্বদা সেভাবে করা হয়েছে "এর অর্থ এটি করার সঠিক উপায় নয়।


3

এটি কেবলমাত্র নিরাপদ যদি আপনি গ্যারান্টিযুক্ত হন যে আপনি কোনও স্ট্রিংয়ে যাচ্ছেন।

আপনি যদি কোনও পর্যায়ে স্ট্রিং দিয়ে যাচ্ছেন না? আপনি যদি কেবল একটি নম্বর পাস করেন?

http://www.mywebsite.com/profile/?id=7;DROP DATABASE DB

শেষ পর্যন্ত হয়ে যাবে:

SELECT * FROM DB WHERE Id = 7;DROP DATABASE DB

এটি হয় স্ট্রিং বা একটি সংখ্যা। সেফডিবিস্ট্রিংয়ের সাহায্যে একটি স্ট্রিং পালানো হয়েছে। একটি সংখ্যা একটি আন্ত 32, এবং এটি ডেটাবেস ড্রপ করতে পারে না।
Andomar

নম্বরগুলি পরিচালনা করা সহজ। আপনি কেবলমাত্র প্যারামিটারটিকে ক্যোয়ারিতে ব্যবহার করার আগে একটি int / ফ্লোট / যা কিছুতে রূপান্তরিত করুন। সমস্যাটি যখন তখন আপনার স্ট্রিং ডেটা গ্রহণ করতে হবে।
রুন গ্রিমস্টাড

Andomar - আপনি যদি হাতে হাতে একটি এসকিউএল স্টেটমেন্ট তৈরি করেন তবে এটি "টাইপ" এর উদ্দেশ্য নয়, আপনি এসকিউএল খুব সহজেই একটি সংখ্যা দিয়ে ইনজেক্ট করতে পারেন। রুন - আমি মনে করি এসকিউএল ইঞ্জেকশনটি ম্যানুয়ালি সমাধানের সমস্ত সংক্ষিপ্তসারগুলি মনে রাখার জন্য এটি পৃথক বিকাশকারীদের উপর অনেক বেশি নির্ভর করে। আপনি যদি কেবল "পরামিতি ব্যবহার করুন" বলেন এটি খুব সহজ এবং সেগুলি ভুল হতে পারে না।
জোশকমলে

@ অ্যান্ডোমার: নুল কী হবে? বা স্ট্রিংগুলি সংখ্যার মতো দেখতে?
জোয়েল কোহর্ন

2

আমি সমস্ত কিছুর জন্য সঞ্চিত পদ্ধতি বা ফাংশন ব্যবহার করব, যাতে প্রশ্নটি ওঠে না।

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


ঠিক আছে, প্যারামিটারগুলি ব্যবহার করে কীভাবে এসকিউএল ইঞ্জেকশন করবেন?
জন স্যান্ডার্স

@ স্যান্ডার্স: প্রথম পদক্ষেপটি আপনার ডিবির প্যারামিটার-হ্যান্ডলিং কার্যকারিতাটিতে একটি বাফার ওভারফ্লো বাগ খুঁজে পাওয়া।
ব্রায়ান

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

1
অবশ্যই এসপিআরসি যদি কনটেনটেশন এবং এক্সইসি (এসপিএক্সেকিউট এসকিউএল এর পরিবর্তে) ব্যবহার করে থাকে তবে আপনি সমস্যায় ফিরে এসেছেন ... (আমি এটিকে ছাড় দেওয়ার জন্য এটি বহুবার ভুল করে দেখেছি ...)
মার্ক গ্র্যাভেল

2

সুরক্ষা ইস্যুতে বিশাল সম্মত হন।
প্যারামিটার ব্যবহারের আর একটি কারণ দক্ষতার জন্য।

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

তবে আপনি যদি প্যারামিটারগুলি আবদ্ধ না করেন তবে এসকিউএল স্ট্রিং প্রতিটি অনুরোধে পরিবর্তিত হয় (যার বিভিন্ন পরামিতি রয়েছে) এবং এটি আপনার ক্যাশে যা আছে তা কখনও মিলবে না।


2

ইতিমধ্যে প্রদত্ত কারণে, পরামিতিগুলি খুব ভাল ধারণা। তবে আমরা সেগুলি ব্যবহার করা ঘৃণা করি কারণ পরম তৈরি করা এবং কোনও প্রশ্নের পরে ব্যবহারের জন্য তার নামটি একটি ভেরিয়েবলের কাছে নির্ধারণ করা হ'ল ট্রিপল ইন্ডিয়ারেশনের মাথা নষ্ট।

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

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

কোড পঠনযোগ্যতা, আমি আশা করি আপনি একমত হবেন, ব্যাপক উন্নতি হয়েছে এবং আউটপুটটি একটি সঠিক প্যারামিটারাইজড ক্যোয়ারী।

ক্লাসটি এমন দেখাচ্ছে ...

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

namespace myNamespace
{
    /// <summary>
    /// Pour le confort et le bonheur, cette classe remplace StringBuilder pour la construction
    /// des requêtes SQL, avec l'avantage qu'elle gère la création des paramètres via la méthode
    /// Value().
    /// </summary>
    public class SqlBuilder
    {
        private StringBuilder _rq;
        private SqlCommand _cmd;
        private int _seq;
        public SqlBuilder(SqlCommand cmd)
        {
            _rq = new StringBuilder();
            _cmd = cmd;
            _seq = 0;
        }
        //Les autres surcharges de StringBuilder peuvent être implémenté ici de la même façon, au besoin.
        public SqlBuilder Append(String str)
        {
            _rq.Append(str);
            return this;
        }
        /// <summary>
        /// Ajoute une valeur runtime à la requête, via un paramètre.
        /// </summary>
        /// <param name="value">La valeur à renseigner dans la requête</param>
        /// <param name="type">Le DBType à utiliser pour la création du paramètre. Se référer au type de la colonne cible.</param>
        public SqlBuilder Value(Object value, SqlDbType type)
        {
            //get param name
            string paramName = "@SqlBuilderParam" + _seq++;
            //append condition to query
            _rq.Append(paramName);
            _cmd.Parameters.Add(paramName, type).Value = value;
            return this;
        }
        public SqlBuilder FuzzyValue(Object value, SqlDbType type)
        {
            //get param name
            string paramName = "@SqlBuilderParam" + _seq++;
            //append condition to query
            _rq.Append("'%' + " + paramName + " + '%'");
            _cmd.Parameters.Add(paramName, type).Value = value;
            return this; 
        }

        public override string ToString()
        {
            return _rq.ToString();
        }
    }
}

1

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

এটি প্যারামিটার এবং সঞ্চিত পদ্ধতি ছেড়ে দেয়।

এবং হ্যাঁ, এখনই আপনি যেভাবে জানেন তার সেরা পদ্ধতিতে আপনার কোডটি সর্বদা কার্যকর করার চেষ্টা করা উচিত - এটি কীভাবে সর্বদা করা হয়েছিল তা ঠিক নয়।


ডাবল অ্যাডাস্টোফেসগুলি এসকিএল সার্ভার দ্বারা একটি একক অ্যাডাস্ট্রোফে অনুবাদ করা হবে, সুতরাং ও'রিলিকে নাম = 'ও'রিলি'তে অনুবাদ করা হবে
রুন গ্রিমস্টাড

সুতরাং ব্যবহারকারী যখন তাদের ডেটা দেখতে চান তখন অ্যাস্টোস্ট্রোফগুলি সরানোর জন্য কি কোনও সম্পর্কিত ফাংশন রয়েছে?
কামরাণা

দরকার নেই. এস্কেপ ক্রমটি পার্সারটিকে স্ট্রিংয়ের শেষের চেয়ে একক উদ্ধৃতি দেখতে দেয়। এটি ''যেমন পার্সিং হয়, এটি আক্ষরিক হিসাবে দেখায় ', সুতরাং আপনার স্ট্রিংটি অভ্যন্তরীণভাবে অক্ষরের অনুক্রম হিসাবে দেখা যাবে O'Reilly। এটিই ডিবি সংরক্ষণ করবে, পুনরুদ্ধার করবে, এর তুলনা করবে ইত্যাদি ইত্যাদি you
সিএইচও

1

এখানে কয়েকটি নিবন্ধ রয়েছে যা আপনি আপনার সহকর্মীদের বোঝাতে সহায়ক বলে মনে করতে পারেন।

http://www.sommarskog.se/dynamic_sql.html

http://unixwiz.net/techtips/sql-injection.html

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


1

এটি ভাঙা যায়, তবে উপায়টি সঠিক সংস্করণ / প্যাচ ইত্যাদির উপর নির্ভর করে etc.

ইতিমধ্যে উত্থাপিত একটি হ'ল ওভারফ্লো / ট্র্যাঙ্কেশন বাগ যা ব্যবহার করা যেতে পারে।

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

দিন শেষে, প্রতিস্থাপন সুরক্ষা ব্যবস্থা প্রত্যাশিত তবে উদ্দেশ্যযুক্ত কার্যকারিতার উপর নির্ভর করে । কার্যকারিতা যেহেতু কোডের উদ্দেশ্যপ্রাপ্ত উদ্দেশ্য ছিল না, তাই একটি উচ্চ সম্ভাবনা রয়েছে যে কিছু আবিষ্কারক তাত্পর্য আপনার প্রত্যাশিত কার্যকারিতা ভঙ্গ করবে।

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


1

সর্বদা সম্ভব যেখানে প্যারামিটারাইজড কোয়েরি ব্যবহার করুন। কখনও কখনও কোনও অদ্ভুত অক্ষর ব্যবহার না করে একটি সাধারণ ইনপুট ইতিমধ্যে একটি এসকিউএল-ইনজেকশন তৈরি করতে পারে যদি এটি ডাটাবেসের কোনও ক্ষেত্রের জন্য একটি ইনপুট হিসাবে চিহ্নিত না হয়।

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


1

'নিজেরাই কেন খারাপ করা হচ্ছে' এই দিকে আমি অন্য কোনও উত্তরকারীকে সম্বোধন করতে দেখিনি, তবে এসকিউএল কাটা আক্রমণ বিবেচনা করুন ।

এছাড়াও QUOTENAMEটি-এসকিউএল ফাংশন রয়েছে যা আপনি যদি তাদেরকে প্যারাম ব্যবহার করতে রাজি না করতে পারেন তবে সহায়ক হতে পারে। এটি পালিয়ে যাওয়া কউটি উদ্বেগের অনেকগুলি (সমস্ত?) ধরেছে।


1

2 বছর পরে , আমি পুনরুদ্ধার করলাম ... যে কেউ প্যারামিটারগুলির ব্যথা পেয়েছে সে আমার ভিএস এক্সটেনশন, ক্যোয়ারি ফার্স্ট চেষ্টা করে স্বাগত । আপনি আপনার অনুরোধটি একটি বাস্তব। এসকিউএল ফাইল (বৈধকরণ, ইন্টেলিসেন্স) এ সম্পাদনা করুন। একটি প্যারামিটার যুক্ত করতে, আপনি কেবল এটি '@' দিয়ে শুরু করে সরাসরি আপনার এসকিউএলে টাইপ করুন। আপনি যখন ফাইলটি সংরক্ষণ করেন, ক্যোয়ারি ফার্স্ট আপনাকে কোয়েরি চালাতে এবং ফলাফলগুলিতে অ্যাক্সেস করতে র‌্যাপার ক্লাস তৈরি করবে। এটি আপনার প্যারামিটারের DB প্রকারটি সন্ধান করবে এবং এটি। নেট প্রকারে মানচিত্র করবে, যা আপনি জেনারেটেড এক্সিকিউট () পদ্ধতিতে ইনপুট হিসাবে পাবেন। সহজ হতে পারে না। এটিকে সঠিক উপায়ে করা অন্য যে কোনও উপায়ে না করার চেয়ে তাত্পর্যপূর্ণ ও দ্রুত এবং একটি স্কুয়েল ইনজেকশন দুর্বলতা তৈরি করা অসম্ভব বা কমপক্ষে বিভ্রান্তিকরভাবে কঠিন হয়ে ওঠে। অন্যান্য ঘাতক সুবিধা রয়েছে যেমন আপনার ডিবিতে কলামগুলি মুছতে সক্ষম হওয়া এবং ততক্ষনে আপনার অ্যাপ্লিকেশনটিতে সংকলন ত্রুটিগুলি দেখুন।

আইনী অস্বীকৃতি: আমি কোয়েরি ফার্স্ট লিখেছি


0

প্যারামিটারাইজড কোয়েরিগুলি ব্যবহার করার কয়েকটি কারণ এখানে রয়েছে:

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

0

কিছু দুর্বলতা ছিল (আমি বুঝতে পারি না এটি কোন ডাটাবেস ছিল) যা এসকিউএল স্টেটমেন্টের বাফার ওভারফ্লো সম্পর্কিত।

আমি যা বলতে চাই তা হ'ল এসকিউএল-ইনজেকশনটি কেবল "উদ্ধৃতি থেকে পালাতে" পারেন এবং পরবর্তী কী হবে তা আপনার কোনও ধারণা নেই।


0

আর একটি গুরুত্বপূর্ণ বিবেচনা হ'ল পালানো এবং অনাকাঙ্ক্ষিত ডেটা ট্র্যাক করা। ওয়েব এবং অন্যথায় প্রচুর সংখ্যক অ্যাপ্লিকেশন রয়েছে, যেগুলি কখন ডেটা কাঁচা-ইউনিকোড, এবং এনকোডযুক্ত, ফর্ম্যাট করা এইচটিএমএল, এবং সিটিএর জন্য সঠিকভাবে নজর রাখে বলে মনে হয় না। এটি সুস্পষ্ট যে কোন স্ট্রিংগুলি তা ট্র্যাক করা শক্ত হয়ে উঠবে'' এনকোডেড এবং কোনটি নেই সেগুলি ।

আপনি যখন কিছু ভেরিয়েবলের ধরণ পরিবর্তন করে শেষ করেন এটিও একটি সমস্যা - সম্ভবত এটি একটি পূর্ণসংখ্যা হিসাবে ব্যবহৃত হত তবে এখন এটি একটি স্ট্রিং। এখন আপনার সমস্যা আছে।

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