স্কেল ইনজেকশনগুলি রোধ করতে পরামিতিগুলি কি সত্যই যথেষ্ট?


83

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

তবে আমি ভাবতে শুরু করি সত্যই এটি সত্য কিনা। এমন কোনও এসকিউএল ইঞ্জেকশন আক্রমণ রয়েছে যা প্যারামিটারাইজড ক্যোয়ারির বিপরীতে সফল হবে? আপনি উদাহরণস্বরূপ এমন কোনও স্ট্রিং প্রেরণ করতে পারবেন যা সার্ভারে একটি বাফার ওভারফ্লোর কারণ?

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

সম্পাদনা করুন: পরামিতি এবং প্যারামিটারাইজড কোয়েরি দ্বারা আমি কী বোঝাতে চাই তা স্পষ্ট করতে। প্যারামিটার ব্যবহার করে আমি বোঝাতে চাইছি একটি স্ট্রিং-এ স্ক্যুয়েল কোয়েরি তৈরির পরিবর্তে "ভেরিয়েবল" ব্যবহার করা।
সুতরাং এটি করার পরিবর্তে:

SELECT * FROM Table WHERE Name = 'a name'

আমরা এটি করি:

SELECT * FROM Table WHERE Name = @Name

এবং তারপরে ক্যোয়ারী / কমান্ড অবজেক্টে @ নাম প্যারামিটারের মান সেট করুন।


আমাদের প্যারামিটার বলতে কী বোঝাতে হবে (জোনাথন লেফলার বলেছিলেন) - আমি সঞ্চিত-প্রক্রিয়া পরামিতিগুলি ভাবছিলাম, তবে কী আছে? পারমস এবং {0} পারমস ...
স্টিভেন এ লো

বলা বাহুল্য সহজ, আমরা কোয়েরি তৈরি করতে কনট্যাকটেশন ব্যবহার করি না।

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

উত্তর:


50

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

আপনি স্থানধারীদের ভিতরে ফাংশন ব্যবহার করতে পারবেন না এবং আপনি স্থানধারক কলাম বা টেবিলের নাম হিসাবে ব্যবহার করতে পারবেন না, কারণ তারা পালিয়ে গেছে এবং স্ট্রিং লিটারাল হিসাবে উদ্ধৃত হয়েছে।

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

এটি বলেছে, আপনি যদি এমন কোনও কিছুর মান নির্ধারণ করতে ইনপুট ব্যবহার করেন security_levelতবে কেউ আপনার সিস্টেমে নিজেকে প্রশাসক হিসাবে তৈরি করতে পারে এবং বিনা মূল্যে বিনামূল্যে থাকতে পারে। তবে এটি কেবলমাত্র বেসিক ইনপুট বৈধতা, এবং এসকিউএল ইঞ্জেকশনটির সাথে কোনও সম্পর্ক নেই।


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

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

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

4
আমি প্রতিটি লিঙ্ক পড়েছি। দয়া করে এমন কোনও লিঙ্ক উল্লেখ করুন যা ডিবিএমএস পরামিতি সংগ্রহের বিরুদ্ধে কোনও ওয়ার্কিং ইনজেকশন আক্রমণকে বোঝায়। প্রকৃতপক্ষে, আপনি যে লিঙ্কটি পোস্ট করেছেন তা হ'ল এসকিউএল ইনজেকশনটিকে পরাস্ত করার জন্য ("টাইপ-সেফ এসকিউএল প্যারামিটারগুলি ব্যবহার করে" বিভাগটি দেখুন) approach
এইচটিটিপি 410

ওহে! উত্তরটি প্রমাণ করতে আপনি কী ওরাকল এসকিউএল ব্যাকরণ বা এর মতো কোনও কিছুর লিঙ্ক সরবরাহ করতে পারেন? আমি এটি বুঝতে পেরেছি এবং আপনার সাথে একমত আছি তবে ডকুমেন্টেশন, ব্যাকরণ ইত্যাদির সাথে আনুষ্ঠানিক লিঙ্ক থাকা ভাল হবে বেস্টরেগার্ডস, রইমব্যাক
রায়মব্যাক রাখিমব্যাক

13

না, এসকিউএল কোয়েরিতে আপনি যখনই অবৈধ ডেটা ইন্টারপোল্ট করবেন তখনও এসকিউএল ইঞ্জেকশনের ঝুঁকি রয়েছে।

অনুসন্ধানের পরামিতিগুলি এসকিউএল সিনট্যাক্স থেকে আক্ষরিক মানগুলি পৃথক করে এই ঝুঁকি এড়াতে সহায়তা করে।

'SELECT * FROM mytable WHERE colname = ?'

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

'SELECT * FROM ' + @tablename + ' WHERE colname IN (' + @comma_list + ')'
' ORDER BY ' + @colname'

