2011-07-10 4 views
5

मेरा सर्वर व्यवस्थापक हाल ही में PHP 5.3 में अपग्रेड किया गया है और मुझे एक अजीब "बग" (या feature मिल रहा है, क्योंकि PHP लोगों के पास यह है)। मेरे पास स्पष्ट सुरक्षा कारणों के लिए मेरे अधिकांश स्ट्रिंग फॉर्म डेटा के आसपास mysql_real_escape_string था, लेकिन अब ऐसा लगता है कि यह भागने PHP द्वारा पहले ही किया जा चुका है।

<?php 

echo $_GET["escaped"]; 

?> 

<form method="get"> 
    <input type="text" name="escaped" /> 
</form> 

यह outputs, अगर मैं उदाहरण escape 'this test', escape \'this test\' के लिए दर्ज करें। अगर मैं GET के बजाय POST का उपयोग करता हूं तो वही होता है।

क्या यह सीधे 5.3 अपग्रेड से जुड़ा हुआ है या क्या मेरे व्यवस्थापक ने php.ini फ़ाइल में कुछ स्वचालित स्विच ट्रिगर किया है?

इसके अलावा, क्या मुझे इसे छोड़ना चाहिए (अगर यह वास्तव में एक अच्छा असफल सबूत तंत्र है जो सभी को सही ढंग से प्राप्त करता है और चर को पोस्ट करता है), या मुझे इसे अक्षम करना चाहिए (यदि यह भी संभव है!) और जाओ mysql_real_escape_string पर वापस? मेरी हिम्मत मुझे बताती है कि दृष्टिकोण 2 सबसे अच्छा होगा, लेकिन दृष्टिकोण 1 कुछ हद तक स्वैच्छिक होगा। :)

संपादित करें: असल में, मुझे इसे अक्षम करने की आवश्यकता है। कभी-कभी मैं फॉर्म डेटा इकट्ठा करता हूं और कुछ गलत होने पर क्लाइंट फॉर्म में भेजता हूं (यानी गायब फ़ील्ड), इसलिए मैं नहीं चाहता कि उसे कहीं भी दिखाई न दे।

+0

यह भी ध्यान दिया जाना चाहिए कि यदि आपकी 'php.ini' फ़ाइल में एक वाक्यविन्यास त्रुटि है, तो डिफ़ॉल्ट' magic_quotes_gpc' को सक्षम करना है। इसलिए यदि आपको लगता है कि आपने अपनी कॉन्फ़िगरेशन फ़ाइल में 'magic_quotes_gpc' को अक्षम कर दिया है, तो संभव है कि फ़ाइल में आपकी कॉन्फ़िगरेशन को लागू होने से रोकने में त्रुटि हो सकती है। निजी अनुभव। : पी –

उत्तर

11

इस में http://www.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc विकल्प "फीचर" को magic_quotes_gpc के रूप में जाना जाता है और नहीं है सभी एसक्यूएल इंजेक्शन हमलों से आपको बचाएं (addslashes इनपुट सुपरग्लोबल्स जैसे $_POST और $_GET के प्रत्येक तत्व पर कॉल किया जाता है। यह वास्तविक इनपुट/डेटाबेस एन्कोडिंग को अनदेखा करता है)। इसलिए इसे बहिष्कृत किया गया है और should not be used है।

आधिकारिक PHP मैनुअल includes a neat way to undo it in php code, लेकिन आपको को से बंद करना चाहिए।

+0

इसे पूर्ववत करने का "साफ" तरीका धीमा है, यह ओ (एन) है, बहुत बुरा नहीं है लेकिन अभी भी भारी इनपुट के साथ समस्याएं पैदा कर सकता है। –

+0

@ निकलास ए। यह धीमा हो सकता है, लेकिन पहली नजर में, यह जादू उद्धरण पूर्ववत करने का सबसे तेज़ तरीका है। क्या आप विस्तार कर सकते हैं कि इस कोड को कैसे सुधार किया जा सकता है? और यदि पूरे पोस्ट बॉडी का आकार 'n' है, तो * किसी * एल्गोरिदम पर टेक्स्ट एन्कोडिंग पूर्ववत करने से ओ (एन) ले जाएगा, है ना? – phihag

+0

नहीं, ज़ाहिर है कि कोई अन्य समाधान नहीं है। मेरा मतलब केवल php.ini को संशोधित करना एक बेहतर समाधान है :) –

6

यह magic quotes के कारण है, आपको इसे बंद करना चाहिए।

और यहाँ कैसे आप इसे बंद है: http://www.php.net/manual/en/security.magicquotes.disabling.php

आप या तो php.ini के माध्यम से या $_GET और $_POST में सभी चर से स्लैश को हटाने के द्वारा यह कर, स्पष्ट रूप से पूर्व जाना सुझाया गया तरीका है।


विल मार्टिन से पता चलता है कि आप भी एक .htaccess इस तरह के माध्यम से इसे बदल सकते हैं:

 
php_flag magic_quotes_gpc off 

अधिक यहाँ जानकारी: http://php.net/manual/en/configuration.changes.php

+0

स्वीकार करेगा जब एस/ओ मुझे देता है। इस तरह की एक पागल "फीचर" कभी नहीं पता लगाया जा सकता है।मेरे व्यवस्थापक से इसे अक्षम करने के लिए कहा, क्योंकि दुख की बात है, ini_set काम नहीं करेगा। Grr। – Lazlo

+0

ini_set केवल उन चीजों पर काम करता है जो स्क्रिप्ट के पारदर्शी होने के बाद होता है और दुख की बात है कि भागने से पहले होता है। जादू उद्धरण बुरा हैं और केवल समस्या का कारण बनता है, उन्हें हल नहीं करता है। विशेष रूप से लोग सामान के लिए उन पर भरोसा कर सकते हैं। –

+2

आप इसे .htaccess का उपयोग करके अक्षम कर सकते हैं - पृष्ठ को पारदर्शी होने से पहले ऐसा होता है। आपके .htaccess में 'php_flag magic_quotes_gpc off'। –

1

ऐसा लगता है कि आपके सर्वर में जादू उद्धरण चालू हैं - आप http://www.php.net/manual/en/security.magicquotes.disabling.php पर उन्हें अक्षम करने के तरीकों की पूरी तरह से चर्चा के लिए देख सकते हैं।

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