"ববি টেবিলগুলি" এক্সকেসিডি কমিকের এসকিউএল ইঞ্জেকশনটি কীভাবে কাজ করে?


1092

শুধু তাকানো:

এক্সকেসিডি স্ট্রিপ (সূত্র: https://xkcd.com/327/ )

এই এসকিউএল কী করে:

Robert'); DROP TABLE STUDENTS; --

আমি উভয়ই জানি 'এবং --মন্তব্যের জন্যও, তবে DROPএটি একই লাইনের অংশ হওয়ায় শব্দটিও তেমনভাবে মন্তব্য করা যায় না?


16
আপনি যদি স্ট্যাক ওভারফ্লো পডকাস্ট # 31 (27 নভেম্বর, 2008) শুনেন তবে তারা আসলে এটি নিয়ে আলোচনা করে।
ইবিগ্রিন

93
মাইএসকিউএল-তে মন্তব্য করার' জন্য নয় । এটি থাকলেও এর আগে কোনও স্থান নেই তাই এটি কেবল তার আগে থাকা স্ট্রিংটিই শেষ করতে পারে।
অরবিট

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

13
আমি বিশ্বাস করি এই লিঙ্কটি এখানে অবশ্যই রেকর্ড করা উচিত: ববি
'দ্য

2
beta.companieshouse.gov.uk/company/10542519 নামের পরামর্শের জন্য নিবন্ধকরণ; ট্যাবলে ড্রপ "সংস্থাগুলি"; - LTD
অ্যালেক্স ডুপুয়

উত্তর:


1115

এটি ছাত্রদের টেবিলটি ফেলে দেয়।

স্কুলের প্রোগ্রামের আসল কোডটি সম্ভবত এর মতো দেখাচ্ছে

q = "INSERT INTO Students VALUES ('" + FNMName.Text + "', '" + LName.Text + "')";

এই প্রশ্নের সাথে মধ্যে পাঠ্য ইনপুট যোগ করার জন্য সরল পথ, এবং খুব খারাপ , আপনি দেখতে হবে।

প্রথম নাম থেকে মানগুলির পরে, মধ্য নামের পাঠ্যবাক্স এফএনএমনেম.টেক্সট (যা হয় Robert'); DROP TABLE STUDENTS; --) এবং শেষ নাম পাঠ্যবাক্স এলএনমে.টেক্সট (আসুন আমরা এটি কল করি Derper) বাকী ক্যোয়ারী দিয়ে সংশ্লেষিত হয়, ফলস্বরূপ এখন ফলাফলটি দুটি প্রশ্নের দ্বারা পৃথক করা হয়েছে স্টেটমেন্ট টার্মিনেটর (সেমিকোলন)। দ্বিতীয় ক্যোয়ারীটি প্রথমটিতে ইনজেকশন করা হয়েছে । কোড যখন ডাটাবেসের বিরুদ্ধে এই ক্যোয়ারী চালায়, তখন এটি এর মতো দেখাবে

INSERT INTO Students VALUES ('Robert'); DROP TABLE Students; --', 'Derper')

যা সাধারণ ভাষায় মোটামুটি দুটি প্রশ্নের অনুবাদ করে:

'রবার্ট' এর নামের মান সহ শিক্ষার্থীদের টেবিলে একটি নতুন রেকর্ড যুক্ত করুন

এবং

শিক্ষার্থীদের টেবিলটি মুছুন

দ্বিতীয় ক্যোয়ারীর সমস্ত কিছুই মন্তব্য হিসাবে চিহ্নিত হয়েছে : --', 'Derper')

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

সম্পাদিত আবার অনুযায়ী dan04 এর বিচক্ষণ মন্তব্য


3
মিম, আর্গুমেন্টের চারপাশে প্রথম বন্ধনী যুক্ত WHERE বরং অস্বাভাবিক, তবে কমপক্ষে এটি একটি বাক্য গঠন ত্রুটি এড়ানো ...
...-)

60
@ ফিলিহো: যদি মূল বক্তব্যটি একটি হয় তবে প্রথম বন্ধনীটি আরও অর্থপূর্ণ INSERTহতে পারে। এটিও ব্যাখ্যা করবে যে ডাটাবেস সংযোগটি কেবল পঠন মোডে নেই।
dan04

3
@ ডান04 যেমন ব্যাখ্যা করেছে, প্রথমটির সাথে প্রথমটি আরও বেশি অর্থবোধ করে INSERT। পিছনের দিকে চিন্তা করে, SELECTটেবিলের লিটল ববি টেবিলগুলির সন্নিবেশটি ইতিমধ্যে টেবিলটি নামিয়ে ফেলবে কারণ এটি কোনওভাবেই চলবে না।
ypercubeᵀᴹ

10
আসলে, এই উদাহরণে প্রথম ক্যোয়ারী ("একটি নতুন রেকর্ড যুক্ত করুন ...") ব্যর্থ হবে কারণ Studentsকেবলমাত্র একটি কলামের চেয়ে বেশি (মূল / সঠিক বিবৃতি দুটি কলাম সরবরাহ করেছে) ects এটি বলেছিল, দ্বিতীয় কলামের উপস্থিতি কেন মন্তব্য প্রয়োজন তা বোঝাতে সহায়ক; এবং যেহেতু কেউ ববির নাম পরিবর্তন করতে পারে না, তাই পাদটীকা হিসাবে এই পর্যবেক্ষণের চেয়ে কিছুটা ছাড়াই সম্ভবত সেরা best
উদ্বিগ্ন

7
এক্সবিসিডি প্রতি ব্যাখ্যা করে ববির শেষ নাম - বা কমপক্ষে তার মায়ের নাম রবার্টস । যদিও আমি নিশ্চিত নই যে এটিকে সংশোধন করা উত্তরের স্বচ্ছতার উন্নতি করবে, যদিও।
ডাব্লুবিটি

611

ধরা যাক নামটি একটি চলক $Name,।

তারপরে আপনি এই ক্যোয়ারীটি চালান :

INSERT INTO Students VALUES ( '$Name' )

কোডটি ভুলক্রমে ব্যবহারকারীকে ভেরিয়েবল হিসাবে সরবরাহ করা কিছু রেখে দিচ্ছে।

আপনি এসকিউএল হতে চেয়েছিলেন :

শিক্ষার্থীদের মূল্য অন্তর্ভুক্ত করুন (' Robert Tables`)

তবে একজন চালাক ব্যবহারকারী তাদের যা কিছু সরবরাহ করতে পারেন:

শিক্ষার্থীদের মূল্য অন্তর্ভুক্ত করুন (' Robert'); DROP TABLE Students; --')

আপনি যা পান তা হ'ল:

INSERT INTO Students VALUES ( 'Robert' );  DROP TABLE STUDENTS; --' )

--শুধুমাত্র লাইন বাকি মন্তব্য।


87
সর্বোচ্চ ভোটদানের পরে এটি আরও ভাল, কারণ এটি সমাপ্ত বন্ধনীকে ব্যাখ্যা করে।
টিম বাথ

1
যাইহোক, কমিকসে স্কুল পরিচালকের পক্ষে সচেতন হওয়ার কোনও উপায় বা এক্সএসএস নেই যেহেতু শিক্ষার্থীর টেবিলটি মুছে ফেলা হয়েছে, তিনি জানেন না যে এটি কে করেছে।
xryl669

@ xryl669 লগগুলি এই জাতীয় পরিস্থিতিতে খুব সহায়ক ... কখনও কখনও সমস্ত অনুসন্ধানগুলি লগ হয়, এবং কখনও কখনও অন্যান্য লগ করা তথ্য আপনাকে অপরাধীকে কমাতে সহায়তা করতে পারে।
আনমাঞ্জা

165

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

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

$query="SELECT * FROM users WHERE username='" . $_REQUEST['user'] . "' and (password='".$_REQUEST['pass']."')";
$result=mysql_query($query);

আপনি যদি peterব্যবহারকারীর নাম এবং secretপাসওয়ার্ড হিসাবে সরবরাহ করেন তবে ফলাফলিত এসকিউএল স্ট্রিংটি এর মতো দেখাবে:

SELECT * FROM users WHERE username='peter' and (password='secret')

সবকিছু সুন্দর. এখন কল্পনা করুন আপনি পাসওয়ার্ড হিসাবে এই স্ট্রিং প্রদান:

' OR '1'='1

তারপরে প্রাপ্ত এসকিউএল স্ট্রিংটি হ'ল:

SELECT * FROM users WHERE username='peter' and (password='' OR '1'='1')

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


71

না, 'এসকিউএল-তে কোনও মন্তব্য নয়, তবে একটি ডিলিমিটার।

মা ভেবেছিলেন ডাটাবেস প্রোগ্রামারটি অনুরোধ করে অনুরোধ করেছে:

INSERT INTO 'students' ('first_name', 'last_name') VALUES ('$firstName', '$lastName');

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

সুতরাং যদি ডাটাবেস প্রোগ্রাম $firstNameথাকে Robert'); DROP TABLE students; --তবে ডিবিতে নিম্নলিখিত অনুরোধটি কার্যকর করবে:

INSERT INTO 'students' ('first_name', 'last_name') VALUES ('Robert'); DROP TABLE students; --', 'XKCD');

অর্থাত। এটি সন্নিবেশ বিবৃতিটি শীঘ্রই শেষ করে দেবে, ক্র্যাকার যা-ই হোক না কেন দূষিত কোড কার্যকর করে, তারপরে কোডের বাকী যা কিছু থাকতে পারে তা মন্তব্য করে।

মিম, আমি খুব ধীর, কমলা ব্যান্ডের আমার আগে 8 টি উত্তর দেখতে পেয়েছি ... :-) একটি জনপ্রিয় বিষয়, মনে হচ্ছে এটি।


39

টি এল; ডিআর

- অ্যাপ্লিকেশন ইনপুট গ্রহণ করে, এক্ষেত্রে 'ন্যান্সি', চেষ্টা না করেই
- ইনপুট স্যানিটাইজ করুন, যেমন বিশেষ অক্ষরগুলি এড়িয়ে যাওয়ার মাধ্যমে
স্কুল => ঢোকান এমনটা ছাত্র মূল্যবোধ ( 'ন্যান্সি' );   
সংযুক্ত 0 1  

- এসকিউএল ইঞ্জেকশনটি ঘটে যখন কোনও ডাটাবেস কমান্ডের ইনপুটটি ম্যানিপুলেটেড হয়
- ডাটাবেস সার্ভারকে স্বেচ্ছাসেবী এসকিউএল চালিত করার কারণ দিন
স্কুল => ঢোকান এমনটা ছাত্র মূল্যবোধ ( 'রবার্ট' ); টেবিল ছাত্রদের ড্রপ ; - ');      
সংযুক্ত 0 1  
টেবিল ড্রপ 

- শিক্ষার্থীদের রেকর্ড এখন শেষ - এটি আরও খারাপ হতে পারে!
স্কুল => নির্বাচন করুন * শিক্ষার্থী থেকে ;   
ত্রুটি :   সম্পর্ক "ছাত্র" নেই না অস্তিত্ব
লাইন 1 : শিক্ষার্থী থেকে * নির্বাচন করুন ;   
                      ^

এটি শিক্ষার্থীর টেবিলটি (মুছে ফেলা) করে।

( এই উত্তরের সমস্ত কোড উদাহরণ পোস্টগ্র্রেএসকিউএল 9.1.2 ডাটাবেস সার্ভারে চালিত হয়েছিল ))