আপনি সঞ্চিত পদ্ধতি ব্যবহার করছেন বা সরাসরি অ্যাপ্লিকেশন কোড থেকে ডায়নামিক এসকিউএল কোয়েরি কার্যকর করছেন কিনা তা বিবেচ্য নয়। ঝুঁকি এখনও আছে।

এই ক্ষেত্রে প্রতিকারগুলি হ'ল প্রয়োজন অনুসারে FIEO নিয়োগ করা :

  • ফিল্টার ইনপুট: বৈধ পূর্ণসংখ্যার, টেবিলের নামগুলি, কলামের নাম ইত্যাদির মতো ডেটা দেখতে হবে তা যাচাইয়ের আগে যাচাই করুন।

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


12

"প্যারামিটারাইজড ক্যোয়ারী" এর সংজ্ঞা সম্পর্কে এই থ্রেডে কিছু বিভ্রান্তি রয়েছে বলে মনে হচ্ছে।

  • এসকিউএল যেমন কোনও সঞ্চিত সংগ্রহ যা পরামিতিগুলি গ্রহণ করে।
  • এসকিউএল যা DBMS পরামিতি সংগ্রহ ব্যবহার করে ডাকা হয়।

পূর্বের সংজ্ঞা দেওয়া, লিঙ্কগুলির মধ্যে অনেকগুলি কাজের আক্রমণ দেখায়।

তবে "স্বাভাবিক" সংজ্ঞাটি হ'ল পরেরটি। সেই সংজ্ঞাটি দিয়েছি, আমি কোনও এসকিউএল ইঞ্জেকশন আক্রমণ ব্যবহার করব না তা জানি না। এর অর্থ এই নয় যে একটি নেই, তবে আমার এখনও তা দেখা যায়নি।

মন্তব্যগুলি থেকে, আমি নিজেকে যথেষ্ট পরিষ্কারভাবে প্রকাশ করছি না, তাই এখানে একটি উদাহরণ যা আশাবাদী আরও পরিষ্কার হবে:

এই পদ্ধতিরটি এসকিউএল ইঞ্জেকশনের জন্য উন্মুক্ত

exec dbo.MyStoredProc 'DodgyText'

এই পদ্ধতিটি এসকিউএল ইঞ্জেকশনটির জন্য উন্মুক্ত নয়

using (SqlCommand cmd = new SqlCommand("dbo.MyStoredProc", testConnection))
{
    cmd.CommandType = CommandType.StoredProcedure;
    SqlParameter newParam = new SqlParameter(paramName, SqlDbType.Varchar);
    newParam.Value = "DodgyText";
    .....
    cmd.Parameters.Add(newParam);
    .....
    cmd.ExecuteNonQuery();
}

প্যারামিটারগুলি গ্রহণ করে এমন কোনও পদ্ধতির বিপরীতে আপনি ডিবিএমএস পরামিতি সংগ্রহের দ্বারা আপনার কী বোঝানো উচিত তা কি আপনি স্পষ্ট করে বলতে পারেন?
রুন গ্রিমস্টাড

রুন, এই লিঙ্কটির "টাইপ-সেফ এসকিউএল প্যারামিটারগুলি ব্যবহার করুন" বিভাগটি পড়ুন: এমএসডিএন.মাইক্রোসফটকম /en-us/library/ms161953.aspx
HTTP 410

আমার প্রতিক্রিয়াটি ছিল রুনের আসল প্রশ্নের, আপডেটটি সম্পাদনা করার আগে।
মাইকিকিড্ডার

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

এটি বাধ্যতামূলক যা পার্থক্য তৈরি করে। আপনি যদি সরাসরি পরামিতি সহ কোনও সঞ্চিত প্রোকে কল করেন তবে কোনও ইনপুট ফিল্টারিং করা হয় না। আপনি যদি .NET- এ স্কেলকম্যান্ড পরামিতি সংগ্রহ ব্যবহার করে (উদাহরণস্বরূপ) দ্বারা আবদ্ধ হন তবে সমস্ত পরামিতি ফিল্টার করে সরল পাঠ হিসাবে বিবেচিত হবে।
এইচটিটিপি 410

10

ডায়ামিক ক্যোয়ারী তৈরি করতে ব্যবহৃত স্ট্রিং টাইপের (বর্ণের, এনভারচার, ইত্যাদি) কোনও স্ক্যুয়াল প্যারামিটার এখনও দুর্বল

অন্যথায় প্যারামিটার ধরণের রূপান্তর (উদাহরণস্বরূপ int, দশমিক, তারিখ, ইত্যাদি) প্যারামিটারের মাধ্যমে sql ইনজেক্ট করার কোনও প্রচেষ্টা বাদ দিতে হবে

