php साझा होस्टिंग पर जादू उद्धरण कैसे बंद करें?




magic-quotes-gpc (11)

मैं PHP के जादू उद्धरण को बंद करना चाहता हूं। मेरे पास php.ini तक पहुंच नहीं है।

जब मैंने php_flag magic_quotes_gpc off को मेरी .htaccess फ़ाइल में php_flag magic_quotes_gpc off करने का प्रयास किया, तो मुझे 500 आंतरिक सर्वर त्रुटि मिल गई। यह मेरी है। Htaccess फ़ाइल इस तरह दिखती है:

AddType x-mapp-php5 .php
php_flag magic_quotes_gpc off

तब मैंने ini_set('magic_quotes_gpc', 'O') का उपयोग करने का प्रयास किया, लेकिन इसका कोई प्रभाव नहीं पड़ा।

मैं जादू उद्धरण कैसे बंद करूँ?


मुझे पता है कि मुझे इसका उत्तर देने में देर हो चुकी है, लेकिन मैंने अधिकांश उत्तरों को पढ़ा और कई महान थे, केवल डीजेएन ने वास्तव में समझाया कि आपको यह 500 Internal Server Error क्यों मिल रही है।

जबकि उनकी व्याख्या 100% सही थी, यह एक आदर्श उदाहरण है कि आपको हमेशा उन्हें <IfModule> में क्यों लपेटना चाहिए। हालांकि यह आपकी .htaccess को आपके .htaccess में सेट करने में सक्षम नहीं होने की वास्तविक समस्या को ठीक नहीं करेगा, यह कम से कम 500 त्रुटि को रोक देगा

<IfModule mod_php5.c>
    # put all of your php_flags here, for example:
    php_flag magic_quotes_gpc off
</IfModule>

या पुराने संस्करणों के लिए यह <IfModule mod_php.c> आदि होगा।

मैं ऐसी किसी भी 500 त्रुटियों से बचने के लिए हमेशा ऐसा करने की आदत बनाने की कोशिश करता हूं। इसके बाद, बस पीटर बेली ने जो कहा वह लागू करें।


$_SERVER बारे में कैसे?

if (get_magic_quotes_gpc() === 1) {

    $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true);
    $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true);
    $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true);
    $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true); 
    $_SERVER = json_decode( stripslashes(json_encode($_SERVER,JSON_HEX_APOS)), true); 
}

यदि आप इसे बंद नहीं कर सकते हैं, तो मैं आमतौर पर यही करता हूं:

get_magic_quotes_gpc() ? $_POST['username'] : mysql_real_escape_string($_POST['username']);

इसे डेटाबेस में अपने उचित प्रारूप में रखा जाएगा।


  1. यदि आप AddType लाइन को हटाते हैं तो यह काम करता है? मुझे पूरा यकीन नहीं है कि यह जादू उद्धरण बंद करने के लिए प्रासंगिक क्यों है।

  2. यदि PHP mod_php के अंतर्गत नहीं चल रहा है, तो htaccess काम नहीं करेगा। क्या यह एक सीजीआई के रूप में काम करता है?

यह वास्तव में आपकी होस्टिंग कंपनी के लिए एक है।


एक .htaccess फ़ाइल के अंदर php_flag और php_value तकनीकी रूप से सही हैं - लेकिन PHP के लिए केवल अपाचे मॉड्यूल के रूप में स्थापित किया गया है। एक साझा मेजबान पर आपको लगभग ऐसा सेटअप कभी नहीं मिलेगा; PHP सुरक्षा के कारणों से आपके सीजीआई के रूप में चलाया जाता है (आपके सर्वर पड़ोसियों को आपकी फाइलों से बाहर रखते हुए) और जिस तरह से phpsuexec अपाचे उपयोगकर्ता के बजाय 'आप' के रूप में स्क्रिप्ट चलाता है।

अपाचे इस प्रकार आपको सर्वर त्रुटि देने में सही है: PHP phfl_flag के अर्थ के बारे में यह नहीं पता जब तक कि PHP मॉड्यूल लोड नहीं होता है। एक सीजीआई बाइनरी अपाचे को इसके बजाय बाहरी प्रोग्राम करना है, और आप इसे अपाचे के भीतर से कॉन्फ़िगर नहीं कर सकते हैं।

अब अच्छी खबर के लिए: आप ' php.ini ' नाम की एक फ़ाइल डालकर प्रति-निर्देशिका कॉन्फ़िगरेशन सेट अप कर सकते हैं और उसी वाक्यविन्यास का उपयोग करके अपने निर्देशों को सिस्टम के मुख्य php.ini में सेट कर सकते हैं। PHP मैनुअल सभी सेटटेबल निर्देशों को सूचीबद्ध करता है: आप PHP_INI_PERDIR या PHP_INI_ALL के साथ चिह्नित चिह्नित कर सकते हैं, जबकि केवल सिस्टम व्यवस्थापक सर्वर-व्यापी php.ini में चिह्नित चिह्नित PHP_INI_SYSTEM सेट कर सकता है।

ध्यान दें कि ऐसे php.ini निर्देश उपनिर्देशिका द्वारा विरासत में नहीं हैं, आपको उन्हें अपना स्वयं का php.ini देना होगा।


यदि आप PHP 5.3+ चला रहे हैं तो यह चाल करेगा, इसे अपने पृष्ठ के शीर्ष पर रखें:

if (get_magic_quotes_gpc() === 1)
{
    $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true);
    $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true);
    $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true);
    $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true);
}

हैंडल कुंजी, मान और बहु-आयामी सरणी।