কী হচ্ছে তা পরিষ্কার করার জন্য, আসুন একটি সাধারণ টেবিল দিয়ে এটি কেবল নাম ক্ষেত্র সহ চেষ্টা করুন এবং একটি একক সারি যুক্ত করুন:

স্কুল => তৈরি সারণী ছাত্র ( নাম টেক্সট প্রাথমিক চাবিকাঠি ); 
বিজ্ঞপ্তি : তৈরি করুন সারণী / প্রাথমিক চাবিকাঠি হবে তৈরি অন্তর্নিহিত সূচক "students_pkey" জন্য টেবিল "ছাত্র" তৈরি করুন সারণী 
স্কুল => ঢোকান এমনটা ছাত্র মূল্যবোধ ( 'জন' ); সংযুক্ত 0 1             
    
  

আসুন ধরে নেওয়া যাক টেবিলে ডেটা toোকাতে অ্যাপ্লিকেশনটি নিম্নলিখিত এসকিউএল ব্যবহার করে:

ঢোকান এমনটা ছাত্র মূল্যবোধ ( 'FOOBAR' );  

foobarশিক্ষার্থীর আসল নামটি প্রতিস্থাপন করুন । একটি সাধারণ sertোকানো ক্রিয়াকলাপটি এর মতো দেখায়:

