2011-12-05 12 views
6

मैंने पढ़ा है कि पीडीओ के साथ अगर आप तैयार करने और में चर पास का उपयोग चर से बचने के लिए की जरूरत नहीं है निष्पादित करें:क्या मुझे डीबी इनपुट से बचने की ज़रूरत है?

$st = $dbh->prepare("INSERT INTO mytable (name,email) VALUES (?,?)"); 
$st->execute(array($_POST['name'], $_POST['email'])); 

इस ट्रू है?

या क्या मुझे अभी भी $ _POST के साथ कुछ करने की ज़रूरत है?

+1

बचने की आवश्यकता के बावजूद, स्वच्छता, स्वीकार्य श्रेणियों, उचित रूप से स्वरूपित ईमेल आदि के लिए इनपुट मानों की जांच करना सुनिश्चित करें, और जहां उचित हो, अपने उपयोगकर्ता को त्रुटि संदेश लौटाएं। –

+0

हां, मैं एसक्यूएल हमलों के बारे में उत्सुक था – JohnSmith

+0

जब तक आप अपनी क्वेरी में जो भी रखते हैं और जहां आप इसे करते हैं, (यानी हर समय पैरामीटर का उपयोग करें, कभी भी * कभी भी * उपयोगकर्ता द्वारा प्रदान किए गए डेटा को रिसाव करने की अनुमति न दें गतिशील प्रश्नों के समेकित भागों में) तो आप सुरक्षित रहेंगे। – Polynomial

उत्तर

5

तैयार बयान पर, कोई भागने की आवश्यकता नहीं है (और चीजों से बचने से परिणामस्वरूप डबल-एस्केपिंग हो जाएगी, जिससे डेटा को डीबी में लिखा जा सकता है)।

हालांकि, पीडीओ तैयार किए गए बयान सभी क्वेरी वेरिएंट को संभाल नहीं सकते हैं, और कभी-कभी आपको "विदेशी" डेटा सीधे एक क्वेरी स्ट्रिंग में डालना होगा, जिसका अर्थ है कि आप इसे ठीक से बचने के लिए जिम्मेदार होंगे। विशेष रूप से, गतिशील प्रश्न जहां तालिका और/या फ़ील्ड नाम परिवर्तन तैयार कथन का उपयोग करके निर्दिष्ट नहीं किए जा सकते हैं। जैसे

SELECT ? FROM ? WHERE ?=? 

नहीं किया जा सकता है। केवल मूल्य प्लेसहोल्डर्स के साथ निर्दिष्ट कर सकते हैं।

+0

का चयन करें? कहाँ? = काम नहीं लग रहा है। स्पष्ट रूप से केवल मूल्य हो सकते हैं? ... – JohnSmith

+0

बिल्कुल। फ़ील्ड और टेबल नाम प्लेसहोल्डर्स के साथ निर्दिष्ट नहीं किए जा सकते हैं। –

2

संक्षिप्त उत्तर: नहीं, आपको कुछ भी बचने की आवश्यकता नहीं है। पैरामीटरित प्रश्न पूरी तरह से freakin 'भयानक हैं! :)

लंबा उत्तर: नहीं, आपको से बचने की आवश्यकता नहीं है क्योंकि यह डेटाबेस डेटाबेस में जा रहा है। हालांकि, आपको XSS हमलों को रोकने के लिए क्वेरी से डेटाबेस आउटपुट प्रदर्शित करते समय htmlspecialchars का उपयोग करना चाहिए, अन्यथा आप इस तरह कुछ किसी मनमाने ढंग से फ़ील्ड में भरने वाले किसी के साथ समाप्त हो जाएंगे:

<script type="text/javascript">alert('sup, I'm in ur site!');</script>

+1

डेटाबेस आउटपुट प्रदर्शित करते समय * को दबाकर *। आपको सामान्य रूप से ** ** ** डेटाबेस में एचटीएमएल स्टोर नहीं करना चाहिए जब तक कि आपका क्षेत्र वास्तव में HTML नहीं है। – phihag

2

यह सच है; कोड सही है (हालांकि आप उस मामले को संभालना चाहते हैं जो $_POST['name'] सेट नहीं है)।

पीडीओ की तैयार कथन कार्यक्षमता उस प्रारूप में मूल्यों पर हाथ रखती है जिसे स्पष्ट भागने की आवश्यकता नहीं होती है।

+1

यह ध्यान रखना महत्वपूर्ण है कि पीडीओ वास्तव में कोई भाग नहीं लेता है, यह पूरी तरह क्वेरी भाषा से डेटा को अलग करता है। – Polynomial

+0

@Polynomial धन्यवाद, अद्यतन किया गया। – phihag

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

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