Kullanıcı tarafından gönderilen form verilerini, olası güvenlik riskleri olabilecek herhangi bir karakter veya dizeye göre görüntülemek için bazı PHP doğrulama işlevlerini bir araya getirmeye çalışıyorum. Aşağıda listelenen, farkında olduğum adımları attım ama hiçbir şeye bakmadığımdan emin olmak istiyorum!Kullanıcı Tarafından Gönderilen Veriler'den hangi metnin filtrelenmesi gerekiyor?
kullanıcı tarafından sağlanan verileri filtre edilir aşağıdaki gibidir: tamsayıları için
- I is_numeric() kullanımı, ondalık sayılar içerebilen ctype_digit() doğru ya da başka numaraları için
- yanlış ise kontrol E-postalar için
- Ben filter_var() ve FILTER_VALIDATE_URL kullanmak URL'ler için filter_var() ve FILTER_VALIDATE_IP
- kullanmak IP Adresleri için filter_var() ve FILTER_VALIDATE_EMAIL
- kullanmak
- HTML kodu için şunu kullanırken strip_tags() kullanın: p, a, b, br, font, h1, h2, h3, h4, h5, h6, i, li, ol, span, ul, güçlü, div, img, makale, bölüm, üstbilgi, altbilgi, bir yana, ayrıntılar, şekil, ana, işareti, nav, özet, zaman, ön, saat, stil, yolu
- Bir RGBA için FILTER_VALIDATE_REGEXP ile filter_var() kullanın ve aşağıdaki rejeks: '/^(([0-9] | [1-9] [0-9] | 1 [0-9] [0-9] | 2 [0-4] [0-9] | 25 [0-5]),) {3} (0 (. [0-9] +)? | 1 (.0 +)?) $/'
- Zaman damgasını doğrulamak için bir tam sayı olup olmadığını kontrol ederim - ve eğer öyleyse tarihe() aktarırsanız. Eğer bir tamsayı değilse, DateTime :: createFromFormat() 'ın yorumlayabildiğini görüyorum.
Hazırlanan ifadeler kullanılarak tüm veriler MySql'ye eklenir/güncellenir. Tüm sayısal olmayan kullanıcı tarafından gönderilen veriler htmlentities ($ val, ENT_QUOTES, 'UTF-8') kullanılarak tarayıcıya gönderilir.
Şu andan itibaren kullanıcı tarafından gönderilen metin adlar, adresler, e-postalar, URL'ler içerebilir. , telefon numaraları, rgba değerleri - < div class = "paragraphtext" stili = "width: 10rem"> < h1> Header </h1 gibi bazı html formatlarını da içeren paragraflar. noktalama işareti (parantez bile) ?! </div>
Eksik olan şey, aklımda, herhangi bir güvensiz karakter veya dizge için kullanıcı tarafından gönderilen normal metni filtreleyecek bir şey ... ama ne olacağından emin değilim. Hazırlanan ifadeleri/htmlentiteleri yeterince kullanıyor mu - yoksa yapmam gereken başka bir şey var mı? Ayrıca - geçerli filtrelerimden herhangi biri yanlış mı?
GÜNCELLEME ::
Şimdilik Zaten yukarıdaki filtreleriyle ele alınmamış diğer tüm metinler için FILTER_VALIDATE_REGEXP ile filter_var() kullanmaya karar verdi. Normal ifadeler, paragraflarda kullanılmasının makul olduğunu düşündüğüm herhangi bir noktalama işaretine izin verir. Bildiğim kadarıyla, hazırlanan ifadeleri ve htmlentileri kullanarak, tırnak, eğik çizgi vb. Gibi karakterlerle ilgili sorunları çözmeliyim - bu yüzden bunun iyi olduğunu umuyorum. Herhangi bir geri bildirim harika olurdu. Bunu bulan herkesin yararına olduğu için, normal ifadeyi ihlal eden karakterlerin bir listesini çıkarmak için preg_replace kullanarak da kullanıyorum - böylece hangi karakterlerin geçersiz olduğunu bilmemize izin verebilirim. Yinelenen karakterleri filtrelemek için bazı dizi işlevleri kullanıyorum. Kod:
$rgx='[a-zA-Z0-9!#%&:;[email protected]~"\'\/\\\^\*\-\_\.\?\+\(\)\$\s]';
if(!filter_var($val,FILTER_VALIDATE_REGEXP,array('options'=>array('regexp'=>'/^'.$rgx.'+$/'))))
{
return'Error! May not contain '.implode(' ',array_unique(str_split(preg_replace('/'.$rgx.'/','',$val))));
}
. Html içeriğindeyseniz, HTML varlıkları için anlamlı olan tüm özel karakterleri dönüştürdüğünüzden emin olmalısınız. Bir özellikte bir şey çıktıysanız veya js var, vb. başka bir değerlendirme yapmanız gerekir; Sadece içerikten kaçmak yerine hazırlanan ifadeleri kullanarak ve sorgunun içine mükemmel bir şekilde koyulur - gerisi uygulama ihtiyaçlarınız üzerindedir (yani, kullanıcının e-postasının gerçekten bir e-posta olduğundan emin olun, saklayın veya doğum gününün kullanıcı tarafından sağlanan "ve" empy dizgisi "" üzerine düşmüyor vb.) – Federkun
Farkında olduğum kadarıyla, filter_var() ve FILTER_VALIDATE_EMAIL kullanarak e-postaların en azından doğru biçimde biçimlendirildiğinden emin olmalısınız.() ve DateTime :: createFromFormat() geçerli tarihleri olduğundan emin olmalıdır. Metnin htmlentities ($ val, ENT_QUOTES, 'UTF-8') biçiminde çıktısını "HTML varlıkları için anlamlı olan tüm özel karakterleri" kapsar - doğru mu? – Alan
Veriler, web sitemizdeki formlar aracılığıyla, PHP ile işlenen, MySql veritabanında saklanan, PHP kullanılarak alınabilen ve kullanıcı hesabındaki çeşitli yerlerde veya kullanıcı tarafından gönderilen html kodundan oluşturulan html belgelerindeki potansiyel olarak kullanıcı tarafından sunulur./veya metin paragrafları. – Alan