क्या मैं पहचानकर्ता (तालिका या फ़ील्ड नाम) या सिंटैक्स कीवर्ड को बाइंड करने के लिए PDO तैयार कथन का उपयोग कर सकता हूं?
दुर्भाग्य से, तैयार कथन केवल डेटा शाब्दिक का प्रतिनिधित्व कर सकता है। तो, एक बहुत ही सामान्य गड़बड़ी इस तरह की एक क्वेरी है:
$opt = "id";
$sql = "SELECT :option FROM t WHERE id=?";
$stm = $pdo->prepare($sql);
$stm->execute(array($opt));
$data = $stm->fetchAll();
पीडीओ सेटिंग्स पर निर्भर करता है, इस क्वेरी के परिणामस्वरूप या तो त्रुटि होगी (वास्तविक तैयार बयानों का उपयोग करने के मामले में) या केवल एक शाब्दिक स्ट्रिंग 'id'
फ़ील्डसेट में (नकली तैयारियों के मामले में)।
इसलिए, एक डेवलपर को स्वयं पहचानकर्ताओं का ध्यान रखना होता है - PDO ऑफ़र करता है कोई सहायता नहीं इस मामले के लिए।
एक गतिशील पहचानकर्ता को सुरक्षित बनाने के लिए, 2 सख्त नियमों का पालन करना होगा:
- पहचानकर्ता को ठीक से प्रारूपित करने के लिए
- इसे हार्डकोडेड श्वेतसूची के विरुद्ध सत्यापित करने के लिए ।
एक पहचानकर्ता को प्रारूपित करने के लिए, इन 2 नियमों को लागू करना होगा:
- बैकटिक्स में पहचानकर्ता संलग्न करें।
- बैकटिक को दोगुना करके अंदर से भाग जाएं।
इस तरह के स्वरूपण के बाद, $table चर को क्वेरी में सम्मिलित करना सुरक्षित है। तो, कोड होगा:
$field = "`".str_replace("`","``",$field)."`";
$sql = "SELECT * FROM t ORDER BY $field";
हालांकि, हालांकि इस तरह का स्वरूपण ORDER BY जैसे मामलों के लिए पर्याप्त होगा, अधिकांश अन्य मामलों के लिए एक अलग प्रकार के इंजेक्शन की संभावना है:उपयोगकर्ता को एक टेबल या एक फ़ील्ड चुनने की अनुमति देता है जिसे वे देख सकते हैं, हम कुछ प्रकट कर सकते हैं संवेदनशील जानकारी, जैसे पासवर्ड या अन्य व्यक्तिगत डेटा। इसलिए, अनुमत मानों की सूची के विरुद्ध गतिशील पहचानकर्ताओं की जांच करना हमेशा बेहतर होता है। यहां एक संक्षिप्त उदाहरण दिया गया है:
$allowed = array("name","price","qty");
$key = array_search($_GET['field'], $allowed);
$field = $allowed[$key];
$query = "SELECT $field FROM t"; //value is safe
कीवर्ड के लिए नियम समान हैं, लेकिन निश्चित रूप से कोई स्वरूपण उपलब्ध नहीं है - इस प्रकार, केवल श्वेतसूची ही संभव है और इसका उपयोग किया जाना चाहिए:
$dir = $_GET['dir'] == 'DESC' ? 'DESC' : 'ASC';
$sql = "SELECT * FROM t ORDER BY field $dir"; //value is safe
PHP दस्तावेज़ीकरण में इस उपयोगकर्ता द्वारा योगदान दिया गया नोट भी देखें:PDO::quote पर उपयोगकर्ता नोट