PHP güvenlik tavsiyeleri

PHP de en büyük sıkıntı yaratacak açıklardan biri sql-injection açığıdır.

Sql injection açığını çözmek için mysql de yapılan işlemlerde kullanıcıdan gelen değişkenler her zaman

$safe_variable = mysql_real_escape_string($unsafe_variable);

şeklinde mysql_real_escape_string komutuyla arındırılmalıdır.Mysqli’de ki karşılığı

$safe_variable = mysqli_real_escape_string($unsafe_variable);

Yada sql injection önlemek için mysqli nin Prepered Statements tipindeki veri girişi kullanılabilir.

Aşağıdaki örnekte string girişi yapılacağından bind param “s” kullanılmıştır daha detaylı bilgi için Prepered Statements ile ilgili araştırma yapınız.

 $stmt = $mysqli->prepare("INSERT INTO table (column) VALUES (?)");

    $stmt->bind_param("s", $unsafe_variable);

    $stmt->execute();

    $stmt->close();

    $mysqli->close();

Yine veri tabanına kaydedilen verilerin uzunluğu sütunun maksimum karakter sayısını aşıyor mu kontrol edilmelidir.

Diğer dikkat edilmesi gereken güvenlik önlemleri ise önemli ve bot ile kötü kullanıma müsait web sayfalarına captcha ile korunmalıdır.

Kullanıcının şifre gibi önemli bilgilerinin alınıp gönderildiği web sayfalarını ise SSL Sertifikası ile şifrelemek yapılacak diğer bir önlemdir.

SSL’e ek olarak ssl e zorlanmalı ve çerezlerin güvenlik bayrakları işaretlenmelidir. (Secure ve HttpOnly)

Yine önemli formlar csrf token ile bot kullanımından ve F5 ile işlemin tekrarlanması engellenmelidir.

Formlar referer kontrolü ile de kısmen koruma altına alınabilir.

Html formlarda mümkün olduğunca get yerine post metodu tercih edilmelidir. Http get parameteleri hem tarayıcılarda kaydolobilmekte, hem de sunucularda loglanmaktadır.

Her yazılımda olduğu gibi php nin de yeni versiyonları çıktığında güncellenmelidir böylece c ile yazılmış php nin eski versiyonundaki güvenlik açıklarından (“\0” string sonlandırıcı sebebiyle oluşan güvenlik zafiyeti gibi) korunulmuş olunur.

Framework kaynaklı ek dosyalar ya da .git klasörü vb. yüklenmemelidir.

LFI ve RFI dan korunmak için require() ve include() nin parametreleri kullanıcıdan alınmamalı alınıyorsa da örneğin tek tek if ile kontrol edilmelidir.

Mysql de oluşacak bir hata sitenizde sıkıntı yaratabilir hata oluştuğunda anlayıp çözebilmek için hata varsa hata ekrana yazdırılmalı ve Sql sorgusunda gerekli bir değişken varsa değişken var mı diye öncesinde kontrol edilmelidir.

Bir cevap yazın