PHP sihirli tırnak

11 Cevap php

PHP manual göre, kodu daha taşınabilir yapmak için, onlar veri kaçmak için aşağıdaki gibi bir şey kullanmanızı öneririz:

if (!get_magic_quotes_gpc()) {
    $lastname = addslashes($_POST['lastname']);
} else {
    $lastname = $_POST['lastname'];
}

Ben sahne alacak diğer doğrulama kontrolleri var, ama yukarıdaki kesinlikle veri kaçan açısından ne kadar güvenli? Ben de sihirli tırnak nasıl Yukarıdaki kodu etkileyecektir. PHP 6'da kalktı olacağını gördüm? Ben mysql_real_escape_string gibi bir veritabanına özgü öncelemeli fonksiyonu () dayanmak zorunda tercih ederim.

11 Cevap

Magic tırnak doğal kırık. Onlar PHP komut dosyası, ama o giriş doğru sterilize etmek imkansız nasıl kullanılacağını bilmeden girdiyi ifade edildi. Eğer bir şey, sihirli tırnak etkinse _GET / $ _POST / $ _COOKIES / $ _REQUEST $ () üzerinde stripslashes çağırarak sonra, kontrol, ve sonra bir yerde kullanıyoruz noktada değişkenleri hijyen daha iyiyiz. Örneğin urlencode () Eğer bir URL kullanarak yapıyorsanız, htmlentities (), bir web sayfasına geri baskı, ya da bir veritabanına saklıyorsanız veritabanı sürücü kaçan işlevini kullanarak eğer. De bu bölü şerit alt dizileri içine recurse olabilir bir işlevi yazmak gerekebilir böylece bu giriş diziler alt diziler içerebilir unutmayın.

PHP man page on magic quotes kabul eder:

"This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged. Magic Quotes is a process that automagically escapes incoming data to the PHP script. It's preferred to code with magic quotes off and to instead escape the data at runtime, as needed."

Magic tırnak bir tasarım hatası vardı. Bunların kullanımı için aklı retainnig ile uyumsuz.

Tercihim:

if (get_magic_quotes_gpc()) {
   throw new Exception("Turn magic quotes off now!");
}

Doğal kırık kurulumları ile uyumluluk için kod yazmayın. Bunun yerine kod alarak kendi kullanımı aginst savunmak FAIL FAST.

Ben magic_quotes etkilerini tersine çevirmek için benim web sitesinin başlık dosyasında aşağıdaki kodu kullanabilirsiniz:

<?php

// Strips slashes recursively only up to 3 levels to prevent attackers from
// causing a stack overflow error.
function stripslashes_array(&$array, $iterations=0) {
    if ($iterations < 3) {
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                stripslashes_array($array[$key], $iterations + 1);
            } else {
                $array[$key] = stripslashes($array[$key]);
            }
        }
    }
}

if (get_magic_quotes_gpc()) {
    stripslashes_array($_GET);
    stripslashes_array($_POST);
    stripslashes_array($_COOKIE);
}

?>

Magic_quotes hiç yokmuş gibi Sonra benim kod kalanını yazabilirsiniz.

"Ben) (mysql_real_escape_string gibi veritabanına özgü öncelemeli fonksiyonu güvenmek zorunda değil tercih ederim"

Sonra PDO gibi bir şey kullanabilirsiniz. Ama yine sihirli tırnak tarafından yapılan hasarı tersine çevirmek için var.

Doğru, onu ve en güvenli değildir yapmak için en iyi yol değil. Kaçmak iyi sizin için kaçan ne göre yapılır. Bu, bir mysql veritabanında depolamak hesap diğer yerel, karakter setleri içine alır mysql_real_escape_string kullanmak için ise. HTML, htmlentities için. Kodu kullanmak için, escapeshellarg, escapeshellcmd. Evet, muhtemelen sihirli tırnak üzerinde ise ilk stirpslashes gerekir. Ama en iyisi saymak ya da kullanmak için değil.

Kodunuzu PHP 5.2 veya daha yüksek bir şartı koyun ve filter API kullanın. filter_* fonksiyonları doğrudan ham giriş veri erişim (onlar hiç $_POST vb dokunmayın) bu yüzden magic_quotes_gpc tamamen etkilenmemiş demektir.

Daha sonra bu örnek:

if (!get_magic_quotes_gpc()) {
    $lastname = addslashes($_POST['lastname']);
} else {
    $lastname = $_POST['lastname'];
}

Bu olabilir:

$lastname = filter_input(INPUT_POST, 'lastname');

Bir veritabanı belirli kaçan fonksiyonunu kullanarak ilgili olarak, hemen hemen gerekir. Ben sadece MySQL ile ender durumlarda başarısız addslashes() kullanarak bulduk. Eğer kullandığınız ve daha sonra incelikleri kaçış işlevini kullanırlar DB belirler hangi kaçmak için bir işlev yazabilirsiniz.

Bu deneyebilirsiniz:

if (get_magic_quotes_gpc()) { 
          $_REQUEST = array_map('stripslashes', $_REQUEST); 
          $_GET = array_map('stripslashes', $_GET);
          $_POST = array_map('stripslashes', $_POST);
          $_GET = array_map('stripslashes', $_COOKIES);

    }

"Ben) (mysql_real_escape_string gibi veritabanına özgü öncelemeli fonksiyonu güvenmek zorunda değil tercih ederim"

Ayrıca addslashes de bu yazıyı kontrol kandırdın olabilir:

http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string

Sizin örnek kod geriye, aşağıdakileri yapıyor olmalıdır edilir:

if (get_magic_quotes_gpc()) {
  $lastname = stripslashes($_POST['lastname']);
} else {
  $lastname = $_POST['lastname'];
}

Hiçbir ekstra backslash'lar ve potansiyel SQL Injection ve XSRF saldırıları ile yüklü - - ve tam olarak ne istediğinizi kullanıcı yazdığınız gibi bu tam bir 'ham' devlet içinde girdi verileri bırakır unutmayın. Daha sonra, always aşağıdakilerden birini kullandığınızdan emin olun:

  • echo HTML içine değişken ing zaman, htmlentities() sarın
  • Mysql içine koyarak, asgari olarak hazırlanmış tablolar veya else mysql_real_escape_string() kullanın.
  • echo Javascritpt koduna değişken ing zaman kullanabilirsiniz json_encode()

Joel Spolsky Making Wrong Code Look Wrong bazı iyi bir başlangıç ​​tavsiyesi var

Sadece PHP manual pages, em (anahtarları ve değerleri ile fırsatlar ...) soymak için oldukça akıllı bir yol gibi görünüyor Bu üzerinde bulundu:

if (get_magic_quotes_gpc())
{
    $_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);
    ini_set('magic_quotes_gpc', 0);
}