DB bağlanmadan mysql_real_escape_string Alternatif

4 Cevap php

Ben DB bağlantısı olmadan kuru test yapmak gerekir zamanlarda olarak veritabanına bağlanma olmadan mysql_real_escape_string gibi bir işlev davranıyor var istiyorum. mysql_escape_string kalktı ve bu nedenle de arzu olmasıdır. Benim bulgular bazıları:

http://www.gamedev.net/community/forums/topic.asp?topic_id=448909

http://w3schools.invisionzone.com/index.php?showtopic=20064

4 Cevap

Bu güvenli bir şekilde DB bağlantısı olmadan bir dize kaçmak mümkün değildir. Onlar uygun karakter kümesini kullanarak dize kaçış böylece mysql_real_escape_string() ve hazırlanan tablolar veritabanına bir bağlantı gerekir - aksi SQL enjeksiyon saldırıları çoklu-bayt karakterler kullanılarak hala mümkündür.

Sadece iseniz testing, o zaman sen de mysql_escape_string(), SQL injection saldırılarına karşı% 100 garantili değil kullanabilir, ama bir DB bağlantısı olmadan daha güvenli bir şey inşa etmek imkansız.

Peki, mysql_real_escape_string function başvuru sayfasına göre: "mysql_real_escape_string () aşağıdaki karakterleri kaçar MySQL kütüphane fonksiyonu mysql_real_escape_string çağırır: \ x00 \ n, \ r, \, '," ve \ x1a. "

Aklınızda ile, daha sonra deftere ikinci bir bağlantı verilen fonksiyon tam olarak neye ihtiyacınız var olmalıdır:

function mres($value)
{
    $search = array("\\",  "\x00", "\n",  "\r",  "'",  '"', "\x1a");
    $replace = array("\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z");

    return str_replace($search, $replace, $value);
}

Benim diğer cevaba doğrudan karşı, bu aşağıdaki işlev hatta çoklu-bayt karakterler ile, muhtemelen güvenlidir.

// replace any non-ascii character with its hex code.
function escape($value) {
    $return = '';
    for($i = 0; $i < strlen($value); ++$i) {
        $char = $value[$i];
        $ord = ord($char);
        if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126)
            $return .= $char;
        else
            $return .= '\\x' . dechex($ord);
    }
    return $return;
}

Yukarıdaki kod çalışmaz neden kendimden daha bilgili birisi bana söyleyebilir umuyorum ...

Dan daha fazla araştırma, buldum:

http://dev.mysql.com/doc / refman/5.1/en/news-5-1-11.html

Security Fix:

Bir SQL injection güvenlik delik çok bayt kodlama işleme bulunmuştur. Hata yanlış mysql_real_escape_string () C API işlevi ile kaçtı dize ayrıştırma, sunucu oldu.

Bu güvenlik açığı keşfetti ve Josh BERKUS'ın tarafından bildirilmiştir josh@postgresql.org ve Tom Lane tgl@sss.pgh.pa.us OSDB konsorsiyum arası proje güvenlik işbirliğinin bir parçası olarak. SQL enjeksiyon hakkında daha fazla bilgi için, aşağıdaki metni bakın.

Tartışma. Bir SQL enjeksiyon güvenlik delik çok bayt kodlama işleme bulunmuştur. Bir SQL injection güvenlik açığı, bir kullanıcı veritabanına eklenecek verileri temin edildiğinde, kullanıcı sunucu yürütecek veri içine SQL ifadeleri enjekte olabilir sayede bir durum içerebilir. Karakter kümesi-habersiz öncelemeli (PHP örneğin, addslashes ()) kullanılan bu güvenlik açığı, getirmedi, bu (örneğin, SJIS, bıg5 ve GBK) bazı multi-byte karakter setleri kaçan atlamak mümkündür. Sonuç olarak, bu tür addslashes () gibi bir işlev SQL enjeksiyon saldırıları önlemek mümkün değildir. Bu sunucu tarafında bu düzeltmek mümkün değildir. Uygulamalar bir işlev gibi mysql_real_escape_string () tarafından sunulan öncelenimin karakter kümesi-farkında kullanmak için en iyi çözümdür.

Ancak, bir hata MySQL sunucusu mysql_real_escape_string çıkışını () ayrıştırmak nasıl tespit edildi. Sonuç olarak, karakter kümesi-farkında fonksiyonu mysql_real_escape_string () kullanıldığı zaman bile, SQL enjeksiyon mümkün oldu. Bu hata düzeltildi.

Geçici. Eğer mysql_real_escape_string de hata () ayrıştırma için düzeltmeyi içeren bir sürümüne MySQL yükseltmek için veremiyoruz, fakat MySQL 5.0.1 veya daha yüksek çalıştırırsanız, geçici bir çözüm olarak NO_BACKSLASH_ESCAPES SQL modunu kullanabilirsiniz. (Bu mod MySQL 5.0.1 tanıtıldı.) NO_BACKSLASH_ESCAPES ters eğik bir özel karakter kabul edilmez bir SQL standart uyumluluk modu, sağlar. Sonuç sorgular başarısız olacağını olacaktır.

Geçerli bağlantı için bu modu ayarlamak için, aşağıdaki SQL deyimini girin:

SET sql_mode = 'NO_BACKSLASH_ESCAPES';

Ayrıca, tüm müşterileri için küresel modunu ayarlayabilirsiniz:

SET GLOBAL sql_mode = 'NO_BACKSLASH_ESCAPES';

Sql-mode = NO_BACKSLASH_ESCAPES veya sunucu seçeneği dosyasında sql-mode = NO_BACKSLASH_ESCAPES (örneğin, my.cnf veya my.ini ayarlayarak - sunucu komut satırı seçeneğini kullanarak başladığında bu SQL mod da otomatik olarak etkin olabilir ,) sizin sisteminize bağlı. (Bug # 8378, CVE-2006-2753)

Ayrıca Hata # 8303 Bkz.