2010-03-22 16 views
33

जब मेरी PHP स्क्रिप्ट को AJAX POST अनुरोध से डेटा प्राप्त होता है, तो $_POST चर से बच निकलता है। वास्तव में अजीब चीज यह है कि यह केवल मेरे उत्पादन सर्वर (लिनक्स पर PHP 5.2.12 चल रहा है) पर होता है और मेरे स्थानीय सर्वर पर नहीं (विंडोज़ पर PHP 5.3.1 चल रहा है)।

var pageRequest = false; 
if(window.XMLHttpRequest)  pageRequest = new XMLHttpRequest(); 
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP"); 

pageRequest.onreadystatechange = function() { } 

var q_str = 'data=' + " ' "; 

pageRequest.open('POST','unnamed_page.php',true); 

pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
pageRequest.setRequestHeader("Content-length", q_str.length); 
pageRequest.setRequestHeader("Connection", "close"); 

pageRequest.send(q_str); 

है तो ऐसा कोई कारण यह हो रहा है:

यहाँ AJAX कोड है? और मुझे इसे कैसे ठीक करना चाहिए ताकि यह दोनों सर्वरों पर काम करे?

संपादित करें:

     Local Master 

magic_quotes_gpc  On  On 
magic_quotes_runtime Off  Off 
magic_quotes_sybase Off  Off 

उत्तर

61

से आप शायद मैजिक कोट लिनक्स सर्वर पर सक्षम की हैं: magic_quotes

जब मैजिक_कोट्स पर, सभी '(एकल उद्धरण), "(दोहरे उद्धरण), \ (बैकस्लैश) कर रहे हैं और एनयूएल स्वचालित रूप से बैकस्लैश से बच निकले हैं।

वे अक्षम करने के लिए एक अच्छी चीज हैं, क्योंकि उन्हें किसी भी तरह से PHP 6 से हटाया जा रहा है। आपको अपनी स्क्रिप्ट के अंदर उन्हें अक्षम करने में भी सक्षम होना चाहिए: set-magic-quotes-runtime आप रनटाइम के दौरान पोस्ट डेटा से बचने के लिए जिम्मेदार magic_quotes के हिस्से को निष्क्रिय नहीं कर सकते हैं। यदि आप कर सकते हैं, इसे php.ini में अक्षम करें। आप ऐसा नहीं कर सकते हैं, चाहे मैजिक_कोट्स सक्षम होते हैं एक चेक करते हैं, और एक stripslashes करना() किसी भी सामग्री पर आप पोस्ट से ला नहीं:

if (get_magic_quotes_gpc()) 
$my_post_var = stripslashes($_POST["my_post_var"]); 
+0

और यह मेरे स्थानीय को नहीं तोड़ देगा सर्वर? बस यह सुनिश्चित करना चाहते हैं कि मुझे यह मिल जाए ... –

+0

@ जॉर्ज यदि आप वर्णन के अनुसार चेक करते हैं, तो यह आपके स्थानीय सर्वर के साथ काम करेगा, क्योंकि 'get_magic_quotes_gpc() 'झूठी वापसी करेगा, और कोई भी स्लैश नहीं हटाया जाएगा। इसे आज़माएं, फ़ंक्शन का परीक्षण आउटपुट करें। लेकिन सबसे अच्छी बात वास्तव में लिनक्स मशीन पर जादू उद्धरण को अक्षम करना होगा। आप एक 'phpinfo()' कर सकते हैं, यह आपको बताएगा कि क्या सक्षम है और क्या नहीं है –

+1

@ जॉर्ज यह स्लैश के साथ प्रासंगिक डेटा से स्वचालित रूप से बचकर एसक्यूएल इंजेक्शन को रोकने के लिए एक सुरक्षा उपाय था। मूल रूप से बुरा विचार नहीं, लेकिन यह कभी पकड़ा नहीं गया पर, और अंततः आपके मामले द्वारा सचित्र रूप से एक उपद्रव बन गया। –

2

हो सकता है कि आपके Linux सर्वर के php.ini मैजिक कोट में सक्षम बनाया है: मैं मैजिक_कोट्स के लिए सेटिंग निम्नवत है।

http://php.net/manual/en/security.magicquotes.php

के रूप में कार्यक्षमता हटा दिया गया है और 6

तुम इतनी

magic_quotes_gpc = Off 
तरह php.ini में अक्षम कर सकते हैं आगामी PHP में निकाल दिया जाएगा यह, ज़ाहिर है बुरा है

यदि आप अपने php.ini

<?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); 
} 
?> 
तक नहीं पहुंच पा रहे हैं तो आप इसे रनटाइम पर जांच और अक्षम कर सकते हैं।

PHP Manual

+0

मैं इसे कैसे ठीक कर सकता हूं? मैं उत्पादन सर्वर पर php.ini संपादित नहीं कर सकता। –

+0

कोड उदाहरण देखें, या अधिक पढ़ने के लिए मैन्युअल लिंक पर क्लिक करें। – alex

4

आप संभावना मैजिक कोट अपने उत्पादन वातावरण में चालू कर दिया है। phpinfo() आउटपुट का निरीक्षण करें।

आप उद्धरण पट्टी कुछ इस तरह के माध्यम से अपने आदानों की सभी चला सकते हैं:

 /* strip slashes from the string if magic quotes are on */ 
    static function strip_magic_slashes($str) 
    { 
      return get_magic_quotes_gpc() ? stripslashes($str) : $str; 
    } 
