জেন্ড ফ্রেমওয়ার্কের এসকিউএল মডেলগুলি ব্যবহার করার সময় এসকিউএল ইঞ্জেকশনগুলি দুর্বলতা


15

টেবিলগুলিতে যোগদান করার সময়, আমি জেন্ড ফ্রেমওয়ার্কের এসকিউএল মডেলগুলি ব্যবহার করি। উদাহরণস্বরূপ আমি আমার আসল কোডটি পরিবর্তন করেছি, তবে আমি মনে করি আপনি পয়েন্টটি পাবেন:

$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&section=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)

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

প্রশ্নাবলী:

  1. এই জাতীয় পরিস্থিতি রোধ করার সবচেয়ে ভাল উপায় কী?
  2. এখন আমি আগের গ্রাহকদের জন্য উদ্বিগ্ন। এই কোডটি দিয়ে কি আরও ঝুঁকিপূর্ণ পদক্ষেপ করা সম্ভব, যেমন বিলম্বিত বা টেবিল পরিবর্তন করা? আমি অনুমান করি না কারণ আপনি সাবলেটের ভিতরে SELECT ব্যতীত অন্য কোনও বিবৃতি রাখতে পারবেন না সুতরাং মুছুন SQL সিনট্যাক্স ত্রুটি তৈরি করে। আমি কি সঠিক?

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


1
আপনি ব্যবহার করতে পারেন: $db = Mage::getSingleton('core/resource')->getConnection('core_read');এবং $db->quote()এমনকি আপনার ক্ষেত্রে দেখুন $db->quoteInto। যদি $thisএকটি সম্পদ হয়, তাহলে আপনি কাজ করতে পারে: $this->getConnection('core_read')->quoteInto()যদি এটি একটি সংগ্রহ তুমি করতে পারে: $this->getResource()->getConnection('core_read')->quoteInto()। এই লাইন বরাবর। যদি এটি আপনাকে আপনার লক্ষ্যের দিকে পরিচালিত করতে সহায়তা করে।
ছাই

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

আপনি যদি বন্ধ দিয়ে শুরু করেন '? তাহলে ' AND (SELECT ...) '? যাইহোক, আমি মনে করি না জেন্ড এটি উদ্ধৃত করছে না ... এবং আপনি যদি বাইন্ডিং ব্যবহার করেন তবে PDO এটি পরিচালনা করবে। এই জাতীয় স্টিং "sections.section= '$section'"
কনটেটেশনগুলি

@ 7ochem এই ক্ষেত্রে আপনি কি পরামিতি ব্যবহার করে আবদ্ধ করতে হবে? এবং 'হয়ে যাবে'। তবে আপনি যদি পূর্ণসংখ্যার মানটি ব্যবহার করেন, তবে আপনি এটি আবদ্ধ করবেন না যেহেতু আপনি এটি অন্তর্নিহিত () পিএইচপি ফাংশন ব্যবহার করে পরিষ্কার করতে পারবেন এবং 'কিছু 0 হয়ে যাবে
জনিফ্রি

উত্তর:


8

আপনার ইনপুট বৈধ করুন!

যত ভাল এবং যতটুকু পারো।

আপনার বৈধতার জন্য কিছু পরামর্শ:

  1. জিইটি-প্যারামিটারের মাধ্যমে আপনি যে ভেরিয়েবলটি পান তার দৈর্ঘ্য পরীক্ষা করুন। একটি নিকটবর্তী দীর্ঘ স্ট্রিং গ্রহণ করার প্রয়োজন নেই।

  2. একটি ডোমেন নামের জন্য বৈধতা দিন। আপনার প্রত্যাশিত ডোমেন নামগুলির কি ধরণের বিন্যাস রয়েছে? এটি কি সর্বদা www.mydomain.tld? একটি ম্যাচ বা (আরও ভাল) ব্যবহারের জন্য পরীক্ষা করে এমন একটি রেজেক্স তৈরি করুন Zend_Validate_Hostname:

    $validator = new Zend_Validate_Hostname();
    if ($validator->isValid($hostname)) {
        //hostname is valid - continue
    }
  3. শ্বেত তালিকা: আপনি কি জানেন যে কোন ডোমেন নেমগুলি প্রত্যাশা করবে? আপনি অনুমোদিত ডোমেনগুলির একটি তালিকা তৈরি করতে পারেন এবং তাদের বিরুদ্ধে পরীক্ষা করতে পারেন। বাকিটা ফেলে দিন।

    $allowedDomains = array('www.domain1.tld','www.domain2.tld');
  4. ডোমেন নেম এবং অক্ষরগুলি কালো তালিকাভুক্ত: আপনি যদি একটি ডোমেন নাম আশা করেন তবে অ্যাজ এবং 0-9 এবং "" ব্যতীত অন্য কোনও অক্ষর গ্রহণ করার দরকার নেই। (যদি না আপনি বিশেষ ডোমেন নাম নিয়ে কাজ করছেন)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.