Gitmek için iyi bir yol filter_var mı?

5 Cevap php

Veri filtreleme için filter_var herhangi bir iyi mi? Kötü veri ne tür filtre olacak? I mysql_real_escape_string kullanmak yok ama filter_var yardımcı olacaktır ekleyerek acaba?

5 Cevap

SQL enjeksiyon kullanımı savunmak için ifadeleri mümkünse hazırlanmıştır. Değilse, (int) döküm veya intval () tamsayılar için, (float) veya floatval () yüzer ve addcslashes için GİBİ tabloların içinde kullanılacak dizeleri için ($ girdi, '% _'), dizeleri için mysql_real_escape_string kullanın. RLIKE tabloların içinde kullanılacak dizeleri kaçmaya çalışırken işler daha da karmaşık bir hal alır.

Filtreleme HTML içeriği için, iyi ($ allowable_tags geçmeden) strip_tags olurdu, ama ... / en uygun çözüm olduğu durumda, istediğiniz gibi olmayabilir:

$escaped = htmlspecialchars($input, ENT_QUOTES, $your_charset);

Daha güvenilir bir çözüm HTML Purifier gibi bir kitaplık kullanmak olacaktır

Filtre fonksiyonları Tamam, ama bazıları filtrelerin daha validatörler. Ihtiyaçlarınıza bağlı olarak yararlı bazılarını bulabilirsiniz.

Sen [(3)] (aslında güvenli hale getirmek için veri ayarlama *) veri FILTER_* sabitleri . It sounds like you're looking for sanitisation ile kullanmak yerine {{tarafından [(0)]} ayarlayın } (veriler kontrol güvenlidir).

Farkli filtreler farklı görevleri ile yardımcı olabilir. mysql_real_escape_string bu HTML içerebilir veri çıkışı için hiç iyi bir SQL enjeksiyonu önlemek için verileri hijyen için ok iken. Burada günlük işler için kullanmak istiyorum filtre ait bir çift:

  • FILTER_SANITIZE_SPECIAL_CHARS -, (sökmeden) HTML kodunu gösteren XSS saldırıları önleme ve HTML öğeleri semboller dönüştürmek için yararlıdır.
  • FILTER_SANITIZE_STRING STRIP_LOW/HIGH bayraklarıyla - aslında (strip_tags bakınız) HTML kaldırır.
  • FILTER_SANITIZE_URL - * URL'leri güvenli hale getirir.
  • FILTER_SANITIZE_EMAIL - Ben adresini saklamadan önce doğrulama kuzeni kullanmayı tercih ediyorum rağmen, e-posta adresleri güvenli hale getirir.

* Ben güvenli gevşek kullanın, ben çok emin olamaz görüşünde değilim.

Gerçekten yapmak için çalışıyoruz ne bağlıdır, ben gerçekten özelliklerini bilmeden cevap veremem. Mümkün filtreleri ve etkileri burada listelenmiştir: Types of filters

. iyi, c ancak üst düzey etki alanlarının listesi sabit değil dışlamak için üst düzey etki filtre olabilir - bu tüm örnek a@b-.c için geçerli bir url veya geçerli bir e-posta, tarafından ne anlama bağlıdır. Üstelik tüm karakterler geçerlidir. Bu garip görünüyor ve neredeyse kesinlikle geçerli olmasa da, birçok regex filtreler de bunu doğrular. E-posta a@b-.c veya url http:// ile. görüntülenen veya bağlantılarda kullanılır eğer onlar hiçbir yere gitmek bile, hiçbir zarar vermeyeceğim.

Ben sorunun bir parçası sizin filtreleri istiyorsun nasıl gevşek bir soru olduğunu düşünüyorum. Büyük bir endişe XSS ya da SQL enjeksiyon veya başka bir değer kullanılabilir alakasız olabilir, bu nedenle filtre bu tür hile yapabilirsiniz olsun ya da olmasın, tehlikeli girişi engelliyor eğer. Eğer değer sadece güvenli değil aynı zamanda kullanışlı olmadığından emin olmak isterseniz, bu yanıltıcıdır canavar.

Sadece bazı ufak testlere dayanarak, ben filter_var 's sabitleri güvenilir olmadığı sonucuna vardım.

Örneğin:

filter_var('a@b-.c', FILTER_VALIDATE_EMAIL); // valid
filter_var('http://.', FILTER_VALIDATE_URL); // valid
filter_var('a@b-.c', FILTER_SANITIZE_EMAIL); // a@b-.c
filter_var('http://.', FILTER_SANITIZE_URL); // http://.

Bu sabitler açıkça geçersiz değerler vardır, ama pas filter_var 's. filter_var güvenmiyorum.