HTML form metin alanları ne için kontrol etmelisiniz?

3 Cevap php

Ben gönderilen formda metin kutusu verilerini kapmak için bir PHP komut dosyası yazıyorum. Bu basit metin kutuları vardır ve herhangi bir HTML etiketleri kabul etmek istemiyorum. Ben en azından strip_tags () ve addslashes () kullanmak gerektiğini düşünüyorum. Başka bir şey? Ben standart olmayan karakterler ararlar için normal bir ifade kullanmalısınız ben, alphanumerics için girişi kısıtlayan sakıncası olmaz?

Bu aslında (öf) işlenmesi kişiye e-postayla alır basit bir şeklidir. (Hayır ne yazık ki veritabanı.) Ve bu basit veri, şeylerin ilk ve son isim çeşit bulunuyor.

Edit: I'd also like to know specifically what I should be looking for. What's the consensus on reasonable input filtering?

3 Cevap

PHP filter functions kullanın.

Sen girişi sanitasyon ve girişi (örneğin e-posta adresleri) doğrulamak için kullanabilirsiniz.

Doğrulama için iki yaklaşım (bu da güvenlik ve diğer pek çok şey için geçerlidir) vardır.

Öncelikle, açıkça izin verilmeyen hangi bunun dışında herhangi bir şey sağlamak için varsayılan. Yoksa ti özel izin olanı hariç her şeyi izin vermeme varsayılan.

Genellikle ikinci bir yaklaşım konuşma daha güvenli olduğunu ve (örneğin, o izin ne bilmek sadece çok zor, bir sayılmayan kullanıcılar için bir uygulama yapıyoruz değil zorlayıcı bir neden var durumlar dışında kullanılması gerektiğini güvenlik tehdidi ve benzeri).

Ancak bu kullanırken dikkatli olmak gerekir. 'Gibi insanların isimleri karakterler için - mükemmel geçerli ama naif uygulamaları bunları kısıtlayabilir vardır. Ne genellikle kaçınmak istiyorum:

  • SQL injection: always kullanmak mysql_real_escape_string() herhangi girişi;
  • XSS (çapraz site scripting): genellikle kullanıcı girişi HTML etiketlerini dışarı şerit olmalıdır konuşma. Siz tabii ki bazen onları (örneğin zengin metin editörü kutuları) izin vermek zorunda olacak, ancak bu durumlarda bile, izin ve tüm diğerleri (özellikle etiketleri) dışarı şerit gereken etiketlerin bir listesi var; ve
  • Tpically sen (? ASCII 20 altında veya çok) düşük karakterler şerit olmalıdır; ve
  • Lütfen uluslararasılaşma gereksinimlerine bağlı olarak (ASCII 127 yukarıda) yüksek karakterler şerit isteyebilirsiniz.

Kullanmak için iyi bir varsayılan değerdir:

$var = filter_var($var, FILTER_SANITIZE_STRING);

ama durum için doğru filtreyi seçin.

Bu çok net değil cevapları sürü ile çok sık sorulan bir soru. Addslashes () gibi fonksiyonları aslında bazı kurulumları yarardan çok zarar getirebilir. Kullanıcı girişi ile uğraşırken izlenmesi gereken bazı temel kurallar, hiçbir şey güvenmiyorum ve bunu bekliyoruz biçiminde değilse, denemek ve sadece bir hata yükseltmek bunu düzeltmek yok.

Eğer sadece alfanümerik gerekiyorsa, o zaman basit bir regex o idare edecek ama biraz daha bilgi yardımcı olacaktır.

Ne veri ile yapıyor olacak? Nasıl, örneğin, giriş taşıma şu anda (veya planlama üzerindeki), kullanıcı, (a comment motoru gibi) daha sonra ekrana bir DB formu ve mağaza verileri işlemek, bir formu gönderir.

Düzenleme: işlemek için bir insan için e-posta yoluyla bir metin kutusu göndermek kadar basit değilse. Benim en büyük endişeleri XSS ve SMTP başlık enjeksiyon (e-posta gönderiliyor nasıl bağlı) olurdu. Deneyin ve sadece bir regex kullanmak ve sadece bunu kabul şimdi alfa-sayısal veri almak gerekiyorsa, basit çözüm ile gitmek. Başka bir çözüm ENT_QUOTES ile htmlentities kullanmak olacaktır.

Ben herhangi bir HTML etiketleri kabul etmek istemiyorum. Ben en azından sayisinda strip_tags kullanmak gerektiğini düşünüyorum ()

Belki, ama insanlar sadece Küçüktür ve büyüktür demek '<' / '>' karakterleri yazın ve etiketleri ile ilgisi olmayan izin istiyorum.

Ücretsiz metin alanları için girişi gerçekten olmayan satır kontrol karakterleri (ki genellikle hiçbir yerde istemiyorum) çok daha fazla filtre, ve UTF-8 kullanıyorsanız, geçersiz / gereksiz dizileri istemeyeceksiniz .

Sonra ne zaman çıktı tabii htmlspecialchars () böylece kullanımı hatırlar geri sayfaya değer '<' < 'kaçtı ve ekranda' <', bir literal olarak görünür, doğru olur? Ne olursa olsun bu dize başka bir yerde bir form gönderme veya veritabanı veya gelen olsun, () bir şablon HTML içine bir metin değer çıktısı her zaman htmlspecialchars kullanarak gerekir.

Belirli bir yasak biçimi maç için tüm girdi istiyorum non-free-metin alanları için, o zaman evet, bir regexp bu maç için iyi bir yol olabilir.

ve addslashes ().

addslashes () hemen hemen her zaman yanlış bir şey. Dikkat etmeniz gereken bir kural şudur: Bu kullanmayın.

Bu gerçek SQL dize literal kaçış biçimi eşleşmiyor çünkü addslashes () SQL kaçan yetersiz olduğunu, bu nedenle addslashed zaman hala tehlikeli dizeleri oluşturabilirsiniz. Eğer MySQL kullanarak olduğunuzda, yerine () mysql_real_escape_string kullanmalısınız. Diğer veri tabanları kendi özel öncelemeli işlevlere sahiptir. (Eğer her SQL elle metin kaçmak zorunda kalmamak ya, kolay kullanım parameterised sorguları) bunları kullanın.

(O tüm HTML özel karakterler ile bir şey yapmak için teşebbüs etmez çünkü addslashes () HTML kaçış için yetersizdir. İşte bunun için ne değil.)

Her durumda, çıktı-kaçan giriş filtreleme aşamada başa çıkmaya çalışırken ters. Bunun yerine, düz metin olarak uygulama iç tüm dizeleri tutmak ve uygulamanın dışında onları yolda kaçmayı: Onlar bir SQL sorgusu, htmlspecialchars'dan (katılmak için dışarı gidiyoruz zaman mysql_real_escape_string) onlar gidiyoruz zaman dışında bir HTML sayfası üzerine, vb.