সম্পাদনা: একটি উদাহরণ, যেখানে প্যারামিটার @ পি 1 একটি টেবিলের নাম হতে পারে

create procedure dbo.uspBeAfraidBeVeryAfraid ( @p1 varchar(64) ) 
AS
    SET NOCOUNT ON
    declare @sql varchar(512)
    set @sql = 'select * from ' + @p1
    exec(@sql)
GO

@ পি 1 যদি একটি ড্রপ-ডাউন তালিকা থেকে নির্বাচিত হয় তবে এটি সম্ভাব্য স্কয়ার-ইনজেকশন আক্রমণ ভেক্টর;

যদি @ পি 1 ব্যবহারকারীর হস্তক্ষেপের দক্ষতার সাথে প্রোগ্রামগতভাবে ডাব্লু / আউট তৈরি করা হয় তবে এটি কোনও সম্ভাব্য স্ক্যালো-ইনজেকশন আক্রমণ ভেক্টর নয়


না; পুরো বিষয়টি হ'ল ডিবিএমএস-এ দেওয়া স্ট্রিংটি এসকিউএল স্টেটমেন্টের অংশ নয়। সুতরাং, স্ট্রিংয়ের মান এসকিউএল এর ব্যাখ্যার সাথে কোনও পার্থক্য করে না - কেবল এসকিউএল দ্বারা বর্ণিত মানগুলিতে।
জোনাথন লেফলার

আমি পরামিতি পাশাপাশি দেখতে। তাদের এই সমস্যা রোধ করার কথা রয়েছে।
রুন গ্রিমস্টাড

4
স্টিভেন ঠিক আছে যদি উদাহরণস্বরূপ আপনি একটি স্পিতে স্ট্রিং দিয়ে যাচ্ছেন যা এটি sp_executeSql (sql সার্ভার) এর মতো কিছু চালাতে ব্যবহার করে তবে আপনার এখনও একটি স্কিল ইঞ্জেকশন ঝুঁকি রয়েছে।
অ্যালেক্সম্যাক

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

@ স্টিভেন: সম্ভবত 'প্যারামিটার' শব্দটি প্রায়শই একবার ওভারলোড হয়ে গেছে। : ডি
জোনাথন লেফলার

6

একটি বাফার ওভারফ্লো এসকিউএল ইঞ্জেকশন নয়।

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


2

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


সুতরাং এখানে পাঠটি হ'ল যদি আপনার অবশ্যই গতিশীল স্কয়ার ব্যবহার করা হয় তবে কেবলমাত্র একটি সঞ্চিত পদ্ধতির অভ্যন্তরে এটি করুন। +1 ভাল পরামর্শ!
স্টিভেন এ লো লো

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

এখানে পাঠটি কখনই গতিশীল এসকিউএল ব্যবহার করা নয়
এইচএলজিইএম

@ এইচএলজিইএম - ডান এবং অটোমোবাইলগুলি ট্র্যাফিক দুর্ঘটনার সাথে জড়িত, তাই আমাদের কখনই অটোমোবাইল ব্যবহার করা উচিত নয়।
বিল কারভিন

স্টোরিক এসকিউএল স্টোরিক এসকিউএল এর মতো নয় যা স্টোর স্টক মালিকের অনুমতি নিয়ে চলে a এটি একটি গুরুত্বপূর্ণ পার্থক্য।
এইচটিপি 410

1

ওভারফ্লো / ছাঁটাইয়ের মাধ্যমে কোনও সঞ্চিত প্রকট বিশেষ ধরণের এসকিউএল ইনজেকশনের পক্ষে ঝুঁকির মধ্যে ফেলা সম্ভব, দেখুন: ডেটা ট্র্যাঙ্কেশন দ্বারা ইনজেকশন সক্ষম করা হয়েছে এখানে:

http://msdn.microsoft.com/en-us/library/ms161953.aspx


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

1

কেবল মনে রাখবেন যে প্যারামিটারগুলির সাহায্যে আপনি স্ট্রিং সহজেই সঞ্চয় করতে পারেন, বা আপনার কোনও নীতি না থাকলে ব্যবহারকারীর নাম বলতে পারেন, "); টেবিল ব্যবহারকারীদের ফেলে দিন; -"

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


1

উদাহরণস্বরূপ আপনি গতিশীল এসকিএল চালাতে পারেন

DECLARE @SQL NVARCHAR(4000);
DECLARE @ParameterDefinition NVARCHAR(4000);

SELECT  @ParameterDefinition = '@date varchar(10)'

SET @SQL='Select CAST(@date AS DATETIME) Date'

EXEC sp_executeSQL @SQL,@ParameterDefinition,@date='04/15/2011'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.