ইনজেকশন আক্রমণ থেকে রক্ষা করার জন্য আমরা কি এখনও কোটেম ব্যবহার করব?


9

আমি আজ একটি পুরাতন সঞ্চিত পদ্ধতিটি দেখছিলাম এবং লক্ষ্য করেছি এটি quotenameইনপুট পরামিতিগুলিতে ব্যবহার করছে। এটি কী করে তা আবিষ্কার করার জন্য কিছু খনন করার পরে আমি এই সাইট জুড়ে এসেছি । আমি এখন বুঝতে পারি এটি কী করে এবং কীভাবে এটি ব্যবহার করতে হয় তবে সাইটটি বলে যে এটি এসকিউএল ইনজেকশন আক্রমণ থেকে প্রশমন হিসাবে ব্যবহৃত হয়। আমি যখন অ্যাপ্লিকেশনগুলি ডেটাবেসকে সরাসরি জিজ্ঞাসা করে, এসপ নেট ব্যবহার করে বিকাশ করতাম, তখন আমি ADO.NET পরামিতিগুলিকে আক্ষরিক মান হিসাবে ব্যবহারকারীর ইনপুটটি পাস করতে ব্যবহার করতাম এবং আমার সঞ্চিত পদ্ধতিতে এটির সুরক্ষার জন্য কখনই সত্যই চিন্তিত হত না।

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

কোডটি আমাকে এই চিন্তার ধরণে পেয়েছে ( @parm1এটি একটি ব্যবহারকারী ইনপুট প্যারামিটার):

'SELECT project [Project], project_desc [Description], 
        customer [Customer], cpnyid [Company]
FROM PJPROJ (nolock)
where project like ' + quotename(@parm1,'''') + '

উত্তর:


17

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

ফাংশনটি কেবলমাত্র বস্তুর নামগুলির জন্য উপযুক্ত (যেমন টেবিল, কলাম, ডাটাবেসের নাম) তবে।

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

এই বিষয়ে সুনির্দিষ্ট নিবন্ধটি এখনও ডাইনামিক এসকিউএল এর অভিশাপ এবং আশীর্বাদ


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

অতিরিক্তভাবে এটি এসকিউএল ইঞ্জেকশন সম্ভাবনাগুলি ছেড়ে দিতে পারে যদি স্ট্রিংটিতে স্ট্যান্ডার্ড অ্যাডোস্ট্রোফের পরিবর্তে ইউ + 02 বিসি থাকে এবং তারপরে স্যানিটেশন করার পরে স্ট্রিংটি ভারচারে বরাদ্দ করা হয় ( যেখানে এটি নিঃশব্দে একটি নিয়মিত এস্ট্রোফিতে রূপান্তরিত হতে পারে )

এটি করার সঠিক উপায়টি হল ক্যোয়ারিকে প্যারামিটারাইজড রেখে দেওয়া। এবং তারপরে @parm1মানটি পাস করুনsys.sp_executesql

DECLARE @Sql NVARCHAR(MAX);

SET @Sql = '
SELECT project      [Project],
       project_desc [Description],
       customer     [Customer],
       cpnyid       [Company]
FROM   PJPROJ (nolock)
WHERE  project LIKE @parm1 
';

EXEC sys.sp_executesql
  @Sql,
  N'@parm1 varchar(100)',
  @parm1 = 'foobar%'; 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.