- ইনপুট: ন্যান্সি 
স্কুল => ঢোকান এমনটা ছাত্র মূল্যবোধ ( 'ন্যান্সি' ); সংযুক্ত 0 1   
  

যখন আমরা টেবিলটি জিজ্ঞাসা করি তখন আমরা এটি পাই:

স্কুল => নির্বাচন করুন * শিক্ষার্থী থেকে ;   
 নাম
-------
 জন
 ন্যান্সি
( ২ টি সারি ) 

আমরা যখন টেবিলের মধ্যে লিটল ববি টেবিলের নামটি সন্নিবেশ করি তখন কী ঘটে?

- ইনপুট: রবার্ট '); টেবিল ছাত্রদের ড্রপ; - 
স্কুল => ঢোকান এমনটা ছাত্র মূল্যবোধ ( 'রবার্ট' ); টেবিল ছাত্রদের ড্রপ ; - '); সংযোজন 0 1 ড্রপ টেবিল      
  
 

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

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

ফলাফল?

স্কুল => নির্বাচন করুন * শিক্ষার্থী থেকে ; 
ত্রুটি :   সম্পর্ক "ছাত্র" নেই না অস্তিত্ব   
লাইন 1 : শিক্ষার্থী থেকে * নির্বাচন করুন ; ^   
                      

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

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

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


