সঞ্চিত পদ্ধতিগুলি কি এসকিউএল ইঞ্জেকশনটিকে প্রতিরোধ করে?


83

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

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


4
অদ্ভুতভাবে, এখানে শীর্ষ উত্তরগুলি বেশিরভাগই ওটি এসকিউএল সার্ভারের সাথে লেনদেন করে থাকে যখন প্রশ্ন পোস্টগ্রিজ সম্পর্কে । পোস্টগ্রিসের জন্য এখানে সম্পর্কিত উত্তর রয়েছে: dba.stackexchange.com/questions/49699/… । আরও কয়েকজন রয়েছেন, অনুসন্ধানের চেষ্টা করুন: dba.stackexchange.com/…
এরউইন ব্র্যান্ডসেটেটার

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

@ ইয়পারক्यूबᵀᴹ: সময় পেলে আমি এখানে একটি উত্তর যুক্ত করব। ইতিমধ্যে আমি আরও স্পষ্ট এবং বিস্তৃততে dba.stackexchange.com/questions/49699/… আপডেট করেছি
এরউইন ব্র্যান্ডসেটেটার

উত্তর:


71

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

এই স্কয়ার সার্ভার কোড:

CREATE PROCEDURE [dbo].[sp_colunmName2]   
    @columnName as nvarchar(30),
    @type as nvarchar(30), 
    @searchText as nvarchar(30)           
AS
BEGIN
    DECLARE @SQLStatement NVARCHAR(4000)
    BEGIN
        SELECT @SQLStatement = 'select * from Stations where ' 
            + @columnName + ' ' + @type + ' ' + '''' + @searchText + '''' 
        EXEC(@SQLStatement)
    END      
END
GO

পোস্টগ্রিসের সমান সমান:

CREATE or replace FUNCTION public.sp_colunmName2 (
    columnName  varchar(30),
    type varchar(30), 
    searchText  varchar(30) ) RETURNS SETOF stations LANGUAGE plpgsql            
AS
$$
DECLARE SQLStatement VARCHAR(4000);
BEGIN
    SQLStatement = 'select * from Stations where ' 
            || columnName || ' ' || type || ' ' || ''''|| searchText || '''';
    RETURN QUERY EXECUTE  SQLStatement;
END
$$;

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

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


46

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

সুতরাং, আমরা পরিস্থিতি পেতে:

ব্যবহারকারীর ইনপুট = getFromH HTML # "রবার্ট ') ড্রপ টেবিলের শিক্ষার্থী; -"

ক্যোয়ারী = "ছাত্র নির্বাচন করুন যেখানে ছাত্র নাম =" + ব্যবহারকারীর ইনপুট

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

সঞ্চিত পদ্ধতিতে, বেশিরভাগ ডিবিতে (এবং প্রোগ্রামগুলিতে, ভুলবেন না যে প্রাক্পম্পাইল্ড ক্যোয়ারীগুলি সঞ্চিত প্রক্রিয়া হিসাবে গণনা করা হয়) নীচের মত দেখাচ্ছে:

 

সঞ্চিত সংগ্রহশালী ফু তৈরি করুন (
যেখানে শিক্ষার্থীর নাম =: 1 সেখানে শিক্ষার্থী নির্বাচন করুন
);

তারপরে, যখন প্রোগ্রামটি অ্যাক্সেসের ইচ্ছা করে, এটি কল করে foo(userInput)এবং আনন্দের সাথে ফলাফলটি পুনরুদ্ধার করে।

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

আপনি এসকিউএল-ইনজেকশন সম্পর্কে আরও পড়তে পারেন:


29

হ্যাঁ, কিছুটা হলেও
একা সঞ্চিত পদ্ধতিগুলি এসকিউএল ইঞ্জেকশনটিকে আটকাবে না।

আমাকে OWASP থেকে এসকিউএল ইঞ্জেকশন সম্পর্কে প্রথমে উদ্ধৃতি দিন

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

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

