Barındırma paylaşılan sihirli tırnak nasıl kapatılır?

12 Cevap php

PHP'nin sihirli tırnak kapatmak istiyorum. Ben php.ini erişimi yok.

Benim. Htaccess dosyasına php_flag magic_quotes_gpc off eklemeye çalıştım, ben bir 500 iç sunucu hatası alıyorum. . Bu benim htaccess dosyası gibi görünüyor:

AddType x-mapp-php5 .php
php_flag magic_quotes_gpc off

Sonra ini_set('magic_quotes_gpc', 'O') kullanmaya çalıştı, ama hiçbir etkisi vardı.

Nasıl sihirli tırnak kapatabilirim?

12 Cevap

Başı olarak the manual sık sık paylaşılan mod_php kullanılmaz hosting, ve php_value direktifi üzerine özel bir php.ini yükleyebilirsiniz böylece bir hataya yol açmaktadır. Suexec / FastCGI kurulumları için herhangi bir durumda bir başına site alanı php.ini olması oldukça yaygındır.

-

I O (büyük harf o) ini bayrağını ayarlamak için geçerli bir değer olduğunu sanmıyorum. Eğer 1/0, doğru / yanlış, ya da "on" / "off" değeri kullanmanız gerekir.

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

EDIT

list of ini settings kontrol ettikten sonra, ben bu magic_quotes_gpc bir PHP_INI_PERDIR ini_set() Eğer bunu değiştirmek mümkün değil anlamına gelir, (4.2.3 sonra) ayarı (sadece görmek PHP_INI_ALL ayarları değiştirilebilir ini_set())

. - VEYA - sihirli tırnak etkilerini tersine çevirmek için bir komut dosyası uygulamak Bu ne demektir, bir htaccess bunu yapmak için dosyayı kullanmak zorunda olduğunu. Böyle bir şey

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

Php_flag size 500 Internal Server Error s veriyor neden diyemem, ben PHP manual sihirli tırnak üzerinde ise tespit ve superglobals onu sıyırma bir örneği olduğunu işaret eder zamanı. Diğerleri yayınlanmıştır aksine, bu bir özyinelemeli ve düzgün diziler tırnak şerit olacak:

Güncelleme: Ben yerine süper globalleri başvurular kullandığı PHP kılavuzda aşağıdaki kod yeni bir versiyonu var ki bugün fark ettim.

Eski sürüm:

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

Yeni sürüm:

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

Bu bir yerel php.ini dosyası oluşturduğunuzda "bulunamadı Sınıf 'PDO'yu'" alma sorunu çözecektir.

Eğer (zaten Pete Bailey tarafından verilen nedenlerle) htaccess dosyasını kullanarak sihirli tırnak kapatamazsınız, sadece:

  1. Bir metin dosyası oluşturun
  2. 'Php.ini' için yeniden adlandırın
  3. Satırları ekleyin

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

  4. Bu komut yürütme hangi dizin / ler için kaydedin.

Güncelle:. Eğer yeni php.ini dosyasının sadece bir kopyasına sahip olmak istiyorsanız, o zaman kök htaccess dosyasına bu satırı ekleyin:

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

Açıkçası bunu zaten orada değil, bu konuma ini dosya taşımak gerekir.

O birisi sadece beni aldı 2 saat kaydeder umuyoruz!

. Bir htaccess dosyası içinde php_flag ve php_value teknik açıdan doğru - ama PHP için sadece bir Apache modülü olarak yüklenir. Paylaşılan bir bilgisayar üzerinde böyle bir kurulum bulmak neredeyse asla; PHP (dosyaların dışarı sunucu komşuları tutmak) güvenlikle ilgili nedenlerden dolayı, bunun yerine bir CGI olarak çalıştırın ve yolu PHPsuExec yerine apache kullanıcı 'Size' olarak komut çalışır.

Apache böylece bir sunucu hatası veriyor doğrudur: PHP modülü yüklü sürece php_flag anlamı hakkında bilmiyor. Bir CGI ikili yerine harici bir program apache olduğunu ve Apache içinde yapılandırmak olamaz.

Şimdi iyi haber: Eğer dizin başına yapılandırma 'php.ini' Orada adında bir dosya koyarak ve sistemin ana php.ini olarak aynı sözdizimini kullanarak orada ayar talimatlarına kurabilirsiniz. PHP manual bütün ayarlanabilir direktiflerini sıralıyor: Sadece sistem yöneticisi sunucu çapında php.ini bu işaretlenmiş PHP_INI_SYSTEM ayarlayabilirsiniz yaparken, PHP_INI_PERDIR veya PHP_INI_ALL ile işaretlenmiş olanlar ayarlayabilirsiniz.

Böyle php.ini yönergeleri altdizinlerde miras değil unutmayın, onlara kendi php.ini vermek gerekecek.

PHP 5.3 çalıştırıyorsanız + bu hile yapacak olursa, sayfanızın en üstte yerleştirin:

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

Tuşları, değerleri ve çok boyutlu diziler Kolları.

======================== =============== MY SOLUTION ============================ (rename your php.ini to php5.ini)

(!) ve üst olarak, bu ekleyin:

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

. sonra htaccess olarak, (üst) ekleyin:

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

P.S. değişim /home/your_path/to/ doğru (tipik bir. php dosyasından <?php phpinfo(); ?> komutunu çalıştırarak bu yolu görebilirsiniz.)

Ben bu cevap geciktim biliyorum, ama cevapların en çok okunan ve çok büyük iken, sadece djn actually explained why you were getting this 500 Internal Server Error.

Onun açıklama% 100 doğru iken, bu her zaman bir <IfModule> bu sarmak niçin mükemmel bir örneğidir. Bu .htaccess, it will at least prevent the 500 hata bu bayrakları ayarlamak mümkün olmayan gerçek sorunu çözmek değil iken.

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

Ya da eski sürümleri için <IfModule mod_php.c> vb olurdu

Ben böyle 500 hataları önlemek için daima bunu yapmanın bir alışkanlık yapmaya çalışın. Bundan sonra, sadece uygulamak what Peter Bailey said.

Farklı hosting sağlayıcıları bu iş için farklı prosedürler var, bu yüzden ben kendi forumlarında sormak ya da bir destek talebi dosyası.

Bunları kapatmak değil, her zaman ne olursa olsun sihirli tırnak açık veya kapalı olup olmadığı girişini kaçış hangi böyle bir şey kullanıyor olabilir:

//using mysqli

public function escapeString($stringToBeEscaped) {

    return $this->getConnection()->real_escape_string(stripslashes($stringToBeEscaped));
}
  1. Eğer AddType satırını kaldırın eğer çalışır mı? Ben o sihirli kapalı tırnak dönüm alakalı neden pek emin değilim.

  2. PHP mod_php altında çalışıyorsa, htaccess çalışmaz. Bir CGI olarak çalışır mı?

Bu gerçekten hosting şirketi için biridir.

Bunu kapatamazsınız, burada ben genelde ne olduğunu:

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

Bu, kendi doğru biçimde veritabanında yerleştirilecektir.

BaileyP cevabı zaten oldukça iyidir, ama ben onun yerine bu durumu kullanmak:

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

Daha defansif olduğunu.

Peki $_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); 
}