PHP: kullanıcı girişi temizliği için yeterli mysql_real_escape_string mı?

10 Cevap php

Çoğu durumlarda kullanıcı girişi temizlik için mysql_real_escape_string yeterli mi?

:: EDIT ::

SQL enjeksiyon önlemek açısından çoğunlukla düşünüyorum ama sonuçta ben uygulama ve veritabanları çevresinde geçmek önce verileri temizlemek için ekstra önlemler almalıdır eğer mysql_real_escape_string uygulamak veya sonra kullanıcı verilerini güvenebilirsiniz bilmek istiyorum.

HTML karakter için temizlik önemli olan nerede görmek ama kullanıcı girişi güvenen için gerekli düşünün olmaz.

T

10 Cevap

mysql_real_escape_string tüm durumlarda yeterli değil ama kesinlikle çok iyi bir arkadaşım. better çözelti, Prepared Statements kullanıyor

//example from http://php.net/manual/en/pdo.prepared-statements.php

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

Ayrıca, unutmak HTMLPurifier herhangi geçersiz / şüpheli karakterleri atmak için kullanılabilir değil.

...........

Edit: Based on the comments below, I need to post this link (I should have done before sorry for creating confusion)

mysql_real_escape_string() versus Prepared Statements

Quoting:

mysql_real_escape_string() prone to the same kind of issues affecting addslashes().

Chris Shiflett (Güvenlik Uzmanı)

Sorunuzun cevabı () () Tüm SQL enjeksiyon durmuyor tüm kullanıcı girişi ve mysql_real_escape_string için uygun değildir sayılı mysql_real_escape_string olduğunu. addslashes () php kullanmak için popüler bir fonksiyonu olduğunu ve aynı sorun var.

savunmasız kodu:

mysql_query("select * from user where id=".mysql_real_escape_string($_GET[id]));

poc istismar:

http://localhost/sql_test.php?id=1 or sleep(500)

Yama kimliği etrafında tırnak işaretleri kullanmak için:

mysql_query("select * from user where id='".mysql_real_escape_string($_GET[id])."'");

Gerçekten iyi yaklaşım insanların bir dizi işaret olmayacaklarını parametrized sorguları kullanmaktır. PDO iyi çalışıyor, adodb php için popüler bir kütüphanedir.

Eğer kullanırsanız mysql_real_escape_string sadece sql enjeksiyon için kullanılmalıdır, ve başka bir şey. Güvenlik açıkları verileri nasıl kullanıldığını son derece bağlıdır. Bir fonksiyon bazında bir fonksiyonu güvenlik önlemleri uygulamak gerekir. Ve evet, XSS bir VERY SERIOUS PROBLEM olduğunu. Html için filtreleme değil bir hacker sizi pw3n için kullanacağı ciddi bir hatadır. xss faq okuyunuz.

Veritabanına, evet. Eğer yeterli de çıkışı için / kodlama verileri kaçan düşünmek isteyeceksiniz.

Ayrıca olmasını beklediğiniz karşı validating girişini düşünmelisiniz.

Eğer kullanmayı düşündünüz mü prepared statements? PHP veritabanı ile etkileşim için çeşitli yollar sunar. Bunların çoğu mysql_ * fonksiyonları daha iyidir.

PDO, MDB2 ve MySQL Improved başlamak gerekir.

Ne durumlar?

SQL sorguları için, bu harika. (- Bunun için PDO oylamak - Hazırlanan tablolar iyi ama işlevi sadece iyi kaçar.) HTML ve benzeri için, bu iş için bir araç değildir - bir genel {[(1)] deneyin } ya da benzeri bir daha hassas alet HTML Purifier.

To address the edit: Eğer ekleyebilirsiniz yalnızca diğer katmanı veri valdation olduğunu, örneğin Eğer veritabanına bir tamsayı koyarak, ve pozitif bir tamsayı bekliyoruz, negatif bir tamsayı koymak için çalışırken kullanıcıya bir hata döndürür onaylayın. Bildiğim kadarıyla veri bütünlüğü ile ilgili olarak, mysql_real_escape_string (gerçi, yine hazırlanmış tablolar tamamen kaçan kaçınan bir süpürge sistemi vardır) kaçmak için var en iyisidir.

mysql_real_escape_string(), yalnızca SQL enjeksiyon saldırıları önlemek için yararlıdır. Bu çapraz site scripting saldırıları önlemede size yardımcı olmayacaktır. Bunun için, sadece başlangıçta kullanıcı girişi elde edilen verileri çıktısını almadan htmlspecialchars() kullanmalısınız.

Gitmek için en iyi yolu kullanmak olacaktır Prepared Statements

Biri (diğer yanıtlar belirtildiği gibi) hazırlanmış ifadeleri kullanmak için, ama şimdi Veritabanına iki istekleri göndermek zorunda çünkü bir yerine, app yavaşlatacak iki yolu vardır. Eğer düşük performans ile yaşayabilir, o zaman ne duruyorsunuz; Hazırlanan Tablolar kodunuzu güzel ve başa çıkmak için daha kolay hale getirir.

Eğer mysql_real_escape_string kullanmayı seçerseniz, o zaman güvenilmeyen tüm dizeleri kaçış emin olun. An (mysql_real_escape_string) escaped string is SQL Injection secure. Tüm dizeleri kaçış yoksa, o zaman güvenli değildir. Gerçekten girişi doğrulama ile mysql_real_escape_string birleştirmek gerekir; Eğer bir sayı tutun bekliyoruz değişken gerçekten bir numara ve beklenen aralığında olduğunu kontrol. Kullanıcıya güven asla unutmayın.

"Temizlik" farklı türleri vardır.

mysql_real_escape_string veritabanı veri için yeterli, ancak HTML ise yine ekranın üzerine tarayıcı tarafından değerlendirilecektir.

Kullanıcı girişi HTML kaldırmak için kullanabilirsiniz strip_tags.

Ben doğru dışarı kutusunun hazırlanan ifadeleri destekler, ve bu sizin için geçersiz veri kaçışa kolu olarak, PDO yerine düzenli MySQL malzeme kullanarak içine bakmak öneririz.

Ben PHP 5.2 + çeşitli şekillerde kullanıcı girdileri olabilir giriş filtresi fonksiyonlara sahip olduğunu eklemek istiyorum düşündüm.

İşte manual entry yanı sıra blog post [Matt Butcher] onlar büyük demektir neden.

Sen olarak, hem de deneyebilirsiniz

function clean_input($instr) {

     // Note that PHP performs addslashes() on GET/POST data.
     // Avoid double escaping by checking the setting before doing this.
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($instr);
    }
    return mysql_real_escape_string(strip_tags(trim($instr)));
}