2012-04-21 10 views
5

के बारे में प्रश्न php का उपयोग करके मैं अपनी व्यक्तिगत वेबसाइट विकसित कर रहा हूं। सब कुछ ठीक है, लेकिन मैं सिर्फ दो बातें php.net में mysql_real_escape_string मैनुअल पढ़ने के लिए और पाया: MySQL करने के लिए एक प्रश्न भेजने से पहलेmysql_real_escape_string

  1. इस समारोह हमेशा (कुछ अपवादों के साथ) डेटा को सुरक्षित बनाने के लिए इस्तेमाल किया जाना चाहिए।
  2. mysql_real_escape_string() % और _ से नहीं बचता है। ये LISE, अनुदान, या REVOKE के साथ संयुक्त अगर MySQL में वाइल्डकार्ड हैं।

मैं दो प्रश्न हैं:
1-क्या ये अपवाद हैं?
2- उन पात्रों से कैसे बचें?

+1

आपको [पीडीओ] (http://php.net/manual/en/book.pdo.php) का उपयोग करना चाहिए। अपनी व्यक्तिगत वेबसाइट करना इसे सीखने का एक शानदार अवसर है। – kapa

+0

प्वाइंट 2 'LIKE' खंडों को संदर्भित करता है, और अन्य संदर्भों में स्ट्रिंग डेटा का उपयोग करने के लिए प्रासंगिक नहीं है। – mario

+0

अपवाद में से एक एक पहले से बच निकला स्ट्रिंग हो सकता है। – hjpotter92

उत्तर

5

यह फ़ंक्शन हमेशा (कुछ अपवादों के साथ) MySQL को क्वेरी भेजने से पहले डेटा को सुरक्षित रखने के लिए उपयोग किया जाना चाहिए।

मेरी बड़ी निराशा के लिए, मैनुअल पेज पूरी बकवास कहता है, और they refuse to make it correct
तो, इसके विपरीत, केवल कुछ ही मामले हैं जब आपको इस फ़ंक्शन की आवश्यकता होती है। तो केवल एक कहने के लिए: जब आप SQL क्वेरी में स्ट्रिंग जोड़ रहे हैं।

mysql_real_escape_string()% और _ से नहीं बचता है। ये LISE, अनुदान, या REVOKE के साथ संयुक्त अगर MySQL में वाइल्डकार्ड हैं।

इससे कोई फर्क नहीं पड़ता। जब तक आप उद्देश्य पर LIKE ऑपरेटर का उपयोग कर रहे हैं, तब तक ये वर्ण कोई नुकसान नहीं करेंगे।

लेकिन अगर आप स्ट्रिंग बयान पसंद करने के लिए जा बचना चाहते हैं, तो आप इस कोड

$like = addCslashes($like,'\%_'); 

(ध्यान दें स्लैश का उपयोग कर सकते हैं -। यह भी यह बताते हुए मैनुअल के रूप में भाग निकले किया जाना आवश्यक है यह भी ध्यान रखें C फ़ंक्शन नाम में अक्षर)।
इस प्रक्रिया के बाद आप परिणामस्वरूप $like वैरिएबल का उपयोग कर सकते हैं जिसका उपयोग आप अपने प्रश्नों के निर्माण के लिए कर रहे हैं - या तो उद्धरण दें और उनसे बचें या तैयार कथन में उपयोग करें।

+0

धन्यवाद, लेकिन उन्हें कैसे बचें ('%', '_')? – undone

+1

बस एक ही स्लैश के साथ। 'addCslashes ($ डेटा, "% _"); ' –

+1

चाल करेगा लेकिन केवल पैटर्न-मिलान संदर्भ में जाने वाले टुकड़ों के लिए ऐसा ही करें। अन्यथा, आप अपने एसक्यूएल में एक शाब्दिक '\%' देखेंगे। – Matthew

3

मुझे यकीन नहीं है कि डेटा सुरक्षित करने के बारे में बात करते समय मैन्युअल का क्या अपवाद है। आप कह सकते हैं कि अपवाद तब होता है जब डेटा पहले से ही सुरक्षित होने के लिए जाना जाता है। उदाहरण के लिए, यहाँ कुछ मामलों जो मन में आ रहे हैं:

  • डेटा एक संख्या के रूप लिखा गया
  • आप पहले से ही पता है कि यह किसी भी वर्ण नहीं (यह वास्तव में अगले आइटम का एक विशेषज्ञता है) कि भाग निकले जाने की जरूरत है

उदाहरण के लिए यदि आप $id = intval($_GET['id']) है तो आप इसके इंजेक्शन लगाने से पहले $id से बचने के लिए की जरूरत नहीं है, (उदाहरण के लिए यह एक "श्वेत सूची" सरणी कि कुछ ही विकल्प आप हार्डकोडेड शामिल में कुछ को देख से आता है) एक प्रश्न में

हालांकि!सभी इनपुट से बचने के लिए यह आपको कभी भी चोट नहीं पहुंचा सकता है, और ऐसा करने से आप अपने कोड में कमजोरियों को पेश करने का अवसर समाप्त कर सकते हैं (उदाहरण के लिए यदि आप बचाना भूल जाते हैं, यदि आवश्यकताएं बदलती हैं, या वास्तव में कुछ भी)। तो मैं सबकुछ से बचने और "अपवाद" के बारे में भूलने की आदत में आने की सलाह देता हूं।

इनपुट के हिस्से के रूप % और _ पात्रों के लिए के रूप में, इन भाग निकले जा करने के लिए जब तक आप एक आदेश है कि उन्हें पहचानता को यह इनपुट को खिलाने के लिए जा रहे हैं की जरूरत नहीं है। उदाहरण के लिए, अगर आप इस तरह एक प्रश्न पूछना चाहते हैं तो:

$term = $_GET['term']; 
$sql = sprintf("SELECT FROM table WHERE column LIKE '%%s%'", 
       mysql_real_escape_string($term)); 

इस मामले में, यदि उपयोगकर्ता के एक %$term के हिस्से के रूप में यह मान लेना कि वे वास्तव में एक शाब्दिक % लिए खोज करना चाहते उचित है। इसलिए ऐसे मामलों में आपको % से \% (\ डिफ़ॉल्ट भागने वाला चरित्र) से बदलकर भागना चाहिए। str_replace या strtr इसके लिए दो अच्छे विकल्प हैं।

+0

mysql_real_escape_string * सुरक्षा * के साथ कुछ भी नहीं है। यह पूरी तरह से अलग मामलों है (PHP लोगों द्वारा व्यापक रूप से गलत, मुझे स्वीकार करना है)। वास्तव में, बच निकले लेकिन केवल एक स्ट्रिंग स्वरूपण सुविधा और कुछ भी नहीं। यहां तक ​​कि जो भी "सुरक्षित" डेटा में एक लाइनब्रेक हो सकता है जिसे लॉग पठनीयता के लिए प्रतिस्थापित किया जाना है। उल्लेख नहीं है कि असुरक्षित पहचानकर्ता के लिए यह थोड़ा सा अच्छा नहीं होगा। –

+0

@YourCommonSense: उद्धरण में लपेटना + 'mysql_real_escape_string' = सुरक्षित। इसमें * सब कुछ * सुरक्षा * अप्रत्यक्ष रूप से * करने के लिए है, क्योंकि यह सुरक्षा * सीधे * (उद्धरण) प्रदान करने के लिए एक शर्त है। वैसे भी DV के लिए धन्यवाद। – Jon

+0

'हालांकि! यह आपको सभी इनपुट से बचने के लिए कभी भी चोट नहीं पहुंचा सकता, 'बधाई हो, आपने अभी' जादू उद्धरण 'सुविधा का आविष्कार किया है! –

1

आप write your own function कर सकते हैं;) अधिक जानकारी के लिए this thread देखें।

अन्यथा आप PDO library या किसी अन्य ऐसी पुस्तकालयों का उपयोग कर सकते हैं।

+0

पहला लिंक 'MSSQL' के लिए नहीं है 'mysql' :-) – undone

+0

हाँ, यह केवल एक विचार देने के लिए था कि mysql के लिए मैन्युअल रूप से फ़ंक्शन लिखने के लिए तर्क को कैसे कार्यान्वित किया जाए। MySQL के लिए भी वही तर्क लागू किया जा सकता है .. – gopi1410