2010-06-30 16 views
6

मैं इस टिप्पणी को देखा का उपयोग नहीं करना चाहिए .... http://www.php.net/manual/en/function.mysql-real-escape-string.php#93005मैं mysql_real_escape_string

और आश्चर्य क्यों यह एक बुरा विचार किया जाएगा शुरू कर दिया।

+4

आप इस्तेमाल कर सकते हैं जब भी [तैयार बयानों] (http://php.net/manual/en/mysqli.prepare.php) के बजाय। – Mike

उत्तर

8

बेकार निर्माणों के साथ खत्म हो जाएगा यह एक जोड़े कारणों के लिए एक बुरा विचार है:

  • पहले , यह मानता है कि आपके इनपुट हमेशा डेटाबेस और डेटाबेस में अकेले रहेंगे। यदि HTML आउटपुट में का उपयोग किया जा रहा है तो क्या होगा? या एक ईमेल में? या एक फ़ाइल में लिखा है? या अन्य चीजें हैं .. आपकी फ़िल्टरिंग हमेशा संदर्भ-संवेदनशील होना चाहिए।
  • इससे भी महत्वपूर्ण बात, यह क्योंकि कोई संकेत नहीं है कि वे फ़िल्टर कर दिया गया है वहां पहुंचें, पोस्ट, आदि के लापरवाह उपयोग को प्रोत्साहित करती। अगर कोई आपको

    $ _POST ['name'] गूंजता है;

    किसी पृष्ठ पर, उन्हें कैसे पता चलेगा कि यह फ़िल्टर किया गया है? या इससे भी बदतर ... क्या आपको यकीन है कि यह रहा है? उस अन्य ऐप के बारे में क्या? आप जानते हैं, जिस पर आप थे, बस? नए डेवलपर्स क्या करेंगे? क्या वे यह भी जानते होंगे कि फ़िल्टरिंग महत्वपूर्ण है?

+4

+1। मेरा नियम है, उस माध्यम में प्रवेश करने से पहले केवल एक दिए गए माध्यम के लिए * तुरंत * sanitize। तो आप प्रश्न में php.net टिप्पणी की तरह, एक क्वेरी में * * नहीं * HTTP-> PHP संक्रमण पर उपयोग करने से पहले तुरंत अपने तारों से बचें। –

2

किसी भी डेटा पर जो SQL क्वेरी में नहीं डाला जा रहा है। यदि आपको आउटपुट से बचने की आवश्यकता है, तो htmlspecialchars() (या समान) का उपयोग करें। डाटाबेस इनपुट के लिए भी यही सच है; इससे बचें केवल पहले ही जा रहा है।

0

विशेष रूप से उस कोड उदाहरण के लिए साइट पर उस विशेष टिप्पणी से निर्णय लेते हुए, मुझे लगता है कि वह कह रहा है कि magic_quotes बंद है और आप सुनिश्चित हैं कि आप केवल सर्वर पर अपना कोड उपयोग करेंगे इसके साथ आप कोड संपादित कर सकते हैं और if(get_magic_quotes_gpc())... etc

सामान्य रूप से यह डेटा के खिलाफ बेकार है, जिसमें आप एक क्वेरी के अंदर शामिल हैं, जिसे आप उद्धरणों का उपयोग नहीं करते हैं - यानी आईडी के लिए पूर्णांक, इन्हें प्रकार के लिए जांचने की आवश्यकता है।

3

आदर्श रूप से आपको पीडीओ तैयार बयानों के उपयोग के माध्यम से किसी प्रश्न में इसका उपयोग करने से पहले कभी भी बचाना नहीं चाहिए। अंतर्निहित पुस्तकालय आपके लिए भागने का ख्याल रखेंगे।

प्रैक्टिस में, यदि आप तैयार कथन का उपयोग नहीं कर सकते/नहीं करेंगे, तो बचने से क्वेरी स्ट्रिंग बनाने से पहले ही तुरंत किया जाना चाहिए। इस धारणा पर अंधेरे से मत जाओ और विभिन्न सुपरग्लोबल्स (जीईटी, पोस्ट, रिक्वेस्ट, कुकीज) की सामग्री को रीमेप करें कि सब कुछ डीबी में जा रहा है। उस मामले के बारे में सोचें जहां आपको पहले फॉर्म डेटा को सत्यापित करना है, और कुछ फ़ील्ड सही ढंग से भरे नहीं हैं। अब आपको "डेटाबेस मोड" से सब कुछ अनदेखा करना होगा, और अच्छे डेटा को दोबारा फॉर्म में फिर से डालने के लिए "एचटीएमएल मोड" में फिर से भागना होगा।

वही htmlentities/htmlspecialchars के लिए जाता है। तब तक न करें जब तक आपको पता न हो कि आप HTML/XML में आउटपुट कर रहे हैं। एक बार जब आप हर जगह के हवाले/लागू करने एस्केपिंग/एन्कोडिंग जाते हैं, आप डबल एन्कोडिंग सामान का जोखिम हो सकता और इस तरह "

0

जब आप एक स्ट्रिंग से बचने के लिए एक एसक्यूएल क्वेरी कि एक mysql डेटाबेस के लिए जा रहा है में शामिल होना चाहते हैं आप mysql_real_escape_string का उपयोग करना चाहिए - कि दायरे के बाहर कुछ भी 'का उपयोग करने के लिए जब नहीं' का एक स्पष्ट संकेत होगा यह

:) यहाँ एक वर्बोज़ कार्यान्वयन है:

function clean($p) 
{ 
    if(function_exists('mysql_real_escape_string')) { 
    if(function_exists('get_magic_quotes_gpc')) { 
     if(get_magic_quotes_gpc()) { 
     $p = stripslashes($p); 
     } 
    } 
    return mysql_real_escape_string($p); 
    } else { 
    return $p; 
    } 
} 
संबंधित मुद्दे