টেবিলগুলিতে যোগদান করার সময়, আমি জেন্ড ফ্রেমওয়ার্কের এসকিউএল মডেলগুলি ব্যবহার করি। উদাহরণস্বরূপ আমি আমার আসল কোডটি পরিবর্তন করেছি, তবে আমি মনে করি আপনি পয়েন্টটি পাবেন:
$this->getSelect()->join(
array('sections' => $sectionsTableName),
'main_table.banner_id = pages.banner_id',
array()
)
->where("sections.section= '$section' OR sections.section = '0' OR (sections.section = '6' AND ? LIKE main_table.url)",$url)
->group('main_table.banner_id');
পৃষ্ঠাটি এজাক্স দিয়ে লোড করা হয়েছে এবং $ বিভাগের প্যারামিটারটি জিইটি প্যারামিটার হিসাবে প্রেরণ করা হয় (www.example.com/controllerName/index/display/3?paremeter1=example§ion=www.example2.com
)।
কেউ যদি এরকম কিছু সম্পাদন করে তবে এখানে সমস্যাটি রয়েছে:
www.example.com/controllerName/index/display/3?paremeter1=example&url=(SELECT 3630 FROM(SELECT COUNT(*),CONCAT(0x7170786a71,(SELECT (ELT(3630=3630,1))),0x717a716b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)
এইভাবে ব্যবহারকারী পুরো ডাটাবেস ডাম্প করতে পারেন। ডেটা প্রদর্শিত হবে না, তবে এখনও এসকিউএল ডাম্প সঞ্চালন করবে যা স্কিল ওভারলোডের কারণ হতে পারে।
প্রশ্নাবলী:
- এই জাতীয় পরিস্থিতি রোধ করার সবচেয়ে ভাল উপায় কী?
- এখন আমি আগের গ্রাহকদের জন্য উদ্বিগ্ন। এই কোডটি দিয়ে কি আরও ঝুঁকিপূর্ণ পদক্ষেপ করা সম্ভব, যেমন বিলম্বিত বা টেবিল পরিবর্তন করা? আমি অনুমান করি না কারণ আপনি সাবলেটের ভিতরে SELECT ব্যতীত অন্য কোনও বিবৃতি রাখতে পারবেন না সুতরাং মুছুন SQL সিনট্যাক্স ত্রুটি তৈরি করে। আমি কি সঠিক?
আপডেট: আমার উদাহরণটি এসকিউএল ইনজেকশনের সঠিক চিত্র নয় কারণ সেখানে 'সাইন আউন্ড। বিভাগ রয়েছে এবং সুতরাং ইঞ্জেকশন তৈরি করা সম্ভব হবে না। যাইহোক এটি পূর্ণসংখ্যার মান আশা এবং যখন আপনি পূর্ণসংখ্যার ইনপুট ফিল্টার করবেন না তখন এটি সম্ভব হবে। নীচে আমার মন্তব্য দেখুন।
'
সাইন এর আগে সর্বদা (
সাইন থাকে এবং এইভাবে (SELECT
বা অন্য যে কোনও কিছুই স্ট্রিংয়ের মতো হবে এবং কার্যকর নয়। যখন ক্ষেত্রটি পূর্ণসংখ্যা হয়, তারপরে '
প্রয়োজন হয় না এবং এটি এরকম দৃশ্যকে সম্ভব করে তোলে। তবে পূর্ণসংখ্যার সাথে সর্বদা ফিল্টার করা উচিত intval()
যাতে এটি ইস্যু হয় না।
'
? তাহলে ' AND (SELECT ...) '
? যাইহোক, আমি মনে করি না জেন্ড এটি উদ্ধৃত করছে না ... এবং আপনি যদি বাইন্ডিং ব্যবহার করেন তবে PDO এটি পরিচালনা করবে। এই জাতীয় স্টিং "sections.section= '$section'"
$db = Mage::getSingleton('core/resource')->getConnection('core_read');
এবং$db->quote()
এমনকি আপনার ক্ষেত্রে দেখুন$db->quoteInto
। যদি$this
একটি সম্পদ হয়, তাহলে আপনি কাজ করতে পারে:$this->getConnection('core_read')->quoteInto()
যদি এটি একটি সংগ্রহ তুমি করতে পারে:$this->getResource()->getConnection('core_read')->quoteInto()
। এই লাইন বরাবর। যদি এটি আপনাকে আপনার লক্ষ্যের দিকে পরিচালিত করতে সহায়তা করে।