+1

मैंने phpinfo() की जांच की: सुनिश्चित करें कि, यह उत्पादन सर्वर पर सक्षम था। –

25

मैं इस अपने मामले में लागू होता है नहीं लगता है, लेकिन मैं सिर्फ एक समान समस्या हो रही थी। मैं एक साइट के साथ एक वर्डप्रेस इंस्टॉल लोड कर रहा था ताकि मैं सभी पृष्ठों पर हालिया पोस्ट दिखा सकूं।यह पता चला है कि वर्डप्रेस सभी $ _POST युद्धों से बच निकलता है, इससे कोई फर्क नहीं पड़ता कि magic_quotes क्या सेट हैं।

मैं इसका उल्लेख करता हूं क्योंकि यह पता लगाने में निराशाजनक था, और एक उत्तर के लिए googling मुझे यहाँ लाया।

यहाँ कैसे मैं इसे अपने मामले में ठीक किया गया है:

$temp_POST = $_POST; 
require '../www/wp_dir/wp-load.php'; // loading wordpress 
$_POST = $temp_POST;
+0

3 वर्षों के बाद, यह अभी भी WP 3.7 में unfixed है। – biziclop

+1

शायद यह एक सुविधा है और एक बग नहीं है। Wp-settings.php में विधि wp_magic_quotes() को बुलाया जाता है जिसे wp-include/load.php में परिभाषित किया गया है। यह विधि सुनिश्चित करता है कि वर्डप्रेस के अंदर सभी पैरामीटर मैजिक कोट्स के बावजूद उद्धृत किए गए हैं। –

+2

मुझे लगता है कि एक और सटीक वर्णन है "कोई व्यक्ति इसे एक फीचर के रूप में लक्षित करता है लेकिन परिणामों के बारे में नहीं सोचता है, इसलिए अब यह अन्य लोगों के लिए एक बग है" आसानी से इसे अपने स्वयं के उपयोग के लिए पोस्ट वर्र्स की प्रतिलिपि बनाने और फिर से बचने से वर्डप्रेस से बचा जा सकता है वहां वास्तव में पोस्ट में क्या बदल रहा है, इसे बदलने के बजाय जहां वर्डप्रेस के बाहर कुछ भी बदलावों से निपटना है। –

0

तो मैं एक वर्डप्रेस देव (https://core.trac.wordpress.org/ticket/40476#ticket) से बात की थी और उन्होंने कहा:

"वापस दिन में, कई कई चन्द्रमाओं पहले, वर्डप्रेस ने अंधेरे से यह स्वीकार करने में PHP का पालन किया कि सभी सुपरग्लोबल मानों को घटाया जाना चाहिए। PHP ने बाद में इस विचार पर एक उलटा किया जो आप आज देखते हैं, लेकिन नुकसान हो गया था, वर्डप्रेस एक आवेदन के रूप में लंबे समय तक अस्तित्व में था, और वहां पर्याप्त मौजूदा प्लगइन्स और थीम थे जो WordPress पर भरोसा करते थे, जो एक एकल एकल वातावरण बनाते थे nment कि वर्डप्रेस भी बदल रहा है उन साइटों को अपरिवर्तनीय क्षति का कारण बन जाएगा - सुरक्षा भेद्यता, उलझन सामग्री, और अन्य मजेदार चीजों का एक गुच्छा परिचय। https://core.trac.wordpress.org/ticket/18322 यह ट्रैक करने के लिए हमारा टिकट है और शॉर्टरम (और लंबी अवधि) में कुछ और अधिक हो रहा है, हम अनुरोध करेंगे कि यदि आप $ _POST चरों तक पहुंच रहे हैं तो आप इसे ऐसा करते हैं: $ myvar = wp_unslash ($ _POST [ 'परिवर्तनीय']); ताकि एक दिन, हम $ _POST को एक अनसुलझा सरणी के रूप में प्राप्त करने में सक्षम होंगे।

जवाब यहाँ दी संबंध में:

$temp_POST = $_POST; 
require '../www/wp_dir/wp-load.php'; 
$_POST = $temp_POST; 

दें कि ऐसा नहीं करते हैं। आप केवल सुरक्षा मुद्दों पर खुद को खोल रहे हैं, और आपकी सामग्री पर अप्रत्याशित चीजें हो रही हैं जहां वर्डप्रेस मानों को कम करने की अपेक्षा करता है। इसके बजाय, बस wp_unslash() का उपयोग करें, और यदि आपको अपने आप को संचालित करने के लिए वास्तव में $ _POST की एक प्रति की आवश्यकता है, तो इसे करें: $my_POST = wp_unslash($_POST);

मुझे यह भी जोड़ना चाहिए - मुझे उम्मीद है कि आप ऐसा कर रहे हैं क्योंकि आप किसी के लिए एपीआई एंडपॉइंट का उपयोग करने की कोशिश कर रहे हैं, मैं इसके बजाय वर्डप्रेस 4.7 के साथ पेश की गई आरईएसटी एपीआई का उपयोग करने के लिए स्विचिंग का सुझाव देता हूं, क्योंकि यह हमें अनुमति देता है डेवलपर्स के लिए अधिक लगातार अनुभव प्रदान करने के लिए। "

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