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

पीडीओ - घातक त्रुटि:एक गैर-वस्तु पर एक सदस्य समारोह लाने के लिए () कॉल करें

आपके कोड में वेरिएबल $username . है आपके प्रश्न के शीर्ष भाग में, लेकिन फिर आपके पास $user . है निचले भाग में।

क्या आप शायद उसी चर का उपयोग करना चाहते हैं?

$username = ($_GET ['user']);
$sth = $dbh->query( "SELECT username, user_state, last_activity, alerts_unread, conversations_unread, message_count 
  FROM xf_user WHERE username='$user'" );
  //                           ^^ Should this ALSO be $username ?   
$row = $sth->fetch();

संपादित करें:ठीक है, अब आप अपने PDO::ATTR_EMULATE_PREPARES के साथ बस प्यारे हो रहे हैं . इसे देखें:

डेटाबेस और टेबल संरचना:

Database changed
mysql> show tables
    -> ;
+----------------+
| Tables_in_prep |
+----------------+
| users          |
+----------------+
1 row in set (0.00 sec)

mysql> select * from users;
+----+---------+--------+
| id | userid  | pass   |
+----+---------+--------+
|  1 | Fluffeh | mypass |
+----+---------+--------+
1 row in set (0.00 sec)

और कुछ PHP कोड जो आपके द्वारा कॉपी किया गया है, अतिरिक्त PDO विशेषता के साथ:

<?php
    //$username = ($_GET ['user']);
    $username="Fluffeh";

    $dbh = new PDO('mysql:host=localhost;dbname=prep', 'prepared', 'example');
    $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

    $sth = $dbh->query( "SELECT userid, pass FROM users WHERE userid='$username'" );
    echo "Trying to use $username.\n";
    print_r($sth->fetch());
    echo "----------------------------------------\n\n";
?>

<?php
    //$username = ($_GET ['user']);
    $username="user2693017";

    $dbh = new PDO('mysql:host=localhost;dbname=prep', 'prepared', 'example');
    $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

    $sth = $dbh->query( "SELECT userid, pass FROM users WHERE userid='$username'" );
    echo "Trying to use $username.\n";
    print_r($sth->fetch());
    echo "----------------------------------------\n\n";
?>

<?php
    //$username = ($_GET ['user']);
    $username="Oh my' or 1=1 or 'm=m";

    $dbh = new PDO('mysql:host=localhost;dbname=prep', 'prepared', 'example');
    $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

    $sth = $dbh->query( "SELECT userid, pass FROM users WHERE userid='$username'" );
    echo "Trying to use $username.\n";
    print_r($sth->fetch());
    echo "----------------------------------------\n\n";
?>

<?php
    //$username = ($_GET ['user']);
    $username="(select id from users limit 1)";

    $dbh = new PDO('mysql:host=localhost;dbname=prep', 'prepared', 'example');
    $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

    $sth = $dbh->query( "SELECT userid, pass FROM users WHERE id='$username'" );
    echo "Trying to use $username.\n";
    print_r($sth->fetch());
    echo "----------------------------------------\n\n";
?>

<?php
    //$username = ($_GET ['user']);
    // Changed this one to be a non-string, you might be checking an ID instead.
    $username="(select id from users limit 1)";

    $dbh = new PDO('mysql:host=localhost;dbname=prep', 'prepared', 'example');
    $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

    $sth = $dbh->query( "SELECT userid, pass FROM users WHERE id=$username" );
    echo "Trying to use $username.\n";
    print_r($sth->fetch());
    echo "----------------------------------------\n\n";
?>

<?php
    //$username = ($_GET ['user']);
    $username="bob'; drop table users; \  
    ";
    // This one is tricker to do in PHP code. I could easily enter this into a text field however.

    $dbh = new PDO('mysql:host=localhost;dbname=prep', 'prepared', 'example');
    $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

    //$sth = $dbh->query( "SELECT userid, pass FROM users WHERE id='$username'" );
    echo "Trying to use $username.\n";
    print_r($sth->fetch());
    echo "----------------------------------------\n\n";
?>

और आउटपुट:

    Trying to use Fluffeh.
stdClass Object
(
    [userid] => Fluffeh
    [pass] => mypass
)
----------------------------------------


    Trying to use user2693017.
----------------------------------------


    Trying to use Oh my' or 1=1 or 'm=m.
stdClass Object
(
    [userid] => Fluffeh
    [pass] => mypass
)
----------------------------------------


    Trying to use (select id from users limit 1).
----------------------------------------


    Trying to use (select id from users limit 1).
stdClass Object
(
    [userid] => Fluffeh
    [pass] => mypass
)
----------------------------------------


    Trying to use bob'; drop table users; \  
        .
----------------------------------------

ओह, जिस कारण से मैंने पिछले एक को LAST तक छोड़ दिया, वह यह आउटपुट अब मेरे डेटाबेस में है:

mysql> show tables;
Empty set (0.00 sec)

हाँ, यह सही है, मैंने अभी-अभी एक टेबल गिराई है। मुझे फिर से कहना चाहिए, मेरे पास एक चुनिंदा बयान था, और एक छोटी सी चालबाजी के साथ मैंने एक मूल्य में प्रवेश किया कि आधे दिमाग और कुछ दुर्भावनापूर्ण इरादे वाला कोई भी टेक्स्ट फ़ील्ड में कर सकता है, और आपकी तालिका को छोड़ दिया।

अब, दी गई है, यदि आप चीजों को ठीक से सेट कर रहे हैं, तो आप चुनिंदा कथनों के लिए एक अलग उपयोगकर्ता को अच्छी तरह से सेट कर सकते हैं, और केवल उन्हें select प्रदान कर सकते हैं आपके डेटाबेस से अधिकार, इस तरह की चीज़ों को रोकने के लिए - लेकिन ईमानदार रहें... आप नहीं हैं?

स्पष्ट रूप से यह निर्धारित करना कि अनुकरण पर्याप्त नहीं है। गंभीरता से, अब कृपया जाएँ उस उत्तर को पढ़ें , यदि आप अपने कोड में सुरक्षित रहना चाहते हैं तो तैयार कथनों का उपयोग करें और पैरा का उपयोग करें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL क्वेरी - वर्तमान तिथि के आधार पर रिकॉर्ड प्राप्त करें

  2. MySQL 5.5 विभाजन तालिका A-Z . द्वारा

  3. एंड्रॉइड पर MySQL कनेक्टर/जे कैसे काम कर रहा है?

  4. बैकअप फ़ाइलों से मैसकल डेटाबेस को कैसे पुनर्प्राप्त करें

  5. MySQL में अंतिम हटाई गई आईडी प्राप्त करें