दिलचस्प पोस्ट
रीसाइक्लिंगदृश्य एडाप्टर डेटा कैसे अपडेट करें? बैच फ़ाइलें – त्रुटि हैंडलिंग फ़ॉर्मेट किए गए बिगडीकेल मान मुद्रित कैसे करें? सूट बनाम चश्मा प्रोट्रेक्टर कैसे एक निश्चित बिंदु के आसपास एक शीर्ष को घुमाएगी? एंड्रॉइड फोन के लिए बैटरी चालू मूल्य प्राप्त करना Jsoup जावा एचटीएमएल पार्सर: जावास्क्रिप्ट इवेंट्स निष्पादित क्या आइडॉड्रेंस रीसोलर एक विरोधी पैटर्न है? एजेक्स पोस्ट की जेक्जरी जांच की सफलता मौजूदा तालिका में स्वतः वृद्धि आईडी जोड़ें? जावास्क्रिप्ट के भीतर एक एसवीजी पाठ को कैसे लटकाया जाए? SQL सर्वर 2005 में कॉमा से अलग NVARCHAR को टेबल रिकॉर्ड्स में कैसे रूपांतरित करना है? जेएसएफ बैकिंग बीन पद्धति को कैसे कॉल करें, जब ऑनक्लिक / अपूर्ण / ऑन … ईवेंट होता है और पेज लोड पर नहीं होता है बटन पर छाया कैसे प्रदान करें jQuery: कुंजीपटल बैकस्पेस आग नहीं होगा?

Php में एक सुरक्षित mysql तैयार कथन कैसे बनाएं?

मैं mysql में php के साथ तैयार बयानों का उपयोग करने के लिए नया हूँ मुझे स्तंभों को पुनः प्राप्त करने के लिए एक तैयार कथन बनाने में कुछ सहायता चाहिए।

मुझे अलग-अलग कॉलम से जानकारी प्राप्त करने की आवश्यकता है I वर्तमान में एक परीक्षण फ़ाइल के लिए, मैं पूरी तरह से असुरक्षित SQL कथन का उपयोग करता हूं:

$qry = "SELECT * FROM mytable where userid='{$_GET['userid']}' AND category='{$_GET['category']}'ORDER BY id DESC" $result = mysql_query($qry) or die(mysql_error()); 

क्या कोई यूआरएल मापदंडों (उपर्युक्त) से इनपुट का उपयोग करके एक सुरक्षित mysql स्टेटमेंट तैयार कर सकता है जो कि तैयार है?

बोनस: तैयार बयान गति के रूप में अच्छी तरह से बढ़ रहे हैं क्या यह समग्र गति में वृद्धि होगी अगर मैं केवल एक तैयार कथन का उपयोग किसी पृष्ठ पर तीन या चार बार करूँ?

वेब के समाधान से एकत्रित समाधान "Php में एक सुरक्षित mysql तैयार कथन कैसे बनाएं?"

यहां एक उदाहरण है mysqli (ऑब्जेक्ट-सिंटेक्स – यदि आप चाहें तो सिंटैक्स को फ़ंक्शन करने के लिए अनुवाद करने में काफी आसान):

 $db = new mysqli("host","user","pw","database"); $stmt = $db->prepare("SELECT * FROM mytable where userid=? AND category=? ORDER BY id DESC"); $stmt->bind_param('ii', intval($_GET['userid']), intval($_GET['category'])); $stmt->execute(); $stmt->store_result(); $stmt->bind_result($column1, $column2, $column3); while($stmt->fetch()) { echo "col1=$column1, col2=$column2, col3=$column3 \n"; } $stmt->close(); 

इसके अलावा, यदि आप सहबद्ध arrays को पकड़ने का एक आसान तरीका चाहते हैं (SELECT * के साथ उपयोग के लिए) को निर्दिष्ट करने के लिए कि वास्तव में कौन-से चर को बाइंड करना है, तो यह एक आसान फ़ंक्शन है:

 function stmt_bind_assoc (&$stmt, &$out) { $data = mysqli_stmt_result_metadata($stmt); $fields = array(); $out = array(); $fields[0] = $stmt; $count = 1; while($field = mysqli_fetch_field($data)) { $fields[$count] = &$out[$field->name]; $count++; } call_user_func_array(mysqli_stmt_bind_result, $fields); } 

इसका उपयोग करने के लिए, बस bind_result को कॉल करने के बजाय इसे खोलें:

 $stmt->store_result(); $resultrow = array(); stmt_bind_assoc($stmt, $resultrow); while($stmt->fetch()) { print_r($resultrow); } 

आप इसे इसके बजाय लिख सकते हैं:

 $qry = "SELECT * FROM mytable where userid='"; $qry.= mysql_real_escape_string($_GET['userid'])."' AND category='"; $qry.= mysql_real_escape_string($_GET['category'])."' ORDER BY id DESC"; 

लेकिन तैयार बयान का उपयोग करने के लिए आप बेहतर एक सामान्य पुस्तकालय का उपयोग करते हैं, जैसे कि पीडीओ

 <?php /* Execute a prepared statement by passing an array of values */ $sth = $dbh->prepare('SELECT * FROM mytable where userid=? and category=? order by id DESC'); $sth->execute(array($_GET['userid'],$_GET['category'])); //Consider a while and $sth->fetch() to fetch rows one by one $allRows = $sth->fetchAll(); ?> 

