Sihirli tırnak işaretleri olmadan, kullanıcı verilerini kaçan

5 Cevap php

Ben düzgün ya da uygulama kontrolü için kullanılan alır önce dış dünyadan gelen verileri kaçmak için nasıl bir göz alıyorum, depolama, mantık .. bu tür şeyler.

Açıkçası, sihirli tırnak php 5.3.0 + kısaca onaylanmaz direktifi ve biz sevmiyorum (eski kod korurken PHP6 kaldırıldı, bu, yükseltme ve yeni dil özellikleri içine almak isteyen herkes için, daha acil hale o ..).

Ancak, ben görmedim tek şey size veri korumalı bir kez ne ile teori / iyi uygulama hakkında çok tartışma - örneğin, ya da eğik çizgi olmadan saklamak için? Ben şahsen DB veri kaçan tutmanın kötü bir hareket olduğunu düşünüyorum, ama tartışma duymak ve tercihen bazı vaka çalışmaları okumak istiyorum ..

Sadece başvuru için PHP kılavuzda bazı bağlantılar:

PHP Manual - mysql_real_escape_string

PHP Manual - htmlspecialchars

vs vs

Herhangi bir ipucu?

5 Cevap

Hazırlanan tabloların bir göz atın. Mysql bu çok iyi çalışıyor ve databse için veri alma güvenli bir şeklidir biliyorum. O da bir kaç performans faydaları vardır.

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

Eğer ilgileniyorsanız ben biraz daha fazla kaynak var.

Bu tc arıyorsanız ne olduğunu umuyoruz.

Edit:

I ekleyebilir tek şey hazırlanmış tablolar ile birlikte filtreleri kullanıyor. Değer FILTER_SANITIZE_STRING veya FILTER_SANITIZE_EMAIL kullanmak e-posta için kullanmak bir acı Örneğin eğer kontrol etmek.

Bu kod bir miktar tasarruf ve çok iyi çalışıyor. Her zaman sonra kendi yöntemleri kullanarak verileri kontrol edebilirsiniz, fakat kullanabilirsiniz filtreleri bir yeri vardır.

  • Use correct method of escaping data when running queries: mysql_real_escape_string, prepared queries, etc...

  • Veritabanında değiştirilmemiş veri saklama

  • Use correct method of escaping data on output: htmlspecialchars vb.

Veritabanı iş için, parametreli sorgular ve hazırlanmış deyimleri kontrol edin. PDO ve mysqli Bunun için iyi.

Htmlspecialchars html belgelerinde bazı metin görüntülemek için doğru araçtır.

Eğer php 5.3 mentionned Ve, filter functions, kullanıcı verilerini işlerken bir zorunluluk kullanımı vardır erişebilirsiniz.

Veritabanı çözümü kullanmaktır ekler için bind variables.

Genel olarak, her zaman kendinizi bir şey kaçan bulmak (bir kabuk komutunun argümanı, db komut parça, kullanıcı tarafından sağlanan html, vb), bu {[(0 kullanarak, doğru işlev çağrısı (örn. kullanarak değil gösterir )]} Eğer exec), ya da çerçeve eksik olduğu bir multi-arg formu kullanabilirsiniz zaman. Bir eksik çerçevede çalışan standart yaklaşım alıntı düşünmeden geri böylece onu geliştirmek için olduğunu.

Kaçan düzeyleri ve eğlenceli olabilir alıntı düzeyleri hakkında düşünüyorsunuz, ama sen gerçekten zevk eğer boş zamanlarında Tcl ile oynayabilir. Diğer insanların kullanması için bir kütüphane tasarımı sürece gerçek iş için, size düzgün alıntı ve kullanıcılar alıntı düşünmeye önlemek izin hangi durumda, alıntı düşünmeye edilmemelidir. (Ve çok dikkatli belge gerektiğini tam olarak yapmak ve yapmıyoruz alıntı ne tür)

Bu basit. TÜM gelen verileri veritabanına takmadan önce mysql_real_escape_string() ile koştu edilmelidir. Eğer bir şey, örneğin bir tamsayı olması gerekiyor biliyorum, bu sadece SQL enjeksiyon durdurmak için olduğunu unutmayın, vb takmadan önce, bir tam sayıya ayarlayın. XSS ve veri doğrulama farklıdır.

Eğer bir şey bir e-posta olmak istiyorsanız, tabii ki veritabanına eklemeden önce doğrulamak gerekir.

htmlentities() modify verisini, yani verileri temizler. Ben her zaman veritabanında ham veri depolamak gerektiğini düşünüyorum ve bu verileri kapmak zaman, sonra sterilize etmek istiyorum nasıl seçersiniz.

Ben mysql_real_escape_string() fonksiyonu için bir "sarıcı" olarak aşağıdaki işlevi kullanmak ister.

function someFunction( $value )
{
    if ( is_int( $value ) || is_float( $value ) ) {
    	return $value;
    }
    return "'" . mysql_real_escape_string( (string) $value ) . "'";
}

Değer bir şamandıra veya bir tamsayı ise, o zaman mysql_real_escape_string() çalışan hiçbir nokta yoktur. Bazen değer bir dize olmayabilir çünkü mysql_real_escape_string() geçirmeden önce bir dize değeri döküm nedenidir.

An example of the value not being a string:

http://localhost/test.php?hello[]=test

Test.php içeride, çalıştırmak mysql_real_escape_string() $ _GET üzerinde ['merhaba'] merhaba bir dize bekliyor. Kişinin bir dizi değerini ayarlamak beri merhaba bir dize değil beri Eh, aslında bir uyarı neden olacaktır.