======================== =============== मेरा समाधान ========= =================== (php5.ini पर अपने php.ini का नाम बदलें)

और शीर्ष (!) में, इन्हें जोड़ें:

magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
extension=pdo.so
extension=pdo_mysql.so

फिर। htaccess में, इसे जोड़ें (शीर्ष में):

SetEnv PHPRC /home/your_path/to/public_html/php5.ini

पीएस चेंज /home/your_path/to/ (आप एक सामान्य .php फ़ाइल से <?php phpinfo(); ?> कमांड निष्पादित करके उस पथ को देख सकते हैं।)


जबकि मैं यह नहीं कह सकता कि php_flag आपको 500 Internal Server Error क्यों दे रहा है, मैं यह इंगित करूंगा कि PHP मैनुअल में यह पता लगाने का एक उदाहरण है कि क्या जादू उद्धरण चालू है और रनटाइम पर सुपरग्लोबल्स से इसे अलग कर रहा है। पोस्ट किए गए अन्य लोगों के विपरीत, यह एक पुनरावर्ती है और सही ढंग से सरणी से उद्धरण पट्टी करेगा:

अद्यतन: मैंने आज देखा कि PHP मैनुअल पर निम्न कोड का एक नया संस्करण है जो इसके बजाय सुपर-ग्लोबल्स के संदर्भों का उपयोग करता है।

पुराना संस्करण:

<?php
if (get_magic_quotes_gpc()) {
    function stripslashes_deep($value)
    {
        $value = is_array($value) ?
                    array_map('stripslashes_deep', $value) :
                    stripslashes($value);

        return $value;
    }

    $_POST = array_map('stripslashes_deep', $_POST);
    $_GET = array_map('stripslashes_deep', $_GET);
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
?>

नया संस्करण:

<?php
if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}
?>

बेलीप का जवाब पहले से ही बहुत अच्छा है, लेकिन मैं इसके बजाय इस स्थिति का उपयोग करूंगा:

if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() === 1){
  $_POST = array_map( 'stripslashes', $_POST );
  $_GET = array_map( 'stripslashes', $_GET );
  $_COOKIE = array_map( 'stripslashes', $_COOKIE );
}

यह अधिक रक्षात्मक है।


जब आप स्थानीय php.ini फ़ाइल बनाते हैं तो यह "क्लास 'पीडीओ नहीं मिला" की समस्या को हल करेगा।

यदि आप htaccess फ़ाइल (पीट बेली द्वारा पहले से दिए गए कारणों के लिए) का उपयोग कर जादू उद्धरण को बंद नहीं कर सकते हैं:

  1. एक टेक्स्ट फ़ाइल बनाएं
  2. इसे 'php.ini' पर पुनर्नामित करें
  3. लाइनें जोड़ें

    magic_quotes_gpc = बंद
    magic_quotes_runtime = बंद
    magic_quotes_sybase = बंद
    विस्तार = pdo.so
    विस्तार = pdo_mysql.so

  4. इसे निर्देशिका / ies में सहेजें जिसमें आपकी स्क्रिप्ट निष्पादित हो रही हैं।

अपडेट करें: यदि आप नई php.ini फ़ाइल की केवल एक प्रतिलिपि रखना चाहते हैं तो इस पंक्ति को अपनी रूट में जोड़ें। Htaccess फ़ाइल:

SetEnv PHPRC /path/to/site/root/public_html/php.ini

जाहिर है आपको इनआई फ़ाइल को इस स्थान पर स्थानांतरित करने की आवश्यकता है, जो पहले से नहीं है।

उम्मीद है कि किसी को 2 घंटे बचाता है, यह सिर्फ मुझे ले गया है!


मैनुअल के अनुसार आप साझा होस्टिंग पर अक्सर एक कस्टम php.ini इंस्टॉल कर सकते हैं, जहां mod_php का उपयोग नहीं किया जाता है और php_value निर्देश इस प्रकार एक त्रुटि का कारण बनता है। सुएक्सैक / फास्टसीजीआई सेटअप के लिए किसी भी मामले में प्रति-वेबस्पेस php.ini आम बात है।

-

मुझे नहीं लगता कि ओ (अपरकेस अक्षर ओ) एक आईएनआई ध्वज सेट करने के लिए एक वैध मान है। आपको एक सच्चे / झूठे, 1/0, या "चालू" / "ऑफ" मान का उपयोग करने की आवश्यकता है।

ini_set( 'magic_quotes_gpc', 0 );   // doesn't work

संपादित करें

PHP_INI_PERDIR सेटिंग्स की सूची जांचने के बाद, मुझे लगता है कि magic_quotes_gpc एक PHP_INI_PERDIR सेटिंग (4.2.3 के बाद) है, जिसका अर्थ है कि आप इसे PHP_INI_ALL ini_set() साथ नहीं बदल सकते हैं (केवल PHP_INI_ALL सेटिंग्स को PHP_INI_ALL ini_set() साथ बदला जा सकता है)

इसका मतलब यह है कि आपको ऐसा करने के लिए .htaccess फ़ाइल का उपयोग करना होगा - या - जादू उद्धरण के प्रभावों को दूर करने के लिए एक स्क्रिप्ट को कार्यान्वित करना है। कुछ इस तरह

if ( in_array( strtolower( ini_get( 'magic_quotes_gpc' ) ), array( '1', 'on' ) ) )
{
    $_POST = array_map( 'stripslashes', $_POST );
    $_GET = array_map( 'stripslashes', $_GET );
    $_COOKIE = array_map( 'stripslashes', $_COOKIE );
}




magic-quotes-gpc