জেফ Attwood ব্যাখ্যা "এ SQL concatenating পরিণতি আমাকে স্থিতিমাপ এসকিউএল দাও, বা আমাকে মৃত্যুর দিতে "

নিম্নলিখিতটি আকর্ষণীয় কার্টুন যা আমার মনে আসে যখনই আমি এসকিউএল ইঞ্জেকশন শুনি বিকল্প পাঠ আমি মনে করি আপনি পয়েন্টটি পেয়েছেন :-)

কটাক্ষপাত আছে এসকিউএল ইনজেকশন প্রতিরোধ চিট শিট , প্রতিরোধ পদ্ধতি সুন্দরভাবে ব্যাখ্যা করা আছে ...


12

স্ট্রিং কনটেনটেশন এসকিউএল ইঞ্জেকশনের কারণ। এটি প্যারামিট্রেশন ব্যবহার এড়ানো হয়।

সঞ্চিত পদ্ধতিগুলি যখন আপনি সম্মিলিত হন তখন অবৈধ সিনট্যাক্স প্রয়োগ করে সুরক্ষার একটি অতিরিক্ত স্তর যুক্ত করে, তবে আপনি যদি সেগুলিতে গতিশীল এসকিউএল ব্যবহার করেন তবে বলুন "নিরাপদ" নয়।

সুতরাং, আপনার উপরের কোডগুলি এই স্ট্রিংগুলির সংমিশ্রনের কারণে ঘটে

  • exec sp_GetUser '
  • x' AND 1=(SELECT COUNT(*) FROM Client); --
  • ' , '
  • monkey
  • '

ভাগ্যক্রমে এটি অবৈধ সিনট্যাক্স দেয়

প্যারামেট্রিসিংয়ে দিবে

exec sp_GetUser 'x'' AND 1=(SELECT COUNT(*) FROM Client); --' , 'monkey'

এর অর্থ

  • @UserName = x' AND 1=(SELECT COUNT(*) FROM Client); --
  • @Password = monkey

এখন, উপরের কোডটিতে আপনি কোনও সারি পাবেন না কারণ আমি ধরে নিয়েছি আপনার কোনও ব্যবহারকারী নেই x' AND 1=(SELECT COUNT(*) FROM Client); --

যদি সঞ্চিত প্রকোপটি এর মতো দেখায় (কনটেনেটেড ডায়নামিক এসকিউএল ব্যবহার করে ), তবে আপনার প্যারামিমেট্রিসড স্টোরেড প্রোক কলটি এখনও এসকিউএল ইঞ্জেকশনের অনুমতি দেবে

