2013-10-18 13 views
6

Örneğin name alanı içeren kayıt formumda bir alan var, veritabanı user_name varchar(20) adında bir alanda depolanacak.hangisi önce performans göstermelidir? dezenfekte etme veya doğrulama

<?php 
if(emptiy($_pos['name']) || strlen($_post['name'])>20) 
//send an not valid input error 
else{ 
$name=htmlspcialchars($_post['name']); 
//check for sql injection; 
//insert name into database;} 
?> 

kullanıcı <i> some one </i> gibi bir ad eklerseniz dize uzunluğu böylece başka parçası performe edecek ve adı olacaktır 17 şudur: i aşağıdaki kodla bu alan frist doğrulamak eğer ben kullanıcı girişi doğrulamak gerektiği açıkça görülüyorsa &lt;i&gt some one &lt;/i&gt;, bu kez db.in 'e eklenirken bir hata üretecek olan uzunluğu 28'tir. Eğer kullanıcısına, girişinin çok sünger olduğu konusunda bir hata gönderirseniz, kafam karışacaktır. ne yapmalıyım? en iyi yaklaşım nedir?

+5

Verileri saklamadan önce asla şifrelememelisiniz. Ham olarak saklayın ("mysqli_real_escape_string" veya benzeri gibi doğru kaçış kullanarak) ve çıktı almadan önce kodlayın. Bunun nedeni, HTML veya JSON veya başka bir şey olarak çıktıysanız, farklı kodlamaya ihtiyaç duymasıdır. SQL enjeksiyon durdurmak için –

+3

en iyi yöntem veritabanına veri girmek için mysqli PDO hazırlanan deyimi kullanmaktır. @ [Niet Koyu Absol] (http://stackoverflow.com/users/507674/niet-the-dark-absol) olduğu sağ ama mysqli_real_escape_string() işlevi kullanımdan kaldırılmıştır. – nurakantech

+0

Asla “mysqli_real escape_string()” gibi işlevler kullanmayın, çünkü daha güvenlidir. – naazanin

cevap

6

Genel olarak ilk önce - "sizin korumanız ve onlarınkileriniz için." Bu, geçersiz karakterleri çıkarmayı içerir (elbette karakter kodlamasına duyarlı). Bir alan sadece karakter ve boşluk içermeli, önce olmayan bir şeyi çıkar.

Bittiğinde, sonuçları doğrulayın - zaten kullanılan ad (benzersiz alanlar için), doğru boyut mu, boş değil mi?

Verdiğiniz nedeni, kullanıcı deneyimini en üst düzeye çıkarmak için doğru olanıdır. Bundan kaçınmak için kullanıcıyı şaşırtmayın. Bu, & yapıştırma davranışından kurtulmaya yardımcı olur, ancak dikkatli olmanız gerekir; eğer adımın "Ke $ h @" şeklinde kaydedilmesini istiyorsanız, "Keh" olarak değiştirilebiliyor olabilir veya olmayabilir. İkinci olarak, aynı zamanda hataları önlemek de mümkündür.

Özel karakterlere izin vermeyen kullanıcı adları oluşturmak istediğinizde ne olur? Eğer "Brian" girersem ve sistemimiz onu zaten kullanımda olan isim olarak reddederse, ben "Brian $" gönderirim? Önce bunu doğrulayın, kullanımda değil, sonra özel karakterleri çıkarırsınız ve "Brian" ile kalırsınız. Uh oh - şimdi ya TEKRARLAMAYI doğrulamak zorundasınız, ya da hesap oluşturmanın başarısız olduğu (örneğin, veritabanınız benzersiz kullanıcı adları gerektiriyorsa) veya daha kötüsü, başarılı ve aşırı yazma/bozulma olacak bir hata iletisi alırsınız. kullanıcı kullanıcı hesaplarına oluşur.

Başka bir örnek, minimum alan uzunlukları: eğer bir adla ilgili en az 3 harf uzunluğunda ve yalnızca harfleri kabul ediyorsanız ve ben "hayır" yazarak reddedersiniz; ama "no @ # $%" yazıyorsam, geçerli olduğunu (uzun sürebilir), sanitize etmeyi ve artık geçerli olmadığını söyleyebiliriz.

Bundan kaçınmanın kolay yolu, önce dezenfekte edilir ve sonra doğrulama hakkında iki kere düşünmek zorunda değilsiniz. Bununla birlikte, Niet depolamadan önce verileri kodlama konusunda haklıydı; çıktıları HTML'ye uygun şekilde kodlamak genellikle çok daha kolaydır, daha sonra düz metni (metin kutularına, JSON dizelerine vb. giriş yapmak istediğinizde) çözmeyi unutmayın. Kullanacağınız çoğu test vakası, HTML öğelerine sahip verileri içermez, bu nedenle kolayca yakalanamayan aptalca hataların tanıtılması kolaydır.

Büyük sorun, böyle bir hatanın tanıtılması durumunda, kolayca çözülemeyen veri bozulmasına yol açabilmesidir. Örnek: Düz metniniz var, html varlıklar gibi bir metin alanına yanlış yazdıysanız, form geri gönderilir ve siz onu yeniden kodlarsınız ... her açıldığında/yeniden gönderildiğinde yeniden kodlanır. Meşgul bir site/form ile binlerce farklı kodlanmış girdiyle sonuçlanabilir ve HTML kodlaması yapılmasının gerekip gerekmediğini belirlemek için net bir yol yoktur.

Enjeksiyondan korumak iyidir, ancak HTML kodlaması bunu yapmak için tasarlanmamıştır (ve bunlara güvenilmemelidir).

+0

arasında bazı boşluklar vardı, kabul ediyorum ki Brian'a girdiğinizde, ilk saniteze girdiğinizde ve sonuçta Brian olacak ve bunu doğrulayacak ve benzersiz, tamam, kayıtlı olduğunuzu ve giriş yapmak istediğinizde, girdiğinizde Brian ve tekrar giriş yaptıktan sonra girdiyi dezenfekte edeyim mi? böylece yeh eğer ben dışarı merhaba Brian koymak olmalıdır ve Kullanıcı sen girdiyi zorunda olduğunu haber vermeli Brian'a $ – naazanin

+1

girilen nedeniyle bu derste size karıştı ediyorum - ben bile böyle bir durumda kadarıyla önermek olarak gideceğini geçersiz olduğunu girdiğinde kullanıcıya bir hata verirsiniz. –

+0

@naazanin Genellikle gdscei ile aynı fikirdeyim. Orada, kullanıcıya geçersiz çıktıyı sorma konusunda daha nazik davranıyorum, sunucu tarafında iki modelden birini seçmem olasıdır: 1) çalışmasını ve kullanıcılara gerek duymuyorsa, kullanıcıyı rahatsız etmeyin ya da 2) geçersiz girdiyi reddedin ve kullanıcının ne yapacağını anlamasına izin verin. Bu, kullanım durumunuza bağlı olacaktır ve global bir öneri sunamıyorum. Uygulamanız ne kadar uluslararası olursa, potansiyel olarak geçerli karakterleri yasaklamanız konusunda daha dikkatli olmanız gerekir. – BrianHall

2

Hayır, önce doğrulamanız gerekir. Son adım olan datastorage seviyesinin üstesinden gelmek için sanitasyon yapılır. İş kuralları doğrulama aşamasını geçmezse, veri depolama seviyesine yaklaşmanın bir anlamı yoktur. Bir sayıya ihtiyacınız varsa ve bir dize verildiyse, bu bir hatadır, böylece onları forma geri gönderirsiniz. Eğer gerekli ifadeleri içeren SQL kullanırsanız ve aslında girdiyi bozarsa, gerekli olması halinde (5.4'ten itibaren gerekli değildir) striptizler hariç olmak gerekli değildir.