30

বলুন আপনি নির্বাকভাবে এইভাবে একটি ছাত্র তৈরির পদ্ধতি লিখেছিলেন:

void createStudent(String name) {
    database.execute("INSERT INTO students (name) VALUES ('" + name + "')");
}

এবং কেউ নাম প্রবেশ করে Robert'); DROP TABLE STUDENTS; --

ডাটাবেসে যা চালিত হয় তা হ'ল এই ক্যোয়ারী:

INSERT INTO students (name) VALUES ('Robert'); DROP TABLE STUDENTS --')

সেমিকোলন সন্নিবেশ কমান্ডটি শেষ করে আরেকটি শুরু করে; - লাইনের বাকী অংশ সম্পর্কে মন্তব্য করে। ড্রপ টেবিল আদেশটি কার্যকর করা হয়েছে ...

এই কারণেই বাইন্ড পরামিতিগুলি একটি ভাল জিনিস।


26

একটি একক উদ্ধৃতি একটি স্ট্রিংয়ের শুরু এবং শেষ। একটি সেমিকোলন হল একটি বিবৃতি শেষ। সুতরাং তারা যদি এইভাবে কোনও নির্বাচন করে থাকে:

Select *
From Students
Where (Name = '<NameGetsInsertedHere>')

এসকিউএল হয়ে উঠবে:

Select *
From Students
Where (Name = 'Robert'); DROP TABLE STUDENTS; --')
--             ^-------------------------------^

কিছু সিস্টেমে, বিবৃতিটি selectঅনুসরণ করে প্রথমে ছুটে আসবে drop! বার্তাটি হ'ল: আপনার এসকিউএল-এর এম্বেড ভ্যালুগুলি ডান। পরিবর্তে পরামিতি ব্যবহার করুন!


18

');প্রান্ত ক্যোয়ারী, এটা একটি মন্তব্য শুরু হয় না। তারপরে এটি শিক্ষার্থীদের টেবিলটি ফেলে দেয় এবং বাকী ক্যোয়ারির মন্তব্য করে যা কার্যকর করার কথা ছিল।


17

ডাটাবেসের লেখক সম্ভবত একটি করেছেন

sql = "SELECT * FROM STUDENTS WHERE (STUDENT_NAME = '" + student_name + "') AND other stuff";
execute(sql);

যদি ছাত্রের নাম দেওয়া হয় তবে এটি "রবার্ট" নামটি দিয়ে নির্বাচনটি করে এবং তারপরে টেবিলটি ফেলে দেয়। "-" অংশটি প্রদত্ত বাকী ক্যোয়ারির একটি মন্তব্যে পরিবর্তন করে।


এটি আমার প্রথম চিন্তা ছিল, তবে আপনি শেষের বন্ধনীর সাথে একটি বাক্য গঠন ত্রুটি পেয়েছেন, না?
ফিলিহো

3
এ কারণেই একটি রয়েছে - শেষে, বাকী পাঠ্যটি ইঙ্গিত করা একটি মন্তব্য এবং এড়ানো উচিত।

17

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

$sql = "INSERT INTO `Students` (FirstName, LastName) VALUES ('" . $fname . "', '" . $lname . "')";

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

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


16

