2009-08-21 11 views
34

पीडीओ तैयार वक्तव्यों का उपयोग शुरू करने से बहुत पहले नहीं, और जैसा कि मैं समझता हूं, यह आपके लिए सभी भागने/सुरक्षा करता है।पीडीओ तैयार बयान कितने सुरक्षित हैं

उदाहरण के लिए, $ _POST ['title'] मानते हुए एक फॉर्म फ़ील्ड है।

$title = $_POST['title']; 
$query = "insert into blog(userID, title) values (?, ?)" 
$st = $sql->prepare($query); 
$st->bindParam(1, $_SESSION['user']['userID'], PDO::PARAM_INT); 
$st->bindParam(2, $title); 
$st->execute(); 

क्या यह वास्तव में सुरक्षित है? क्या मुझे कुछ और करना है? मुझे और क्या ध्यान में रखना है?

धन्यवाद।

उत्तर

66

कड़ाई से बोलते हुए, वास्तव में कोई भागने की आवश्यकता नहीं है, क्योंकि पैरामीटर मान क्वेरी स्ट्रिंग में कभी भी अंतर नहीं किया जाता है।

क्वेरी पैरामीटर काम करने का तरीका यह है कि जब आप prepare() कहलाते हैं तो क्वेरी डेटाबेस सर्वर पर भेजी जाती है, और पैरामीटर मान बाद में भेजे जाते हैं, जब आप execute() कहते हैं। इसलिए उन्हें क्वेरी के पाठ के रूप से अलग रखा जाता है। SQL इंजेक्शन के लिए कभी भी अवसर नहीं है (प्रदान किया गया PDO::ATTR_EMULATE_PREPARES गलत है)।

तो हाँ, क्वेरी पैरामीटर सुरक्षा भेद्यता के उस रूप से बचने में आपकी सहायता करते हैं।

क्या वे किसी भी सुरक्षा भेद्यता के खिलाफ 100% सबूत हैं? नहीं बिलकुल नहीं। जैसा कि आप जानते हैं, एक क्वेरी पैरामीटर केवल एक SQL अभिव्यक्ति में एकल अक्षर का स्थान लेता है।

SELECT * FROM blog ORDER BY ?; 

आप कर सकते हैं:

SELECT * FROM blog WHERE userid IN (?); 

आप तालिका के नाम या स्तंभ नाम गतिशील बनाने के लिए एक पैरामीटर का उपयोग नहीं कर सकते: आप उदाहरण के लिए, मानों की सूची के लिए एक एकल पैरामीटर स्थानापन्न नहीं कर सकता 'टी SQL सिंटैक्स के किसी भी अन्य प्रकार के लिए एक पैरामीटर का उपयोग करें:

SELECT EXTRACT(? FROM datetime_column) AS variable_datetime_element FROM blog; 

तो वहाँ काफी कुछ मामलों में आप किसी स्ट्रिंग के रूप में क्वेरी हेरफेर करने के लिए, पहले prepare() कॉल करने के लिए कर रहे हैं। इन मामलों में, आपको अभी भी SQL इंजेक्शन से बचने के लिए कोड को ध्यान से लिखना होगा।

+2

यह बहुत अच्छी जानकारी थी। धन्यवाद! – sqram

+0

भी 'पसंद है?' मान्य है लेकिन आपको मेल खाने के लिए इस्तेमाल किए गए वर्णों से बचना चाहिए। –

+0

"एसक्यूएल इंजेक्शन के लिए कभी भी अवसर नहीं है (प्रदत्त पीडीओ :: ATTR_EMULATE_PREPARES झूठा है)।", क्या इसका मतलब यह है कि पीडीओ नकली तैयार डीबी चालक के मूल तैयार होने के रूप में सुरक्षित नहीं हैं? यदि हां, तो क्यों? –

2

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

+6

यह 'विशेष रूप से' कुछ स्पष्टीकरण आईएमओ की आवश्यकता है। आप शायद यह नहीं कहना चाहते कि यह 95% सुरक्षित है लेकिन यदि आप स्थिरांक का उपयोग करते हैं तो यह 100% सुरक्षित है। यदि स्थिरांक के बिना यह 100% सुरक्षित नहीं है तो यह सुरक्षित नहीं है।यदि यह 100% है तो यह स्थिरांक के साथ 'विशेष रूप से' सुरक्षित नहीं है। स्थिरांक का उपयोग करने और उनका उपयोग न करने के बीच सुरक्षा अंतर क्या है? – koen

9

यह एसक्यूएल इंजेक्शन से सुरक्षित है।

कुछ बातें इसमें से सुरक्षित नहीं है:

सेवा के
  • डेनियल
  • क्रॉस साइट स्क्रिप्टिंग हमलों (पंक्तियों बनाया जाना की अत्यधिक मात्रा के कारण) (यदि शीर्षक कभी किसी अन्य उपयोगकर्ता को वापस गूँजती है)

सुरक्षा केवल SQL इंजेक्शन को रोकने से अधिक है।

+0

कृपया योगदान दें। यदि शीर्षक दूसरे उपयोगकर्ता को वापस प्रतिबिंबित किया गया है तो आपका क्या मतलब है? – sqram

+3

मान लीजिए कि आपके पास डेटाबेस में संग्रहीत ब्लॉग पोस्ट का शीर्षक है, और अन्य उपयोगकर्ता इन पोस्ट को देख सकते हैं। फिर एक संभावित क्रॉस-साइट स्क्रिप्टिंग हमला होता है जिसमें एक दुर्भावनापूर्ण उपयोगकर्ता एक शीर्षक तैयार कर सकता है जिसमें HTML में एक दुर्भावनापूर्ण स्क्रिप्ट को एम्बेड करने के लिए HTML शामिल है क्योंकि यह आपकी साइट के अन्य उपयोगकर्ताओं को दिखाया गया है। – Yuliy

1

एक्सएसएस के रूप में देखकर, मुझे लगता है कि XSS हमलों को रोकने के लिए इस इनपुट सफाई कक्षा http://www.phpclasses.org/browse/package/2189.html जैसी चीजों का उपयोग करना भी अच्छा लगता है।

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