...
SET @sql = 'SELECT userName from users where userName = ''' + 
               @UserName + 
               ''' and userPass = ''' +
               @Password +
               ''''
EXEC (@sql)
....

সুতরাং, প্রদর্শিত হিসাবে, স্ট্রিং সংক্ষেপণ এসকিউএল ইনজেকশনের প্রধান শত্রু

সঞ্চিত পদ্ধতিগুলি এনক্যাপসুলেশন, লেনদেন পরিচালনা, হ্রাস অনুমতিগুলি ইত্যাদি যোগ করে তবে এসকিউএল ইঞ্জেকশনের জন্য তাদের এখনও আপত্তি করা যায়।

প্যারামিটারাইজেশন সম্পর্কে আরও তথ্যের জন্য আপনি স্ট্যাক ওভারফ্লোতে দেখতে পারেন


10

"এসকিউএল ইনজেকশন আক্রমণ যখন ঘটতে ব্যবহারকারীর ইনপুট উৎপন্ন এনকোড করা আছে। কিছু ডেটা ব্যবহারকারী তার ক্যোয়ারী দিয়ে পাঠায়, অর্থাৎ মান সাধারণত, ব্যবহারকারীর ইনপুট করা হয় $_GET, $_POST, $_COOKIE, $_REQUEST, অথবা $_SERVERঅ্যারে। যাইহোক, ব্যবহারকারীর ইনপুট অন্যান্য বিভিন্ন থেকে আসতে পারে উত্স, যেমন সকেট, দূরবর্তী ওয়েবসাইট, ফাইল ইত্যাদি .. সুতরাং, আপনার প্রকৃতপক্ষে ধ্রুবকগুলি (যেমন 'foobar') বাদে সবকিছুই ব্যবহারকারীর ইনপুট হিসাবে বিবেচনা করা উচিত ""

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



ইউটিউব থেকে


উইকিপিডিয়া থেকে


OWASP থেকে


পিএইচপি ম্যানুয়াল থেকে


মাইক্রোসফ্ট এবং ওরাকল থেকে


স্ট্যাক ওভারফ্লো


এসকিউএল ইঞ্জেকশন স্ক্যানার


2

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

CREATE OR REPLACE FUNCTION my_func (
  IN in_user_id INT 
)
[snip]
  SELECT user_id, name, address FROM my_table WHERE user_id = in_user_id; --BAM! SQL INJECTION IMMUNE!!
[snip]

এটাই! স্ট্রিং কনটেনটেশন (অর্থাত্ ডাইনামিক এসকিউএল) এর মাধ্যমে কোয়েরি গঠনের সময় সমস্যাটি কেবল তখনই আসে এবং এমনকি সেই ক্ষেত্রে আপনি বাঁধতে সক্ষম হতে পারেন! (ডাটাবেসের উপর নির্ভর করে))

আপনার গতিশীল ক্যোয়ারিতে কীভাবে এসকিউএল ইঞ্জেকশন এড়ানো যায়:

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

পদক্ষেপ 2) আপনার নির্দিষ্ট আরডিবিএমএসের জন্য ভেরিয়েবল সেট করার সঠিক উপায়ে গবেষণা করুন। উদাহরণস্বরূপ ওরাকল আপনাকে নিম্নলিখিতটি করতে দেয় (তাদের ডক্স থেকে উদ্ধৃতি):

sql_stmt := 'UPDATE employees SET salary = salary + :1 WHERE ' 
           || v_column || ' = :2';
EXECUTE IMMEDIATE sql_stmt USING amount, column_value; --INJECTION IMMUNE!!

এখানে আপনি এখনও ইনপুট কনকনটেটিং করছেন না। আপনি নিরাপদে বাঁধাই করছেন! হুররে!

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

sql_stmt := 'SELECT salary FROM employees WHERE name = ' || quote_literal(in_name);

এইভাবে যদি ইন_নামটি '[স্নিপ]' বা 1 = 1 '("বা 1 = 1" অংশের মতো কিছু ছদ্মবেশী হয় তবে ব্যবহারকারীকে তার বেতন না দেখার মঞ্জুরি দিয়ে সমস্ত সারি নির্বাচন করুন!), তারপর উদ্ধৃতি_লাইটারাল আপনার বাট সংরক্ষণ করে ফলাফল তৈরি স্ট্রিং তৈরি:

SELECT salary FROM employees WHERE name = '[snip] or 1=1'

কোনও ফলাফল পাওয়া যাবে না (যদি না আপনার সত্যিকারের অদ্ভুত নাম সহ কিছু কর্মচারী থাকে))

এটাই এর টুকরো কথা! এখন আমাকে এসকিউএল ইঞ্জেকশন সম্পর্কিত ওরাকল গুরু টম কিটের একটি ক্লাসিক পোস্টের লিঙ্কটি রেখেই পয়েন্টটি বাড়িটি চালানোর জন্য: লিঙ্কি


উল্লেখ করতে ভুলবেন না quote_ident()- তবে সাধারণভাবে ইনজেকশন-প্রুফ ডায়নামিক এসকিউএল লেখার সহজতম উপায় হ'ল সনাক্তকারী এবং আক্ষরিক জন্য format()স্থানধারক ব্যবহার এবং ব্যবহার করা । এসকিউএল সমমানের সংস্করণ এবং ফাংশনগুলির তুলনায় অনেক বেশি পঠনযোগ্য%I%L||quote_....()
a_horse_with_no_name
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.