Neden $ _POST değişkenler PHP kaçtı alıyorsanız?

5 Cevap php

Benim PHP komut dosyası bir AJAX POST isteği verileri aldığında, $_POST değişkenleri kaçtı. Gerçekten garip bir şey bu sadece benim üretim sunucusunda olur (Linux üzerinde PHP 5.2.12 çalıştıran) ve benim yerel sunucuda (Windows üzerinde PHP 5.3.1 çalıştıran) değil olmasıdır.

İşte AJAX kodu:

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);

Bu oluyor herhangi bir neden var mı? Ve hem sunucularda çalışır böylece bu nasıl düzeltmek gerekir?

Düzenleme: Ben magic_quotes için aşağıdaki ayarları vardır:

                     Local   Master

magic_quotes_gpc     On      On
magic_quotes_runtime Off     Off
magic_quotes_sybase  Off     Off

5 Cevap

Muhtemelen sihirli tırnak Linux sunucu üzerinde etkin: magic_quotes

Magic_quotes üzerine, bütün '(tek tırnak), "(çift tırnak), \ (ters eğik çizgi) ve NULL karakterleri otomatik olarak bir ile öncelenmedikçe zaman.

Onlar itibaren zaten PHP 6 kaldırılması olacak gibi Onlar, devre dışı bırakmak için iyi bir şeysin. You should also be able to disable them inside your script: set-magic-quotes-runtime Sen çalışma sırasında POST verileri kaçan sorumlu magic_quotes bir kısmını devre dışı olamaz . Eğer yapabilirsen, php.ini de devre dışı bırakın. Bunu yapamıyorsanız, magic_quotes etkin olup olmadığını bir kontrol yapmak ve POST alınamayacak herhangi bir içerik üzerinde stripslashes () yapın:

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

Bu artık PHP 5 onaylanmaz ve PHP 6 kaldırılacaktır Magic Quotes olarak bilinen PHP "özelliği" dir.

It is easy to disable the silly nuisance in php.ini.

Ben bu durumda geçerli sanmıyorum, ama sadece benzer bir sorunu vardı. Ben tüm sayfalarda son mesajları göstermek böylece bir Wordpress bir site ile birlikte yükleyin yükleme oldu. Bu Wordpress olursa olsun ayarlanır ne magic_quotes, tüm $ _POST değişkenler kaçar çıkıyor.

Bunu anlamaya sinir bozucu ve beni buraya getiren bir cevap googling çünkü ben o söz.

İşte benim durumda düzelttim nasıl:

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

Muhtemelen sihirli tırnak üretim ortamında üzerinde döndü. phpinfo() çıkışını kontrol edin.

Sen tırnak şerit için böyle bir şey aracılığıyla tüm girdilerinin çalıştırabilirsiniz:

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

Belki Linux sunucunun php.ini etkin sihirli tırnak vardır.

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

Işlevselliği önerilmiyor ve önümüzdeki PHP 6 silinecektir gibi bu, elbette kötü.

Bunu gibi php.ini bunu devre dışı bırakabilirsiniz

magic_quotes_gpc = Off

Eğer php.ini erişemiyorsanız eğer zamanında test ve devre dışı bırakabilirsiniz

<?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 Gönderen