Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एक विन्यास योग्य जॉइनिंग सिस्टम को सुरक्षित रूप से लागू करना

आप इतना सही कर रहे हैं कि मैं वास्तव में दोषी महसूस कर रहा हूं कि आप कुछ गलत कर रहे हैं! :)

आप फ़ील्ड मानों को पैरामीटराइज़ करने के लिए केवल तैयार किए गए कथनों का उपयोग कर सकते हैं - न कि SQL पहचानकर्ता जैसे कि कॉलम या टेबल नाम। इसलिए आप A.x . पास नहीं कर पाएंगे , B.z आदि अपने JOIN . में तैयार किए गए कथन मापदंडों के माध्यम से मानदंड:आपको जरूरी इसके बजाय वह करें जो बहुत गलत लगता है और उन्हें सीधे अपने SQL स्ट्रिंग में जोड़ दें।

वैसे, सबकुछ नष्ट नहीं हुआ है। वरीयता के कुछ अस्पष्ट क्रम में, आप यह कर सकते हैं:

  1. उपयोगकर्ता को एक विकल्प सूची के साथ प्रस्तुत करें, जिससे आप बाद में SQL को फिर से इकट्ठा करते हैं:

    <select name="join_a">
      <option value="1">x</option>
      <option value="2">y</option>
    </select>
    <select name="join_b">
      <option value="1">z</option>
      <option value="2">y</option>
    </select>
    

    फिर आपका फॉर्म हैंडलर:

    switch ($_POST['join_a']) {
      case 1:  $acol = 'x'; break;
      case 2:  $acol = 'y'; break;
      default: die('Invalid input');
    }
    switch ($_POST['join_b']) {
      case 1:  $bcol = 'z'; break;
      case 2:  $bcol = 'y'; break;
      default: die('Invalid input');
    }
    
    $sql .= "FROM A JOIN B ON A.$acol = B.$bcol";
    

    इस दृष्टिकोण का लाभ यह है कि, PHP से समझौता करने से कम (जिस स्थिति में आपको SQL इंजेक्शन की तुलना में कहीं अधिक चिंता होगी), मनमानी SQL बिल्कुल नहीं अपने RDBMS में अपना रास्ता खोजें।

  2. सुनिश्चित करें कि उपयोगकर्ता इनपुट अपेक्षित मानों में से एक से मेल खाता है:

    <select name="join_a">
      <option>x</option>
      <option>y</option>
    </select>
    <select name="join_b">
      <option>z</option>
      <option>y</option>
    </select>
    

    फिर आपका फॉर्म हैंडलर:

    if (!in_array($_POST['join_a'], ['x', 'y'])
     or !in_array($_POST['join_b'], ['z', 'y']))
       die('Invalid input');
    
    $sql .= "FROM A JOIN B ON A.$_POST[join_a] = B.$_POST[join_b]";
    

    यह दृष्टिकोण PHP के in_array . पर निर्भर करता है सुरक्षा के लिए कार्य करता है (और उपयोगकर्ता को आपके अंतर्निहित कॉलम नामों को भी उजागर करता है, लेकिन आपके आवेदन को देखते हुए मुझे संदेह है कि यह एक चिंता का विषय है)।

  3. कुछ इनपुट क्लींजिंग करें, जैसे:

    mb_regex_encoding($charset); // charset of database connection
    $sql .= 'FROM A JOIN B ON A.`' . mb_ereg_replace('`', '``', $_POST['join_a']) . '`'
                        . ' = B.`' . mb_ereg_replace('`', '``', $_POST['join_b']) . '`'
    

    जबकि हम यहां उपयोगकर्ता इनपुट को उद्धृत करते हैं और उपयोगकर्ता द्वारा उस उद्धरण से बचने के किसी भी प्रयास को प्रतिस्थापित करते हैं, यह दृष्टिकोण सभी प्रकार की त्रुटियों और कमजोरियों से भरा हो सकता है (या तो PHP के mb_ereg_replace में) फ़ंक्शन या MySQL द्वारा उद्धृत पहचानकर्ता के भीतर विशेष रूप से तैयार किए गए स्ट्रिंग्स को संभालना)।

    यह दूर है उपयोगकर्ता द्वारा परिभाषित स्ट्रिंग्स को पूरी तरह से किसी के SQL में सम्मिलित करने से बचने के लिए उपरोक्त विधियों में से किसी एक का उपयोग करना बेहतर होगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. NodeJS और mysql:क्वेरी परिणाम की प्रतीक्षा करें

  2. MySQL:उन पंक्तियों का चयन करना जहाँ एक कॉलम रिक्त है

  3. MySQL UTF8 को UTF8MB4 समस्याओं और प्रश्नों में माइग्रेट करना

  4. PHP प्रपत्र चेकबॉक्स और अपरिभाषित अनुक्रमणिका

  5. Django अतिरिक्त उपयोगकर्ता पंजीकरण विवरण डेटाबेस में सहेजा नहीं जा रहा है