2011-07-11 16 views
5

मैंने सुना है कि sprintf() फिर से एसक्यूएल इंजेक्शन की रक्षा करता है। क्या यह सच है? यदि हां तो यह फिर से एसक्यूएल इंजेक्शन की रक्षा कैसे करता है?कैसे sprintf() फिर से एसक्यूएल इंजेक्शन की रक्षा करता है?

क्यों लोग इस तरह क्वेरी लिखने के लिए सिफारिश कर रहे हैं:

$sql = sprintf('SELECT * FROM TABLE WHERE COL1 = %s AND COL2 = %s',$col1,$col2); 
+8

* कौन सा * लोग ऐसी चीज की सिफारिश करते हैं? – Tomalak

+1

आप शायद क्या मतलब है तैयार कथन है, जो एक अलग विषय है। 'Me_real_escape_string', LOL के लिए – Gal

उत्तर

8

sprintf सुरक्षा नहीं करेगा! यह केवल की जगह %s

तुम इतनी mysql_real_escape_string चाहिए:

$sql = sprintf('SELECT * FROM TABLE WHERE COL1 = "%s" AND COL2 = "%s"', 
mysql_real_escape_string($col1), 
mysql_real_escape_string($col2)); 

सुरक्षित इंजेक्शन

टिप्पणी है: मैं आप PDO पर एक नज़र डालें sugets, कि मैं क्या DBconections और प्रश्नों के लिए उपयोग करना चाहते है

8

कि किसी भी सुरक्षा नहीं करता है। sprintf का उपयोग करके अधिक पठनीय कोड बनाता है, फिर प्रत्येक चर पर mysql_real_escape_string चलाने के लिए स्ट्रिंग में और बाहर ड्रॉप करना ... लेकिन वह उदाहरण अंत में चर से बच नहीं जाता है ताकि लाभ खो जाए।

यदि आप सभ्य सुरक्षा चाहते हैं, तो bound parameters प्रदान करने वाले कुछ का उपयोग करें।

+8

+1। : डी – deceze

+0

ओउप्स। 'stupid_overlong_not_fake_function_names' सुबह के समय में टाइपो को पेश करना बहुत आसान है। :) – Quentin

3

sprintf का उपयोग संख्यात्मक फ़ील्ड के लिए एसक्यूएल इंजेक्शन के खिलाफ की रक्षा कर सकता है:

$sql = sprintf("SELECT * FROM table WHERE col1 = %i", $col1); 

इस तरह से sprintf का उपयोग करके, आप सुनिश्चित कर सकते हैं कि $ col1 को एक पूर्णांक में परिवर्तित कर दिया जाएगा - हालांकि यह वास्तव में एक पूर्णांक नहीं है, तो यह त्रुटि या चेतावनी उत्पन्न कर सकता है।

एसक्यूएल इंजेक्शन के खिलाफ सुरक्षा का सही तरीका है अपने सभी इनपुट मानों की जांच करना, और भागना। लेकिन यह अन्य प्रश्नों में बहुत अधिक कवर किया गया है, इसलिए मैं यहां विस्तार से नहीं जा रहा हूं।

+0

लेकिन पूर्णांक के साथ, आपको वैसे भी विशेष सावधानी बरतनी पड़ेगी। – Tomalak

+1

निश्चित रूप से आप करते हैं ... क्या होगा यदि उपयोगकर्ता-इनपुट "पूर्णांक" इस तरह दिखता है: "; ड्रोप तालिका उपयोगकर्ता;"? – Flimzy

+0

फिर यह एक पूर्णांक नहीं है, बहुत सरल है।मैंने नहीं कहा कि आप प्रकार की जांच छोड़ सकते हैं। – Tomalak

1

यह स्पष्ट रूप से नहीं है और यदि आपने वास्तव में किसी पुस्तक या ट्यूटोरियल में पढ़ा है तो आपको इसे भविष्य के संदर्भ के लिए स्वचालित रूप से त्यागना चाहिए।

हालांकि, यह आउटपुट उत्पन्न करने का एक व्यावहारिक तरीका हो सकता है जिसके लिए आगे की प्रक्रिया की आवश्यकता होती है। तुलना करें:

echo '<p>Hello, <strong></strong>' . htmlspecialchars($name) . ', welcome to ' . htmlspecialchars($place). '</p>'; 

echo sprintf('<p>Hello, <strong>%s</strong>, welcome to %s</p>', 
    htmlspecialchars($name), 
    htmlspecialchars($place) 
); 

एक ही तरह के एसक्यूएल कोड के रूप में उत्पादन, अन्य प्रकार के लिए लागू होता है, लेकिन निश्चित रूप से आप अभी भी बनाने के लिए यह सुरक्षित में इनपुट के लिए कुछ करने की जरूरत है: sprintf() सिर्फ एक नियमित रूप से स्ट्रिंग समारोह है यह एसक्यूएल और डेटाबेस से अनजान है।

कृपया ध्यान दें कि बाँध मापदंडों एक समान सिंटैक्स का उपयोग करें:

// Fictional DB abstraction layer 
$sql = 'SELECT foo_id 
    FROM foo 
    WHERE name=:name AND status=:status'; 
$params = array(
    'name' => $name, 
    'status' => $status, 
); 
$result = $db->run($sql, $params); 

है यही कारण है कि मैं विशेष रूप से उन डीबी पुस्तकालयों कि इस तरह के पीडीओ के रूप में इस वाक्य रचना, प्रदान उपयोग करने के लिए आसान लगता है।

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