PHP ile uygulamalarımızın güvenliğini iyileştirin

İçindekiler
PHP bir form aracılığıyla girilen verileri manipüle etmemizi sağlayan çok yönlü bir dil olarak ortaya çıktı. HTMLElbette bünyesinde bundan daha fazla araç ve yetenek var.
Çok yönlülüğü ve kullanım kolaylığı, onu basit iletişim formlarından başlangıçta büyük uygulamaların temeli olmaya kadar değişen web projeleri için dünya çapında en yaygın kullanılan dillerden biri haline getiriyor. Facebook.
Çok yönlülük ve kullanım kolaylığı ile ilgili sorun, geliştiricinin güvenli kod yazmaya zorlanmaması, ancak çok güvensiz özelliklerle kodun mükemmel bir şekilde çalışması ve sorunların ortaya çıktığı yer burasıdır.
Web uygulaması güvenliği, başlangıçtan itibaren sahip olmadığınız bir şeydir. PHPAncak bu, onu güvensiz bir dil yapmaz, çünkü güvenlik, bir programcının komut dosyalarına uygulamak için bilmesi gereken bir dizi teknik ve çalışma stiline karşılık gelir.
çerçevelerGörünüşü ile doğrudur çerçeveler Birçok güvenlik özelliği varsayılan olarak dahil edilmiştir, ancak her geliştirici bir çerçeve eski uygulamalarda ve bazı işlevler için bir çerçeve fazlalık olmak.
Uygulamalarımızda güvenliği sağlamanın anahtarları PHP Bunlar: kullanıcının forma girdiği verileri kontrol etme ve hassaslaştırma, isteklerin kaynağını doğrulama HTTP uygulamamızın aldığı ve son olarak formlar aracılığıyla talimatların doğrudan yürütülmesinden kaçındığı.
Programlamada bir kural vardır ve evrenseldir, yani sadece PHPUygulama tarafından üretilmeyen tüm veriler potansiyel olarak kötü amaçlıdır, bu, programladığımız bir sonuç değilse güvenemeyeceğimiz anlamına gelir.
Bu ilke, form değerleri, dosyalar, veritabanları, bu nedenle güvenliğimizi artırmanın ilk adımı, bu öğelerle etkileşime girmemiz gerekiyorsa verileri filtrelemektir.
Formumuza girilen verileri filtrelerken uygulayabileceğimiz en iyi uygulamalardan bazılarını listeleyeceğiz:
İzin verilen değerler listelerini kullanınBu uygulama ile form üzerinden gelen verilerin izin verilen ve güvenli değerler listemizden geçmiyorsa işleme gitmemesi gerektiğini, bu noktada kullanıcıya verilerini düzeltmesi için bir mesaj gönderilmesi gerektiğini biliyoruz.
Geçersiz verileri asla düzeltmeyinTutarsızlıklarla verileri düzelten çok akıllı bir sistem yapmak cazip gelebilir, ancak uzun vadede bu bize sorun ve güvenlik açıkları getirebilir, bu yüzden düzensiz bir şey tespit edersek işlememeliyiz.
Adlandırma kuralını kullanBu uygulama ile güvenli veri ve değerleri kullanıcı tarafından girilen bu veri ve değerlerden ayırt edebiliyoruz, bununla eskinin işleme için kullanımını programlama içinde güçlendireceğiz.
Var iki tür filtreleme yapabileceğimiz, birincisi bildiğimiz değerler ikincisi ise bilmediğimiz değerlerdir.
NS ilk Yapması çok kolay, sadece bilinen elementlerin listeleri ile rutinleri gerçekleştirmemiz ve onunla karşılaştırmamız gerekiyor, ancak bu hantal ve daha büyük uygulamalarda gerçekleştirilmesi zor. NS Saniye Değerin yapısını değerlendiren rutinler oluşturmayı ifade eder ve eğer güvenli olduğunu düşündüğümüze karşılık geliyorsa, işleme girmesine izin veririz, aksi takdirde bir hata atarız, dinamik bir yapıya sahip olduğu için bu önerilen formattır.
Aşağıda ilk filtreleme türünün örnek kodunu görelim:
Aşağıdaki kodda elemanı olan bir formu nasıl oluşturduğumuzu göreceğiz. Seçme Kullanıcının bir renk seçmesi için, kullanıcının doğrudan girmek için verileri yazması gerekmediğinden, bilgileri doğrulamama hatasına düşebiliriz, ancak bu sadece geçerli bir form ile bir güvenlik açığımız olduğu anlamına gelir. aynı isimlerle potansiyel olarak tehlikeli bilgiler alabiliriz.
Bu nedenle formun değeri gönderildiğinde İLETİ, betiğimiz olası değerleri değerlendirir ve beklenen değerlerden herhangi biri olması durumunda aşağıda gördüğümüz gibi güvenli değerler dizimize geçiriyoruz.

