Dur!
Burada bir hata yapıyorsun. Oh, hayır, verilerinizi biraz daha güvenli hale getirmek için doğru PHP işlevlerini seçtiniz. Bu iyi. Hatanız işlem sırasına ve bu işlevleri nasıl ve nerede kullanacağınıza bağlıdır.
Kullanıcı verilerinin hijyenik hale getirilmesi ve doğrulanması, depolamak için veri çıkışı ile sunum için veri çıkışı arasındaki farkı anlamak önemlidir.
Kullanıcı Verilerini Dezenfekte Etme ve Doğrulama
Kullanıcılar veri gönderdiğinde, beklediğiniz bir şey sağladıklarından emin olmanız gerekir.
Dezenfeksiyon ve Filtreleme
Örneğin, bir sayı bekliyorsanız , gönderilen verilerin bir sayı olduğundan emin olun . Ayrıca kullanıcı verilerini başka türlere de aktarabilirsiniz. Gönderilen her şey başlangıçta bir dize gibi ele alınır, bu nedenle bilinen sayısal verileri bir tamsayı veya şamandıra olmaya zorlamak sanitizasyonu hızlı ve ağrısız hale getirir.
Serbest biçimli metin alanları ve textareas ne olacak? Bu alanlarda beklenmedik bir şey olmadığından emin olmanız gerekir. Temel olarak, HTML içeriği olmaması gereken alanların aslında HTML içermediğinden emin olmanız gerekir. Bu sorunla başa çıkmanın iki yolu vardır.
İlk olarak, HTML girişinden kaçmayı deneyebilirsiniz htmlspecialchars
. htmlentities
HTML'yi etkisiz hale getirmek için kullanmamalısınız , çünkü aksanlı ve kodlanması gerektiğini düşündüğü diğer karakterlerin kodlamasını da yapar.
İkinci olarak, olası herhangi bir HTML'yi kaldırmayı deneyebilirsiniz . strip_tags
hızlı ve kolaydır, aynı zamanda özensizdir. HTML Purifier , hem tüm HTML'yi sıyırma hem de etiketlerin ve niteliklerin seçici bir beyaz listesine izin vermenin çok daha kapsamlı bir işini yapar.
Modern PHP sürümleri , kullanıcı girişini sterilize etmek için kapsamlı bir yol sağlayan filtre uzantısı ile birlikte gelir .
onaylama
Gönderilen verilerin beklenmedik içerikten arınmış olduğundan emin olmak işin sadece yarısıdır. Ayrıca gönderilen verilerin gerçekten üzerinde çalışabileceğiniz değerleri içerdiğinden emin olmanız gerekir.
1 ile 10 arasında bir sayı bekliyorsanız, bu değeri kontrol etmeniz gerekir. Bir döndürücü ve adımlarla yeni süslü HTML5 dönemi sayısal girişlerinden birini kullanıyorsanız, gönderilen verilerin adımla uyumlu olduğundan emin olun.
Bu veriler açılır menüden olması gerekiyorsa, gönderilen değerin menüde görünen değer olduğundan emin olun.
Diğer ihtiyaçları karşılayan metin girdileri ne olacak? Örneğin, tarih girişleri strtotime
veya DateTime sınıfı aracılığıyla doğrulanmalıdır . Belirtilen tarih, beklediğiniz aralıklar arasında olmalıdır. E-posta adresleri ne olacak? Daha önce bahsedilen filtre uzantısı , bir adresin iyi biçimlendirildiğini kontrol edebilir, ancak ben is_email kütüphanesinin hayranıyım .
Aynısı diğer tüm form kontrolleri için de geçerlidir . Radyo düğmeleriniz mi var? Listeye göre doğrulayın. Onay kutularınız mı var? Listeye göre doğrulayın. Bir dosya yüklemeniz mi var? Dosyanın beklenen türde olduğundan emin olun ve dosya adına filtre uygulanmamış kullanıcı verileri gibi davranın.
Her modern tarayıcı, herkesin formunuzu manipüle etmesini önemsiz hale getiren tam bir geliştirici araçları seti ile birlikte gelir. Kodunuz, kullanıcının form içeriğiyle ilgili tüm istemci tarafı kısıtlamalarını tamamen kaldırdığını varsaymalıdır !
Depolama için Veriden Kaçış
Verilerinizin beklenen biçimde olduğundan ve yalnızca beklenen değerleri içerdiğinden emin olduğunuza göre, bu verileri depolamaya devam etmek konusunda endişelenmeniz gerekir.
Her bir veri depolama mekanizmasının, verilerin düzgün bir şekilde kaçtığından ve kodlandığından emin olmak için belirli bir yolu vardır. SQL oluşturuyorsanız, sorgularda veri aktarmanın kabul edilen yolu yer tutucularla hazırlanmış ifadelerdir .
PHP'deki çoğu SQL veritabanıyla çalışmanın daha iyi yollarından biri PDO uzantısıdır . Bir deyim hazırlamak , değişkenleri deyime bağlamak , sonra deyimi ve değişkenleri sunucuya göndermek için ortak bir kalıp izler . Daha önce PDO ile çalışmadıysanız, oldukça iyi bir MySQL odaklı eğitim .
Bazı SQL veritabanlarının SQL Server , PostgreSQL ve SQLite 3 dahil olmak üzere kendi özel uzantıları vardır . Bu uzantıların her biri PDO ile aynı hazırla-bağla-yürüt tarzında çalışan açıklama desteği hazırladı. Bazen standart olmayan özellikleri veya davranışları desteklemek için PDO yerine bu uzantıları kullanmanız gerekebilir.
MySQL'in de kendi PHP uzantıları vardır. Aslında ikisi. Sadece mysqli denileni kullanmak istersiniz . Eski "mysql" uzantısı kullanımdan kaldırılmıştır ve modern çağda kullanımı güvenli veya mantıklı değildir.
Ben şahsen mysqli hayranı değilim. Hazırlanan ifadeler üzerinde değişken bağlanma gerçekleştirme şekli esnek değildir ve kullanımı bir acı olabilir. Şüphe duyduğunuzda bunun yerine PDO kullanın.
Verilerinizi saklamak için bir SQL veritabanı kullanmıyorsanız, verilerin nasıl güvenli bir şekilde aktarılacağını belirlemek için kullandığınız veritabanı arabiriminin belgelerine bakın.
Mümkün olduğunda, veritabanınızın verilerinizi uygun bir biçimde sakladığından emin olun. Sayıları sayısal alanlarda saklayın. Tarihleri tarih alanlarında saklayın. Parayı kayan nokta alanında değil ondalık bir alanda saklayın. Farklı veri türlerinin nasıl düzgün bir şekilde saklanacağına ilişkin veritabanınız tarafından sağlanan dokümanları inceleyin.
Sunum için Veriden Kaçış
Kullanıcılara her veri gösterdiğinizde, kaçmaması gerektiğini bilmediğiniz sürece verilerin güvenli bir şekilde kaçtığından emin olmalısınız .
HTML yayınlarken, neredeyse her zaman başlangıçta kullanıcı tarafından sağlanan verileri iletmeniz gerekir htmlspecialchars
. Aslında, ne zaman bunu yapmamalıyız tek zamandır biliyoruz kullanıcı HTML sağladığını ve bunu biliyorum zaten bir beyaz liste kullanarak temizlenmiş oldu o.
Bazen PHP kullanarak bazı Javascriptler oluşturmanız gerekir. Javascript HTML ile aynı çıkış kurallarına sahip değil! PHP üzerinden Javascript'e kullanıcı tarafından sağlanan değerler sağlamanın güvenli bir yolu vardır json_encode
.
Ve dahası
Veri doğrulamasında çok daha fazla nüans var.
Örneğin, karakter kümesi kodlaması büyük bir tuzak olabilir . Başvurunuz " UTF-8 " de belirtilen uygulamaları izlemelidir . Dize verilerini yanlış karakter kümesi olarak ele aldığınızda oluşabilecek varsayımsal saldırılar vardır.
Daha önce tarayıcı hata ayıklama araçlarından bahsetmiştim. Bu araçlar aynı zamanda çerez verilerini değiştirmek için de kullanılabilir. Çerezler güvenilir olmayan kullanıcı girişi olarak ele alınmalıdır .
Veri doğrulama ve çıkış, web uygulaması güvenliğinin yalnızca bir yönüdür. Kendinize karşı savunma oluşturabilmeniz için web uygulaması saldırı yöntemlerinden haberdar olmalısınız .