PHP kullanarak MySQL enjeksiyon koruma ve güvenlik işaretleri

8 Cevap php

MySQL enjeksiyon korumak için en iyi yolları nelerdir? Ben için görünmelidir zayıf yönleri nelerdir?

Ben ne olduğunu biliyorum, ama gerçekten ben nasıl olabileceğini savunmasız hiçbir fikrim yok. Kendimi ve benim, veritabanını korumak yönünde adımlar (ben olmak için ne düşündüklerini) almış olsa.

Birini durdurma herhangi bir kesin bir yolu var mı?

MEZUNLARI ... Ben PHP yazmak :)

8 Cevap

Kimseye güvenme!

Tüm girdileri - filter_var() veya regexes veya in_array() geçerli değerleri veya veri türüne bağlı olarak karma bir strateji.

Formlarını sadece - "Input" doğrudan kontrol etmediğini girdi herhangi bir kaynak anlamına gelir!

Kusurlu olma olasılığı olabilir - şey geri $_GET olsun, $_POST, $_SESSION, $_COOKIE şey sterilize.

VE

Hazırlanan ifadeleri kullanın

You have to sanitize all input. How you can do this depends on the programming languaguage and/or framework you are working with.

edit:

Eğer php kullanarak iseniz aradığınız fonksiyonu ($ string) mysql_real_escape_string edilir. Eğer veritabanında gitmeli müşteriden aldığınız her şeyi o kullanmalısınız.

Eğer hijyen araçları PHP ile sağlayan bir çerçeve kullanarak değilseniz dize Escaper inşa, orada başlamalıdır gelmiştir. Bu konuda belgeleri bulabilirsiniz within the PHP docs for mysql real escape string. Örneğin üç bakarsanız takip edebilirsiniz temelleri iyi bir fikir alırsınız.

Ben takip Başka bir yöntem uygunsa ben değişkenleri döküm emin olmaktır. Ben bir tamsayı olmak için kullanıcı girişi bekliyordum Örneğin ben aşağıdaki yapacağım:

$age = (int)$age;

Ayrıca sütun bir ya da iki değerleri (örneğin cinsiyet sütun) veritabanına içine koyarak önce PHP zorlamak emin olmak için sınırlı olması gerekiyordu eğer.

Ben herhangi bir kod (MySQL sorgusu, veri ekranı, vb) kullanmaya çalıştığınızda önce tüm giriş Bu PHP işlevini kullanın. Muhtemelen tam değil, ama sistem hack tüm temel girişimleri durdurmak gerekir:

//$linkID is the link ID of the connection to the MySQL database
function clean_input($input)
{
    GLOBAL $linkID;
    if(get_magic_quotes_gpc())
    {
        //Remove slashes that were used to escape characters in post.
        $input = stripslashes($input);
    }
    //Remove ALL HTML tags to prevent XSS and abuse of the system.
    $input = strip_tags($input);
    //Escape the string for insertion into a MySQL query, and return it.
    return mysql_real_escape_string($input,$linkID);
}

Bu sağduyu gibi görünebilir, ama ben bir süre için üzerinde takıldı.

encoding htmlentities() ve escaping mysql_real_escape_string() arasında bir fark yoktur. Ben oldukça değiştirilebilir gibi onları düşünüyordum. Ancak ... sağduyu gibi orada size söylemeyeceğim. :) Genellikle onları böyle birinci kodlama hem, kaçmak sonra uygulamak en iyisidir.

(Gerekirse) Sonra dışarı veri çekerek o zaman unencode, Unescape süreci tersine. Not adımlar gerçekleştirilir şekilde belli olan (ve tersine) baş ağrısı ve çift kaçan sıkıntılardan bir çok kazandıracak.

Eğer bir sorununuz varsa verebilecek bir işareti doğrudan kullanıcı girişi alarak ve SQL komutu içine koymak olacaktır.

Örneğin kendi kullanıcı adı isteyin. Bunu almak ve sonra sadece derseniz

"Kullanici = '$ kullanici' Kullanıcılar From * seçin;"

Böylece ve, kullanıcı daha sonra "Drop Table ... JOE '" ekleyebilirsiniz.

Perl gibi bir şey söyleyebilirim

my $sth2 = $dbh->prepare("Insert Into HostList (HostName,PollTime,Status) values (?,?,?);");
$sth2->execute($Hostname,$myDate,$Status);

Idam yöntemi daha sonra, yukarıda biri olarak patlatır bakmak ve düzgün kaçmak olurdu.

Bu konuya tüm diğer cevaplar genellikle SQL enjeksiyon mücadelede iki ana yollar önermek; fişliyor ve beyaz liste.

Büyük olasılıkla bildiğiniz gibi, kara listeye yasaklanması gerektiğini karakterler listesini yaşıyor ve beyaz liste izin verilmelidir karakterlerin listesini yaşıyor. Beyaz liste çok daha az sıklıkla değiştirmek olacağını ise hiç değilse bir, bir kara liste güncelleyerek tutmak zorunda kalabilirsiniz, çünkü beyaz liste genellikle daha güvenlidir.

Zaten bu konuya verilen beyaz liste, bir basit örnek, değişken bir tamsayı olmalıdır varsayarak, tamsayılar değişkenleri atıyor. Tehlikeli ve tehlikeli değil, dizeleri yakalanmış olacaktır.

Ne tavsiye beyaz liste ile verileri denetler, belki de düzenli ifadeler de dahil olmak üzere, kendi kod yazıyor. Rağmen, bir karakter, çok çeşitli bir dizi ile dolu olabilir girdi bir kara liste biraz daha kolaylaştırmak olabilir.

Özetle, whitelist zaman yapabilirsiniz, ve beyaz liste çok karmaşık olacağını kara. mysql_real_escape_string () gibi fonksiyonlar, ve diğer yanıtlar bahsedildi diğer şeyler, özellikleri ile size yardımcı olabilir.