2011-09-01 22 views
6

मैं निम्न स्क्रिप्ट का उपयोग कर रहा हूं जो एक पोस्टग्रेस डीबी में एचटीएमएल फॉर्म और स्टोर्स से डेटा लेता है। यह pg_escape_string फ़ंक्शन है जो फ़ॉर्म से मान को php चर में संग्रहीत करता है। पूरे वेब पर खोज कर, मैंने पाया कि pg_escape_string डेटाबेस में सम्मिलन के लिए एक स्ट्रिंग से बच निकलता है। मैं इस पर ज्यादा स्पष्ट नहीं हूं। यह वास्तव में क्या बच रहा है? वास्तव में क्या होता है जब उसने कहा कि एक स्ट्रिंग बच निकला है?क्या pg_escape_string वास्तव में करता है?

$sql = "INSERT INTO airports (name) VALUES ('$name')"; 

अब मान लें कि $name"Chicago O'Hare" है:

<html> 
    <head></head> 
    <body>  

<?php 
if ($_POST['submit']) { 
    // attempt a connection 
    $dbh = pg_connect("host=localhost dbname=test user=postgres"); 
    if (!$dbh) { 
     die("Error in connection: " . pg_last_error()); 
    } 

    // escape strings in input data 
    $code = pg_escape_string($_POST['ccode']); 
    $name = pg_escape_string($_POST['cname']); 

    // execute query 
    $sql = "INSERT INTO Countries (CountryID, CountryName) VALUES('$code', '$name')"; 
    $result = pg_query($dbh, $sql); 
    if (!$result) { 
     die("Error in SQL query: " . pg_last_error()); 
    } 

    echo "Data successfully inserted!"; 

    // free memory 
    pg_free_result($result); 

    // close connection 
    pg_close($dbh); 
} 
?>  

    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
     Country code: <br> <input type="text" name="ccode" size="2"> 
     <p> 
     Country name: <br> <input type="text" name="cname">  
     <p> 
     <input type="submit" name="submit"> 
    </form> 

    </body> 
</html> 

उत्तर

1

pg_escape_string() अपने कोड

+0

यह वास्तव में पुराना है, लेकिन बाद में किसी के आने के लिए, pg_escape_string() एसक्यूएल इंजेक्शन के खिलाफ एक रक्षा है, लेकिन इसे रोकता नहीं है। तैयार बयान का उपयोग करना बेहतर है। (http://stackoverflow.com/questions/732561/why-is-using-a-mysql-prepared-statement-more-secure-than-using-the-common-escape) – pandubear

5

पर विचार करें निम्नलिखित कोड में sql injection को रोकने के। क्योंकि apostrophe एक एसक्यूएल उद्धरण चिह्न के रूप में व्याख्या की है,

INSERT INTO airports (name) VALUES ('Chicago O'Hare') 

जो बीमार बनाई है, और आपकी क्वेरी त्रुटि देगा: जब आप स्ट्रिंग प्रक्षेप करते हैं, तो आप इस एसक्यूएल कोड मिलता है।

Worse things भी हो सकता है। वास्तव में, एमआईटीईआर द्वारा एसक्यूएल इंजेक्शन को #1 Most Dangerous Software Error of 2011 स्थान दिया गया था।

लेकिन आपको स्ट्रिंग इंटरपोलेशन का उपयोग करके कभी भी SQL क्वेरी बनाना नहीं चाहिए। इसके बजाय queries with parameters का उपयोग करें।

$sql = 'INSERT INTO airports (name) VALUES ($1)'; 
$result = pg_query_params($db, $sql, array("Chicago O'Hare")); 
+0

स्पष्ट स्पष्टीकरण के लिए बहुत बहुत धन्यवाद:) –

+0

यह वास्तव में 'शिकागो ओ'हेयर' को 'शिकागो ओ'हेयर' में बदलता है (वास्तव में यह कैसे बच निकला है आपकी डेटाबेस सेटिंग्स पर निर्भर करता है) – dsas

संबंधित मुद्दे