या, mysqli का उपयोग कर

 <?php $link = mysqli_connect("localhost", "my_user", "my_password", "world"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } $category = $_GET['category']; $userid = $_GET['userid']; /* create a prepared statement */ if ($stmt = mysqli_prepare($link, 'SELECT col1, col2 FROM mytable where userid=? and category=? order by id DESC')) { /* bind parameters for markers */ /* Assumes userid is integer and category is string */ mysqli_stmt_bind_param($stmt, "is", $userid, $category); /* execute query */ mysqli_stmt_execute($stmt); /* bind result variables */ mysqli_stmt_bind_result($stmt, $col1, $col2); /* fetch value */ mysqli_stmt_fetch($stmt); /* Alternative, use a while: while (mysqli_stmt_fetch($stmt)) { // use $col1 and $col2 } */ /* use $col1 and $col2 */ echo "COL1: $col1 COL2: $col2\n"; /* close statement */ mysqli_stmt_close($stmt); } /* close connection */ mysqli_close($link); ?> 

मैं कई अन्य उत्तरों से सहमत हूं:

  • PHP के ext/mysql का पैरामीटरबद्ध SQL कथन के लिए कोई समर्थन नहीं है।
  • एसक्यूएल इंजेक्शन के मुद्दों की सुरक्षा के लिए क्वेरी पैरामीटर अधिक विश्वसनीय माना जाता है।
  • mysql_real_escape_string() भी प्रभावी हो सकता है यदि आप इसे सही तरीके से उपयोग करते हैं, लेकिन यह कोड के लिए अधिक वर्बोज है
  • कुछ संस्करणों में, अंतरराष्ट्रीय चरित्र सेट में पात्रों के मामले होते हैं जो ठीक से भाग नहीं पाए जाते हैं, सूक्ष्म कमजोरियों को छोड़ देते हैं। क्वेरी मापदंडों का उपयोग करके इन मामलों से बचा जाता है।

आपको यह भी ध्यान रखना चाहिए कि एसक्यूएल इंजेक्शन के बारे में आपको अभी भी सतर्क होना चाहिए, भले ही आप क्वेरी मापदंडों का उपयोग करें, क्योंकि पैरामीटर केवल एसक्यूएल प्रश्नों में शाब्दिक मूल्यों का स्थान लेते हैं। यदि आप एसक्यूएल प्रश्नों को डायनामिक रूप से बनाते हैं और टेबल नाम, स्तंभ नाम या एसक्यूएल वाक्यविन्यास के किसी भी अन्य भाग के लिए पीएचपी वैरिएबल का उपयोग करते हैं, तो इस मामले में न ही क्वेरी पैरामीटर और न ही mysql_real_escape_string() मदद की जाती है उदाहरण के लिए:

 $query = "SELECT * FROM $the_table ORDER BY $some_column"; 

प्रदर्शन के बारे में:

  • प्रदर्शन लाभ तब आता है जब आप तैयार पैरामीटर मूल्यों के साथ कई बार तैयार क्वेरी निष्पादित करते हैं। आप पार्सिंग और क्वेरी तैयार करने के ओवरहेड से बचते हैं। लेकिन एक ही PHP अनुरोध में एक ही एसक्यूएल क्वेरी को कई बार निष्पादित करने की जरूरत है?
  • यहां तक ​​कि जब आप इस निष्पादन के लाभ का लाभ ले सकते हैं, तो यह आमतौर पर केवल कुछ अन्य चीजों की तुलना में थोड़ी सुधार है, जो आप प्रदर्शन को संबोधित करने के लिए कर सकते हैं, जैसे ओपोड कैशिंग या डाटा कैशिंग का प्रभावी ढंग से उपयोग करना
  • यहां कुछ ऐसे मामले भी होते हैं जहां एक तैयार क्वेरी प्रदर्शन को हानि पहुँचाती है । उदाहरण के लिए निम्नलिखित मामले में, अनुकूलक यह नहीं मान सकता है कि यह खोज के लिए एक इंडेक्स का उपयोग कर सकता है, क्योंकि मान लें कि पैरामीटर मान वाइल्डकार्ड से शुरू हो सकता है :

     SELECT * FROM mytable WHERE textfield LIKE ? 

PHP में MySQL के साथ सुरक्षा (या उस बात के लिए कोई अन्य भाषा) एक काफी हद तक चर्चा की गई समस्या है आपके कुछ अच्छे सुझावों को चुनने के लिए यहां कुछ जगहें हैं:

मेरी राय में दो सबसे प्रमुख आइटम हैं:

  • SQL इंजेक्शन: PHP के mysql_real_escape_string() फ़ंक्शन (या कुछ इसी तरह के) के साथ अपने सभी क्वेरी चर से बचने के लिए सुनिश्चित करें।
  • इनपुट मान्यकरण: उपयोगकर्ता के इनपुट पर कभी विश्वास न करें। अपने निविष्टियों को ठीक से कैसे सैनिइज और सत्यापन करने के लिए ट्यूटोरियल के लिए इसे देखें

तैयार बयान सादे पुराने Mysql / PHP इंटरफ़ेस द्वारा समर्थित नहीं हैं आपको PDO या mysqli की आवश्यकता होगी लेकिन अगर आप केवल प्लेसहोल्डर्स को स्थानांतरित करना चाहते हैं, तो php के mysql_query मैन्युअल पेज पर इस टिप्पणी की जांच करें ।

यदि आप मायसाकिली का उपयोग करने जा रहे हैं – जो मुझे सबसे अच्छा समाधान लगता है – मैं अत्यधिक कोडएन्स_मैस्क्यूलि क्लास की एक कॉपी डाउनलोड करने की सलाह देता हूं ।

यह एक साफ छोटा वर्ग है जो ऊपर उठता है और कच्चे मिस्कीली का उपयोग करते समय जमा होने वाले अधिकांश क्रुफ़्ट को छुपाता है, जैसे कि तैयार बयानों का उपयोग केवल पुराने मायसाइक्ल / php इंटरफ़ेस पर एक पंक्ति या दो अतिरिक्त लेता है