Bununla sorunu basit bir şekilde çözdük, ancak liste üç renk yerine yüz olsaydı, sadeliğin hikayesi farklı olurdu.
Aşağıdaki örnekte, kullanıcı tarafından girilen bir alanı uygun bir şekilde dinamik olarak doğrulayacağız, bunun için kullanmalıyız düzenli ifadeler ve bu şekilde işlememizi riske atan karakterlerin girişinden kaçının, ayrıca girişin boyutunu da değerlendirin ve böylece taşma veya programın işlenmesinde veri türümüzün aşırı yüklenmesi. Resimdeki kodu görelim:

BÜYÜT

Burada doğrulamayı sağlamanın anahtarı, neyi işlemek istediğimizi doğru bilmektir, örneğin bir kullanıcı adı durumunda, normalde istediğimiz şey alfasayısal karakterler ve kısa çizgilerdir, bu yüzden normal ifade Bunu valide ediyoruz, ayrıca 0 karakterden büyük ve maksimum 32 olmasına ihtiyacımız var, eğer kullanıcı tarafından girilen tüm bunları karşılıyorsa, validasyonu geçer, en iyisi bunun gibi bir değerle çalışmasıdır. yüz, çünkü tamamen dinamik .
Kendimizi korumamız gereken bir diğer tehdit, diğer sitelerden komut dosyalarının çalıştırılmasıdır. AJAX İstemciden bir rotaya istek türü ve istediğimiz değerleri içeren formlar gönderebiliriz.
Yumuşak noktaBu tür bir zayıflık, birisinin formumuzu incelemesini ve alanlarımızı kontrol etmesini çok kolaylaştırır, bu isimlere ve yönteme sahip olarak nerede HTTP Güvensiz değerler göndermeye çalışın, bundan kaçınmak için, talebin nereden geldiğini ve yürütülmesine izin vermenin güvenli olup olmadığını doğrulamamıza izin veren teknikleri uygulamalıyız, aksi takdirde programımız içinde yola devam etmekten kaçının.
Bu sorunu önlemek için bir sistem jetonlar Y oturumlar, böylece form gönderildiğinde, oturumun güvenli bir şekilde kurulan oturumla aynı olup olmadığını değerlendiririz ve bu nedenle kötü niyetli kullanıcı devam edemez.
Bir saldırganın temel amacı, kodunu ortamımıza yerleştirebilmektir, bunun için kod enjeksiyonlarını kullanırlar. SQL, bu saldırı olarak bilinir SQL Enjeksiyonu, güvenli olmayan formlar ve uygunsuz işleme ile ilgili talimatlar alabiliriz SQL doğrudan sınırsız. Örneğin bizim değerlendirmemiz SQL betiğimizde şu var PHP:

Sistemin herhangi bir kullanıcısını kullanıcı adı olarak kullanabiliriz ve parola iki komut dosyası kullanıyoruz “--” bununla güvenliği sorunsuz bir şekilde geçebiliriz, çünkü iki komut dosyası bir yorumdur SQL ve bu nedenle şifre değerlendirilmeyecektir.
doğru yol bir SQL'i değerlendirmek kullanıcı kaynaklı, özel ve tehlikeli karakterleri kaldırıyor, sadece güvenli ifadeleri değerlendiriyor. Önceki durumdan nasıl kaçınılacağına dair aşağıda bir örnek görelim:
Yapmamız gereken ilk şey bir veri temizleme, yani formdan saf halimize ulaşmasına engel olun. SQL; Değerlendirmemiz gereken ikinci şey ise, eğer iki değer erişim vermeye karşılık geliyorsa, ancak ikincisi her birinin mantığına tekabül ediyorsa, amaca nasıl ulaştığımızı resimde görelim:

BÜYÜT

Burada yaptığımız şey aracı kullanmak hazırlanan ifadeler kitapçı bize ne sağlar PDO bağlantı için Veri tabanıbununla, girilenin asla veri olmayan başka bir bağlamda alınmamasını sağlıyoruz, yöntemi kullanmak yerine bunu da görüyoruz. İLETİ Güvenli dizimizi kullandık, bu, verilerimizin zaten doğrulandığı anlamına gelir, bu nedenle risk daha düşüktür.
Bununla bu öğreticiyi bitirdik, uygulamamızı daha güvenli hale getirmek için yapabileceğimiz eylemlerin basit olduğunu, insan çabası gerektirmediğini, ancak en yaygın ve belki de en sık yapılan saldırılardan kaçınmamıza yardımcı olduklarını gördüğümüz için .verilir. hakkında kötü bir algı var. PHP Bunun güvensiz bir dil olduğunu söyleyenlerin çoğu, ancak gerçek şu ki, dil yalnızca kullanıcı tarafından girilen veriler aracılığıyla uygulamalarımıza yönelik saldırıları iyileştirmek ve saldırıları önlemek için kullanabileceğimiz araçlara sahip olduğundan, güvensizlik programcı tarafından üretilir.
wave wave wave wave wave