Merhaba arkadaşlar saati de düşünürsek aklıma geldiği kadar size güvenlik ten bahsedeceğim ve sürekli olarak konuyu güncelleyeceğim aklınıza takılan yapamadığınız veya merak ettiğiniz bütün soruları bu konu altından sora bilirsiniz.
Server Side dilleri ve masa üstü programcılığı üzerine uzun yıllardır çalışıyorum ve araştırmalarıma ve tecrübelerime dayanarak ( PHP Güvenliği ) hakkında size biraz bilgi vermek istiyorum umarım yazının sonunda sizde üretici ve açıksız bir siteye sahip olabilirsiniz.
Bildiğiniz gibi php betiği linux sunucularda daha stabil çalışmaktadır ve ilk koşulumuz sunucu veya hosting seçimi olacaktır, öncelikle en iyi şekilde optimize edilmiş bir sunucu seçimi yapmanız gerekmekte bunun sebebi ise sunucuya yapılan saldırı tiplerini minimuma çekerek sunucu kaynaklı güvenlik açıklarından kurtulmaktır. (DDos , SYN , Shell , Vs...)
Öncelikle php de sizi en zora sokacak ve bir hacker (LAMER) in işini en kolaya çekecek açık sql injection açığıdır peki ne işe yarar bu açık ?
Bu açık sayesinde veri tabanınızın tamamının içeriklerine erişebilir ve malesef verilerinizi değiştirebilir , admin panelinizin kullanıcı adı şifresini öğrenebilirler.
Herşeyden önce bilmeniz gereken şey yönetim paneli kullanıcı erişimi gibi bölümlerde mutlaka ve mutlaka şifreleri md5 olarak kaydedin mümkünse bir kaç sefer md5 yapıp öyle kaydedin çünkü bir yerde sql injection önlemi almamış olabilirsiniz ve bu sayede yönetim paneline girişi bir müddet engelleyebilirsiniz.
Nasıl kurtulabilirsiniz ;
Öncelikle bu işlem mysql den veri çekimi esnasında yapılır
örnek ( detay.php?id= ) verinin çekildiği bir sayfada eğer sayfanın orjinal adını veriyorsanız bir hacker ( LAMER ) sizi google aracılığı ile ( detay.php?id=1 ) gibi aramalarla rahatlıkla bulabilir buna kendi aralarında SQL DORK adını verirler benim tavsiyem tabloda bir field oluşturup seflink ile linkleri çektirmenizdir hem seo ya yardımcı olacaktır hemde gerçek dosyanın adını bulmakta bu vatandaşlar zorlanacaktır.
Yalnış veri çekimi
$id = $_GET["id"];
$veriler = mysql_fetch_array(mysql_query("select * from sayfalar where id='".$id."'"));Doğru veri çekimi
$id = $_GET["id"];
$veriler = mysql_fetch_array(mysql_query("select * from sayfalar where id='".mysql_real_escape_string(strip_tags(addslashes($id)))."'"));Eğer web sitenizde sql injection açığı vermek istemiyorsanız POST ve GET methodlarında mutlaka mysql_real_escape_string(); addslashes(); strip_tags(); komudunu kullanmak zorundasınız
detay.php?id=123 , sayfa.php?id=123 gibi giriş leri kapatmalısınız peki nasıl yapabilirsiniz ? $normal_url = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if(strpos($normal_url,'detay.php') or strpos($normal_url,'.php'))
{
die('<html>
<head><title> 404 Not Found
</title></head>
<body><h1> 404 Not Found
</h1>
The resource requested could not be found on this server!<hr />
Powered By <a href="http://www.litespeedtech.com">LiteSpeed Web Server</a><br />
<font face="Verdana, Arial, Helvetica" size=-1>LiteSpeed Technologies is not responsible for administration and contents of this web site!</font></body></html>');
}else{
SİTENİN İÇERİĞİNİN BULUNDUĞU ALAN
}Yukarıdaki kod satırı şu anlama gelir
eğer bir kullanıcı web sitenizden veri çekerken seflinkinizin olmasına rağmen .php?id=123 bu gibi komutları arıyorsa bu sayfayı 404 Not Found muş gibi göster bu sayede hacker (LAMER) dediğimiz arkadaş gerçek sayfayı yazmış olsa bile dahi farketmeden olmayan bi sayfayı yazdığını düşünecek ve farklı linkler deneyecektir.
Yönetici ve üye lerin şifrelerini MD5 ile oluşturmanız gerekir peki nasıl yapabilirsiniz ?
Sql injection gibi açıklarda dediğim gibi kullanıcı adı şifre veri tabanında ne varsa görüle bilir fakat şifreyi saklarsanız sadece görülür panele veya üye paneline şifresiz girilemez
Yalnış POST;
$sifre= $_POST["sifre"];
$kontrol = mysql_query("select * from uye where sifre='".$sifre."'");Doğru POST
$sifre= $_POST["sifre"];
$kontrol = mysql_query("select * from uye where sifre='".md5(md5($sifre))."'");Tabiki bunu yapabilmeniz için önce veri tabanına üye veya yönetici kayıdını md5 olarak girmiş olmanız gerek
Saldırıları basit yöntemler ile azaltmak ( Sunucu sahibine yardımcı olmak )
Arkadaşlar sunucu sahibi kadar sizde tehilikedesiniz bunu hiç bizaman unutmayın sunucuya yapılacak ddos , syn , shell gibi saldırılarda emin olun sizde zarar göreceksiniz ve sizden kaynaklanmasını önlemek için bazı şeyler yapmanız gerek
Ddos ve syn gibi ataklar için yönlendirme yapmanız gerekmekte bunun için size bir sınıf oluşturacağım ve bu konu üzerinden dosya paylaşacağım
dosya yüklemesi yapılırken dosya kontrolü yaptırmanız gerek ressim için bir örnek
if ($resimx['type'] != "image/gif" && $resimx['type'] != "image/jpeg" && $resimx['type'] != "image/pjpeg" && $resimx['type'] != "image/png"){
echo "yalnış dosya türü";
}else{
echo "Doğru dosya türü olduğunda işlenecek kod aralığı ";
}bu sayede image vs klasörlerinize .php uzantılı veya belirttiğiniz dosya türünün dışında dosya yüklenmesini engelleyebilirsiniz yani (SHELL) olasığını düşürürsünüz.
Dediğim gibi olasılık kesin çözüm değil bu sebepten dolayı resim kalsörlerinzin içerisine içeriğinde aşağıda yazdığım gibi bir kod olan .htaccess eklemelisiniz. bu sayede güvenliği tam sağlanmamış bir scriptten shell girdiği zaman yükleme yapılan klasörde .php dosyası çalışmayacaktır
php_flag engine off
<Files ^(*.jpeg|*.jpg|*.png|*.gif)>
order deny,allow
deny from all
</Files>
Aslında yukarıdaki komudu yaptığınızda shell in upload klasörlerinde çalışmasına izin vermeseniz de tedbirli olmak zorundasınız
Daha fazla güvenlik istiyorsanız getimagesize() komudu veya mime_content_type() komudunu kullanabilirsiniz fakat buda kesin çözüm değil
Resim dosyalarında - resmi yeniden boyutlandırmak , resmin üzerine yazı yazdırmak vs.. gibi işlemler faydalı olabilmektedir.
diğer dosya türlerinin type leri;
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'exe' => 'application/octet-stream',
'doc' => 'application/vnd.ms-word',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'pps' => 'application/vnd.ms-powerpoint',
'pdf' => 'application/pdf',
'xml' => 'application/xml',
'odt' => 'application/vnd.oasis.opendocument.text',
'swf' => 'application/x-shockwave-flash',
// archives
'gz' => 'application/x-gzip',
'tgz' => 'application/x-gzip',
'bz' => 'application/x-bzip2',
'bz2' => 'application/x-bzip2',
'tbz' => 'application/x-bzip2',
'zip' => 'application/zip',
'rar' => 'application/x-rar',
'tar' => 'application/x-tar',
'7z' => 'application/x-7z-compressed',
// texts
'txt' => 'text/plain',
'php' => 'text/x-php',
'html' => 'text/html',
'htm' => 'text/html',
'js' => 'text/javascript',
'css' => 'text/css',
'rtf' => 'text/rtf',
'rtfd' => 'text/rtfd',
'py' => 'text/x-python',
'java' => 'text/x-java-source',
'rb' => 'text/x-ruby',
'sh' => 'text/x-shellscript',
'pl' => 'text/x-perl',
'sql' => 'text/x-sql',
// images
'bmp' => 'image/x-ms-bmp',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'gif' => 'image/gif',
'png' => 'image/png',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'tga' => 'image/x-targa',
'psd' => 'image/vnd.adobe.photoshop',
//audio
'mp3' => 'audio/mpeg',
'mid' => 'audio/midi',
'ogg' => 'audio/ogg',
'mp4a' => 'audio/mp4',
'wav' => 'audio/wav',
'wma' => 'audio/x-ms-wma',
// video
'avi' => 'video/x-msvideo',
'dv' => 'video/x-dv',
'mp4' => 'video/mp4',
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'mov' => 'video/quicktime',
'wm' => 'video/x-ms-wmv',
'flv' => 'video/x-flv',
'mkv' => 'video/x-matroska'
Anlatım ve örnekler tamamen şahsıma aittir.