'এসকিউএল- এর অক্ষরটি স্ট্রিং ধ্রুবকগুলির জন্য ব্যবহৃত হয়। এই ক্ষেত্রে এটি স্ট্রিং ধ্রুবকটি শেষ করার জন্য এবং মন্তব্যের জন্য নয় is


7

এটি এটি কীভাবে কাজ করে: ধরে নেওয়া যাক প্রশাসক শিক্ষার্থীর রেকর্ড খুঁজছেন

Robert'); DROP TABLE STUDENTS; --

অ্যাডমিন অ্যাকাউন্টে এই অ্যাকাউন্ট থেকে সারণী মোছার পক্ষে উচ্চতর সুযোগ রয়েছে high

অনুরোধ থেকে ব্যবহারকারীর নাম পুনরুদ্ধার করার কোডটি

এখন ক্যোয়ারীটি এমন কিছু হবে (শিক্ষার্থীর টেবিলটি অনুসন্ধান করতে)

String query="Select * from student where username='"+student_name+"'";

statement.executeQuery(query); //Rest of the code follows

ফলাফল কোয়েরি হয়ে যায়

Select * from student where username='Robert'); DROP TABLE STUDENTS; --

যেহেতু ব্যবহারকারীর ইনপুটটি স্যানিটাইজ করা হয়নি, তাই উপরের ক্যোয়ারীটি 2 ভাগে ভাগ করা হয়েছে

Select * from student where username='Robert'); 

DROP TABLE STUDENTS; --

ডাবল ড্যাশ (-) ক্যোয়ারির অবশিষ্ট অংশটি কেবল মন্তব্য করবে।

এটি বিপজ্জনক কারণ এটি উপস্থিত থাকলে পাসওয়ার্ড প্রমাণীকরণ বাতিল করতে পারে

প্রথমটি সাধারণ অনুসন্ধান করবে।

যদি অ্যাকাউন্টটিতে পর্যাপ্ত সুযোগ-সুবিধা থাকে তবে দ্বিতীয়টি টেবিলের ছাত্রকে ফেলে দেবে (সাধারণত স্কুল প্রশাসকের অ্যাকাউন্ট এ জাতীয় কোয়েরি চালাবে এবং উপরের সুবিধাগুলি নিয়ে কথা হবে)।


SELECT* FROM sutdents ...- আপনি একটি "এস" ভুলে গেছেন। এই আপনি ড্রপ যা। DROP TABLE STUDENTS;
DevWL

4

এসকিউএল ইঞ্জেকশন করতে আপনার ফর্ম ডেটা ইনপুট করতে হবে না।

এর আগে কেউ এটিকে দেখায়নি আমি আপনার মধ্যে কয়েকজনকে সতর্ক করতে পারি।

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

<a href="/show?id=1">show something</a>

আপনার ইউআরএল দেখতে http://yoursite.com/show?id=1 দেখতে পাবেন

এখন কেউ এই জাতীয় কিছু চেষ্টা করতে পারে

http://yoursite.com/show?id=1;TRUNCATE table_name

আসল সারণীর নামের সাথে টেবিলের নামটি প্রতিস্থাপন করার চেষ্টা করুন। তিনি যদি আপনার টেবিলের নামটি পান তবে তারা আপনার টেবিলটি খালি করে দেবে! (সাধারণ স্ক্রিপ্টের সাহায্যে এই ইউআরএলকে বর্বরোচিত করা খুব সহজ)

আপনার ক্যোয়ারীটি এরকম কিছু দেখাচ্ছে ...

"SELECT * FROM page WHERE id = 4;TRUNCATE page"

পিডিও ব্যবহার করে পিএইচপি দুর্বল কোডের উদাহরণ:

<?php
...
$id = $_GET['id'];

$pdo = new PDO($database_dsn, $database_user, $database_pass);
$query = "SELECT * FROM page WHERE id = {$id}";
$stmt = $pdo->query($query);
$data = $stmt->fetch(); 
/************* You have lost your data!!! :( *************/
...

সমাধান - পিডিও প্রস্তুত () এবং বাইন্ডারাম () পদ্ধতিগুলি ব্যবহার করুন:

<?php
...
$id = $_GET['id'];

$query = 'SELECT * FROM page WHERE id = :idVal';
$stmt = $pdo->prepare($query);
$stmt->bindParam('idVal', $id, PDO::PARAM_INT);
$stmt->execute();
$data = $stmt->fetch();
/************* Your data is safe! :) *************/
...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.