Composer Versiyon Güncelleme Uyarısı

Composer ile çalışırken şu şekilde bir uyarı alabilirsiniz;

“Warning: This development build of composer is over 30 days old. It is recommended to update it by running “/usr/local/bin/composer self-update” to get the latest version. ”

composer versiyon update uyarısı

composer versiyon update uyarısı

Bu yüklü olan ve bir süre geçmiş olan composer için güncelleme isteniyor demektir. Basit bir komutla güncellemeyi uygulayıp sorunu çözüyoruz.

Not: Composer uygulamanızın ismi sizde farklı olabilir. Yüklü olduğu ismine göre uygulayın. composer.phar veya composer olabilir.

Compser yüklü olduğu dizinde çalıştırılır.

Komut: /usr/local/bin/composer self-update

Bu komut ile gerçekleştiriyoruz. Tüm composer komutlarını görmek için composer uygulamanızı terminalden çağırmanız yeterli olacaktır.

composer (veya composer.phar sizde yüklü olduğu şekilde) tüm komutlar listeleyecektir.

 

Web Uygulamalarında Güvenlik Önlemleri

Geçenlerde bir hizmet almak için girdiğim kurumun web uygulamasında dolaşırken şüphelendiğim ve gözüme çarpan detaylardan dolayı biraz kurcalamam ile bulduğum güvenlik açıklarından grurla değil, malesef böyle şeylerin göz ardı edilmesinden kaynaklı şaşkınlıkla hayal kırıklıklarıyla ilgili konulardan bahsedeceğim. Kurumları ve açıkları deşifre etmemek adına bilgileri gizli tutarak işleyeceğiz.

Genelde uygulama geliştirilirken güvenlik göz ardı edilir, ileride üstünden geçilecek yapılacaklar listesinde kalır. Veya çok basit klasik önlemler alınır şimdilik yeterli idare eder diyip geçilir. En iyi ihtimal bariz belli yerlerde bir kaç test yapılır iyi sonuçlar alınır ama diğer tüm proje ve kapsam düşünülmez pas geçilir.

Bugün aslında baktığımızda hep en bilindik en basit gördüğümüz şeylerden dolayı beklemediğimiz durumlarda kalabiliyoruz. Buradan da zarar gelmez, buradaki kullanıcılar sadece şirket içerisin de yer alan kişiler, bu ayarlara gerek yok, sistemi ağırlaştırmanın ek maliyet getirmenin anlamı yok gibi kurulan cümleler ileride gerek baş ağrısı gerek maliyet türünden yüklü bir götürüsüyle karşılaşma riskini doğurur. Güvenlik göreceli ve kapsamlı bir konudur.

Canlı bir örnek olarak; daha yakın zamanda bir kuruma ait web uygulamasında güvenlik açıkları tespit ederek çalışmalar gerçekleştirdim. Biz sektörde yer alan kişiler işimizi severek ilgiyle yapmalıyız. İnternette gezdiğimiz kullandığımız bir uygulamayı sadece kullanıp geçmemeli, arkasında çalışan sistemi düşünmeli, tasarımı incelemeli, kullandığı teknolojileri yakalayabilmeli, eleştiri ve incelemeler yapmalıyız.

“Yazılımı geliştirici olarak nasıl kendi uygulamamızı geliştirirken son kullanıcı gözünden bakıyorsak, var olan bir uygulamayı incelerken de yazılımcı gözüyle bakmalıyız.” Tahsin Yüksel 🙂

Yine bir uygulamada içime sinmeyen tasarımlar içinde dolaşırken bazı sıkıntılı durumlar fark ettim. Uygulamanın geçici olarak veya bir şekilde yetiştirilmek idare edilmek üzerine yapıldığını düşündüm. Sayfalarda dolaşırken basit hatalardan kaynaklanan error sayfalarına da rastladım. Biraz daha huysuzlandım ve ilgimi çekti kurcalamaya başladım.

Açıkların doğruluğu ve kanıtlaması adına testler denemeler gerçekleştirmem gerekti. Tabi bu test ve çalışmaları yaparken iyi niyetli bile olsanız verebileceğiniz zararı düşünerek bilinçli hareket edilmeli. Database havaya uçurmanın bilgilere zarar vermenin anlamı yok.Kaş derken göz çıkarmamak gerekir.

Uygulamada yetkili erişimlerini de elde ederek bir yetkili kişinin sistemde görebileceği bilgilere erişmiş olmuştum. Bu bilgiler arasında kullanıcı bilgilerinin olduğunu söyleyebilirim.

Bir kurumsunuz belki milyonlarca kullanıcınız var ve en önemli data olarak bilinen kullanıcı bilgilerinin sizin uygulamanız yüzünden açığa çıktığını düşünün.Buna Sony ‘in zamanında plastasion da yaşadığı durumu örnek verebilirim.

Yaptıkları bir başka hata için de veri tabanı hakkında bazı bilgiler edinmiştim. Daha fazla ilerlemeyerek yarıda bıraktım. Ertesi gün yine merakım sonucunda yeni çalışma ve araştırmalar yaparak aslında durumun çok daha dramatik olduğunu fark ettim. Artık bir çok kamuya bağlı kurum daha halk dilinde çoğumuzun bildiği şekilde hack – hacklendi. (Güvenlik açıkları bulundu)

Ve başka bir devlete bağlı önemli bir projenin de güvenlik açıklarından içeri girmiş olmuştum.

Çok zorlanmadan sorun yaşamadan bunları görmüş oldum. Çok fazla ileri gitmek ve kurcalamakta açıkcası istemedim ve yapmadım, zamanımda yoktu. İnanıyorum ki derine gidilse veya uğraşılsa çok şeyler açığa çıkarılabilir başka şeyler öğrenilebilirdi. Herkesin niyeti bizim gibi iyi olmayabilir bu yüzden elinizden geldiğince tüm tedbirleri almaya özen göstermeliyiz.

Vakitten dolayı yazıyı da uzun tutmamak adına uyarı ve bilgi verici bir yazı olsun diyip toparlayacağım, güvenlikle ilgili ayrı yazılarımıza yer vereceğiz zaten. Şimdi aşağıda belli başlı konulardan bahsedelim:

Güvenli Uygulama Geliştirme

Uygulamanın ne derece güvenli olması gerektiği ne bilgiler içerdiği ne için nasıl kullanılacağı incelenmeli gerekli önlemler alınmalıdır.

Güvenlik önlemi olarak sadece firewall, ips gibi çok uzaklarda değil en başta yazılımda düşünmeli uygulamalıyız.

Her şey uygulamayı hızlıca yetiştirip hayata geçirelim olmamalı. Yazılımcı ve ilgili kişilerin üzerinden zaman baskısı atılmalıdır.

Her programlama dili için güvenlik açıkları söz konusu olmaktadır. Php güvensizdir .Net daha güvenli uygulama geliştirilir gibi felsefelerden vazgeçilmeli, programlama dili uygulamayı güvensiz yapmaz dili nasıl ne kadar kullandığınız durumu değiştirir.

Programlamada kullanılan dil, kütüphaneler, 3.parti araçlar, veri tabanları gibi uygulamayı meydana getiren tüm bileşenler her zaman takip edilmeli. Güncellemeler, güvenlik açıkları yeni geliştirmeler yakından izlenmeli. Unutmamak gerekir ki başta güvenlik açıkları olmak üzere bir çok konuda eksiklik giderildiği için güncellemeler çıkmaktadır.

Çok güzel tüm güvenlik önlemlerini düşünerek uygulama geliştirdiniz testler yaptınız her şey çok iyi ve güvendiniz uygulamanıza. Ama kullandığınız bir editörde veya 3.parti bir araçta açıklanan tespit edilen bir açık sizin o çok güvendiğiniz güvenli uygulamanızın bayrağını indirebilir.

Kullanıcılarınız ne kadar veli nimetiniz ise o kadar da sizin için güvenlik tehditiniz bunu unutmayın. Bu en önemli anahtardır. Gelen kullanıcılardan bu iyi bu kötü kullanıcı diye ayırt etme şansınız yok malesef ki. Biz hepsine ya bu gözü dönmüş tehdit bir kullanıcı ise diye yaklaşarak diğer iyi niyetli kullanıcılarımıza daha iyi bir hizmet sunmuş oluruz.Çünkü yapılan saldırı sizin kadar diğer iyi kullanıcılarınızı da etkileyebilir.

Kullanıcıdan veri girişi aldığınız ve sunduğunuz formlar, url, cookie gibi tüm alanlar aslında sizin kalenizin kapılarını temsil etmektedir. Yani uygulamanızın dışarı açıldığı kapılar. Siz eğer buralara nöbetçiler yerleştirmez önlem almaz iseniz giren çıkan belli olmayacak gelecek tehlikelere açıksınız demektir. Bizde verileri almadan önce mutlaka filtreleme kontrol işlemlerinden geçirmeliyiz.

Her gün yeni bir açık ortaya çıkabilir tıpki yeni bir ürün yöntem güzellik çıktığı gibi.Bunun için kendimizi geliştirmeli takip etmeliyiz. Kurumlar ise mümkün olduğunca çalışanlarını bilinçlendirmeli öğrenmeye eğitmeye teşvik etmelidir

Uygulamayı sık sık test etmeli ama acımasızca test etmeliyiz. Bir iki basit ufak numaralar ile kendimizi kandırmamalıyız. Bazen önlem aldığımız bir durum başka bir yol ile aşılabilinir. Birim testler yapılmalı değişik seneryolar denenmeli.

Uygulamada ne olursa olsun log sistemi olmalı. Kimin ne zaman nerede nasıl ne yaptığını bilmiş olursunuz. Diyelim ki hacklendiniz en azından kimin nasıl ne işlemlerde hangi bilgileri kullanarak yaptığını öğrenmek istemez misiniz. Kullanıcının gerçek bilgilerini alacağınızı düşünmeyin sadece nerede hangi parametrelerle ne zaman veya ne zamandan buyana kırıldığınızı görmek için.Böylece önlem alırsınız iş işten geçtiyse de dersler çıkarırsınız. Gelişmiş sistemler ile anlık bu durumları haber verebilecek sistemler geliştirin veya kullansanız tabi daha bir güzel olur sanki:)

Hataları yönetin. Hatalardan kaçmayın eğer bir hata aldıysanız aldığınız söyleniyorsa peşine düşün derim hatadan kaçmak değil yüzleşmek gerekir.Bazen hata kovalamakta bir zevk:) Ekrana hataları kabak gibi basmayın bu sizin kötü niyetli kişilere verdiğiniz bahşiş olur. Hatalarda yer alan bilgiler çok kritik bilgiler içeriyor olabilir. Veri tabanı tablo bilgilerinden çalıştığınız dosya yollarına kadar.

Yetkilendirme oturum açma gibi alanlar çok daha yakından takip edilip incelenmeli.

Google özel aramalar ile hiç istemediğiniz bilgileriniz gün yüzüne çıkmış olabilir. Bunlar kontrol edilmeli gerekli yerlerde botlar engellenmelidir.

Dizinleri listeleme görüntüleme engellenmeli. Bu gözden kaçırılırsa istenmeyen sonuçlar olması içten bile değil.

Şifre politikanız olmalı ilkeler yöntemler belirlenmelidir.

Bazı veriler database de doğrudan saklanması yerine şifrelenerek saklanmalıdır. Bu ilgili tablo ele geçirilse de veya ilgili kayıt bilgileri ele geçirilse de işine yaramayacak demektir. En azından bir nebze böyle düşünebiliriz.

Açık olan portlar ve diğer erişim methodları dikkat edilmeli önlem alınmalı. Mümkün olduğunca varsayılan değerlerden uzak durulması gerekir. Çünkü tüm varsayılan bilgiler ilk seferde denenecek yoklanacak işlerdir. Varsayılan portlar, varsayılan ayarlar, varsayılan bilgiler, varsayılan erişim yolları vs.

Test dosyalarımızı ortalarda bırakmamalıyız. Evet basit geliyor ama bir çok kişinin göz ardı ettiği konuların başında gelir. phpinfo dosyanızın ortada bırakıldığını düşünün. İntihar sebebi. Bir test fonksiyonu veya dışarıdan parametre alan test methodları da olabilir. Veri tabanı tablolarını listelediğiniz, şema bilgilerini paylaşan fonksiyon yazdınız ve test için lazım olur diye bıraktınız diyelim. Bu uygulamanın intihar sebebi olabilir.

Freamworkler güncel güvenlik açıklarına göre tasarlanırlar ve bu zafiyetlerin bir çoğunu üstlenerek bize kolaylıklar sağlarlar.

Bazı Güvenlik Efsaneleri:

  • Formdaki gizli inputlar(“hidden”) görülemez değiştirilemez .
  • Javascript ile formdaki verileri kontrol ediyorum yanlış güvensiz bir şey olmaz.
  • Seçilebilir kutu ve seçenek (select, radio) elemanlarında belirtilen değerlerden başka değer yer almaz, değiştirilemez.
  • Başka uygulamalardan taklit formlar gönderilemez, benim formum değiştirilemez.
  • Yapılan işlemler sadece uygulama ile borwser arasında. Başkası araya giremez.

bunlar en çok bilinen şehir efsaneleri niteliğinde yanlış bilgilerdir.

 

İncelenmesi Gereken Önemli Güvenlik Açıkları

  • XSS: Siteler arası komut çalıştırma
  • CSRF: Form sahteciliği
  • Sql Injection: DB açıkları sql sorgularını değiştirme, müdahaleler
  • RFI, LFI: Dosya çalıştırma
  • Oturum Güvenliği

gibi önde gelenler.

Güvenlik Açığı Tespiti

Güvenlik açığı test etmenin bir çok yolu var. En başta zafiyet testi olarak bilinen “Penetrasyon” testleri yapılır.

Manuel denemeler yapılabileceği gibi çeşitli araçlar ile de gerçekleştirilir. En iyi savunma saldırıdır diye bir söz var bilirsiniz. Bu yüzden hacker ların saldırı yöntemlerini öğrenmeniz bilmeniz demek gelebilecek saldırıları tahmin etmek savunma önlemleri alabilmek demektir.

Uygulamayı en iyi yazanlar bilir. Bu yüzden yazılım sürecinde daha birim testlerde oluşturarak denemeler yapmak sağlıklı bir yöntem olacaktır.Böylece test edebilirsiniz.

Piyasada ki açıkları ve güvenlik haberlerini takip ederek test etmek. Bu konuda başta OWASP olmak üzere web güvenliği toplulukları takip edilmelidir.

Ve bir çok yöntem daha.

 

Güvenlik Açığı Buldum Ne Yapmalıyım

Bulduğunuz güvenlik açıkları hakkında notlar alıp mümkünse döküman hazırlayın. Nasıl bulduğunuzu, nasıl test ettiğinizi, ne sorunlara yol açabileceği neler daha yapılabileceği gibi bilgilere yer verebilirsiniz.

Kendi Uygulamamızda Güvenlik Açığı

Kendinizin bulunduğu bir uygulamanız ise ekibinizle paylaşın sebeplerini sonuçlarını tartışın beyin fırtınası gerçekleştirin.Benzer açıkların uygulamanın başka yerlerinde var olup olmadığını, ne zamandan beri açıkla yaşadığınızı hangi önlemleri alabileceğinizi geçmişe yönelik şüpheler varsa önceki dataların incelemesini yapılır. Gerekli işlemler yapılarak sorun giderilir. Ve ekibe bu sorun anlatılıp sunum yapılarak paylaşılırsa çok faydalı olur.

Başka Bir Uygulamada Güvenlik Açığı

Eğer başka bir kuruma ait uygulama da açık bulduysak; iyi niyetimizi hiç bir zaman kaybetmeden üstümüze düşeni yapmalıyız. Testler yaparken zarar vermemeli, bilgilerden kötü niyetli yararlanmamalıyız. Döküman hazırladıktan sonra iletişim kuracağınız bilgiler edinilip kurum ile iletişime geçilir. Gönül ister ki kurumdan da aynı niyetle takdir edilir bir şekilde geri dönüş almak takdir edilmek. Gel gelelim ki günümüzde bu konuda değer verip beklenen cevapları almak büyük ihtimalle hayal olarak kalabilir. Sizin uyarılarınızı hiç dikkate almayan kurumlar bile olacaktır veya bir teşekkür etmeyi akıl bile edemeyenler olacaktır. Aslında yaptığınız bu uyarıyı dikkate almayarak başlarına gelebilecekleri görmezden gelmiş olabilirler. Google gibi şirketlerin bu konulara nasıl önem verip hangi politikaları izlediklerini kurumların incelemelerini yaklaşımlarını değiştirmelerini öneririm en azından isterim.

Sonuç:

Bulduğumuz ve öğrendiğimiz rastladığımız açıklardan ders almak en önemli konudur. Hata yapabiliriz bir çok soruna sebebiyet vermiş olabiliriz önemli olan ders çıkarmaktır. Aldığımız dersleri de paylaşmaktır. Bilinen bir tartışma da hiç bir zaman bir uygulama yüzde yüz güvenli olamaz tartışmasıdır. En iyi uygulamalar bile sorunlar yaşayabilir. Bu konu tartışıla dursun bize bunlara engel olmak elimizden geldiğince sağlamlaştırmak düşer. Baştan önlemler alarak bunları klavuz ederek, kendimizi de geliştirerek önlemler alarak daha sağlam daha sorunsuz yapılar geliştirmeliyiz.

Edindiğim tecrübe ve bilgilerden aklıma gelenleri aktardım, geldikçe de eklemelere devam ederim.

Bu konu başta da belirttiğimiz gibi çok kapsamlı konudur. Nelere sebebiyet verebileceği, hangi önlemlerin olduğu, hangi tehdit çeşitleri gibi bir çok konu başlığı çıkar uzar gider. Uygulama geliştirirken güvenlik önlemleri ve yöntemleri içeren açıklayıcı örneklerle makalelerde paylaşmış olacağız.

Ubuntu Php Mcrypt Yükleme

Laravel için sistem gereksinimlerinde bahsettiğimiz “Mcrypt”  Php eklentisi kurulu olmadan çalışmayı denediğimizde “Mcrypt PHP extension required.” hatası ile karşılaşırız.

Mcrypt eklentisinin yüklü olmadığı belirtiliyor. Bu eklentinin yüklü olup olmadığını phpinfo sayfamızdan da öğrenebiliriz.

mcrypt eklentisi

mcrypt eklentisi

Ubuntu Mcrypt Yükleme

sudo apt-get install php5-mcrypt

daha sonra web sunucumuzu yeniden başlatıyoruz.

sudo service apache2 restart

Aktifleştirmek için yeniden başlatmamız gerekiyor. Yoksa eklenti kurulu olsa da uygulama da kullanmayacaksınız.

Nginx php-fpm kullananlar için ise php-fpm restart edilmesi gerekiyor.

Nginx php-fpm Mcrypt

sudo service php5-fpm restart

Ubuntu Java Kurulumu

Ubuntu üzerinde java kurulumunu anlatıyor olacağız.

Ubuntu 11.10 Oneiric Ocelot sürümünden itibaren OpenJDK 6 kurulu olarak gelmektedir. Eğer var olan sürümde bir sıkıntı yaşanıyor veya yeni sürümleri kullanmak isteniyorsa aşağıdaki şekilde Oracle Sun’ a ait Java sürümlerine geçiş yapılabilir.

Şuan için 3 Java sürümü mevcuttur. Java 6, 7 ve 8.

Ubuntu’ da PPA(Personal Package Archive – Kişisel Paket Arşivi) ile Java 7 ve 8 sürümleri için kurulum anlatılacaktır. Java 6 Sürümü için güncel PPA yoktur. İstistani bir durumunuz yok ise 7 veya 8 sürümünü kurmanız önerilir.

Java 7 Sürümü Yükleme

webupd8team/java PPA da güncel hali yer almaktadır. Buradan PPA’ yı ekleyip paketleri kurabiliriz. Bunun için:

sudo add-apt-repository ppa:webupd8team/java 
sudo apt-get update
sudo apt-get install oracle-java7-installer

ile yüklemeyi gerçekleştiriyoruz. Ne yaptığımızı açıklarsak;

1.satırda PPA kaynağını ekliyoruz.

2.satırda paket sistemimizi güncelliyoruz, yeni eklenen paketimiz var.

3.satırda paketlerimizi yüklüyoruz.

Java 8 Sürümü Yükleme

Yine aynı şekilde yukarıda yaptığımız işlemler geçerli. Sadece 3.satırda yükleme yaptığımız kısmı şu şekilde değişiyor;

sudo apt-get install oracle-java8-installer

 

Hangi Java Sürümü Yüklü Öğrenme

java -version ile kullanılan Java sürümünü öğrenebilirsiniz.

java -version

aldığımız ekran çıktısı aşağıdakine benzer ise başarılı şekilde kurulmuştur.

java version “1.7.0_67”
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)

 

Php İle Uygulama Geliştirirken Bilmemiz Gerekenler

Php İle Uygulama Geliştirirken Dikkat Edilmesi Gereken Bilgiler

Php ile web uygulamarı geliştirirken bir takım dikkat etmemiz gereken hususlar vardır. Php baz alınarak anlatılan bu yazıda aslında bir çok durum, genel web uygulamaları geliştirmede geçerli olan pratik bilgilerdir. Her geliştiricinin dikkat etmesi gereken pratik bilgilerin yer aldığı yazıyı inceleyelim.

Paylaşarak diğer geliştiriciler için de katkıda bulunalım.

1) Başarılı Bir POST İşleminden Sonra Sayfayı Yönlendirin

Sadece php için geçerli değildir. Web uygulamalarında kullanıcı form bilgilerini doldurup post eder. Post ile aynı sayfaya veriler gelir. Kullanıcı sayfayı yenilediğinde aynı formu aynı dataları tekrar sayfaya post eder. Sayfayı yenilediğinde bu uyarıyı yapan bir alert penceresi ekrana gelir zaten. Bu sorunu eminim bir çok kişi yaşamış veya başka uygulamalarda görmüştür diye düşünüyorum.

Hemen test etmeniz için aşağıdaki gibi bir php sayfası oluşturun. Örnek olarak index.php dosyasına aşağıdaki kodları ekleyip browser da test edin.

index.php:

<form method="POST" action="index.php">
<input type="text" name="firstName" value="Tahsin">
<input type="submit" name="submitBtn" value="Gonder">
</form>

<?php
print_r( $_POST );
?>

Localhost dan ilgili sayfayı açıp sayfayı post ettiğinizde(Gönder butonuna bastığınızda) sayfanın post edildiğini aşağıda gelen dataların ekrana bastırıldığını göreceksiniz. Tekrar sayfayı yenilediğinde ise ekrana bir uyarı geleceki tamam dediğiniz takdirde aynı form bilgileriyle sayfa tekrar post edilecektir. Bu uygulamanıza göre sorun yaşatabilir ve istenmeyen bir durumdur. Örneğin kullanıcı bilgilerini güncellediğiniz veya kullanıcının mesaj gönderdiği form olarak düşünün, bilgiler sürekli insert veya update edilecektir.

Bunun için işlem sonucunda sayfayı yönlendirmeniz bu sorunu çözecektir.

if($success){
    header('Location: page.php?msg=success');
    exit;
}

2) Mysql_ * Fonksiyonlarını Kullanmaktan Vazgeçin

Php kendi sitesinde de duyurduğu üzere artık bu fonksiyonlara destek verilmeyecek PHP 5.5 de resmen kaldırıldığı ilan edilmiştir. http://tr1.php.net/manual/en/function.mysql-connect.php . Bu fonksiyonlar nedir

mysql_connect, mysql_query, mysql_fetch_array vb.

Bu eski emektar yapının köklü ve ihtiyaçlara uygun modern şekilde daha çok işimize yarayacak yapılarla tanışma vaktimizin geldiğini gösteriyor. Bunun için alternatiflerimiz: PDO (Php Data Objects), Mysqli (Mysql Improved Extension)

PDO ile tanışıp incelemenizi, devam etmenizi öneririm.

3) Php Etiketlerini Kapatmayın

Geliştiriciler genellikle php dosyalarının sonunda php etiketini kapatırlar. Bu bazen anlam veremediğimiz boşlukların olmasına sebebiyet verebiliyor.

<?php
class MyClass{
    public function test(){
        //code ...
    }
}

?>
Bunun yerine aşağıdaki gibi kullanmak tercih edilir.
<?php

class MyClass{
    public function test(){
        //code ...
    }
}

4) XSS İçin Koruma

XSS (Cross Site Scripting) bir güvenlik açığıdır. İstemci tarafında javascript kodlarının çalıştırılmasını sağlar. Önemli bir konudur çok kullanılan ve zafiyet taramalarda ilk başvurulan yöntemlerdendir. Güvenli uygulama geliştirmeye özen gösterip tedbirler almak zorundayız. Daha fazla bilgi için wiki.

Bunu önlemek için kullanıcıdan gelen verileri filtreden geçirmemiz gerekiyor. Bunu her zaman yapmalıyız kullanıcılarımız her zaman iyi niyetli olmayabilir unutmayın. “htmlspecialchars” ile ekrana bastırılacak olan verinin işlevini kaybederek sadece yazı olarak gösterilmesini sağlar. Html etiketleri önceden tanımlanmış özel biçimlere dönüştürülür. Yani yazılacak data  sadece metin olmuş olur, javascript, html komutlarını işlevsiz kılar.

echo htmlspecialchars($userComment, ENT_QUOTES, 'utf-8');

5) Echo İle Tüm HTML Çıktılarınızı Basmayın

Bu benimde dikkat ettiğim kaçındığım ama gördüğüm kadarıyla çoğu zaman karşıma gelen bir durum. Yakın zamanda çalıştığım firmada yapılmış bir program üzerinde geliştirmeler yapmam gerekti. Html ile php birbirlerine girmiş havalarda uçuşan kodlar düşünün. Tüm sayfaların çıktılarının hatta projenin sırf echo ile yapıldığını hayal edin. Bu yine iyi bir seneryo peki ya o kodlar içinde hiç hata ayıklamayı aradığınızı hemen bulmayı düşündünüz mü? Bu çok sıkıcı ve vakit alıcı bir durum. IDE niz bile size çok yardımcı olamaz sağladığı özelliklerden yararlanamayabiliriz. Tasarımcı açısından da düşünün, php kodlarıyla çok uğraşmak zorunda da değil, içine girdiğinde aramakla 2 kat uğraşmakla işten çok çabuk sıkılması normal. Echo ile html basmayın demiyoruz, yerinde ve uygun şekillerde minimum düzeyde kullanmanız önerilir. MVC freamworkler kullanarak veya kendi yapılarınızı geliştirerek View dosyalarınızı ayrı tutmanız daha yararlı olacaktır.

6) Tekrar Etmeyen Kodlar Geliştirin

Uygulamanızı mümkün olduğunca mantıklı işlevsel parçalara ayırarak geliştirin. Aynı kodu bir çok kez yazmaktan kurtulun. Bunları include, class, function gibi yöntemleriyle halledebilirsiniz. Örneğin her defasında kullanıcı bilgilerinin kontrolünü sağlayan kodları yazmak yerine bir fonksiyon oluşturun, gerekli yerlerde bu fonksiyon sayesinde işleminizi rahatça yapabilirsiniz. Yarın bir gün abi kullanıcının seri no sunun kontrolünde şu bilgileri de ekleyelim dendiğinde tüm sayfalarda değişiklik yapmak zorunda kalmazsınız. Gider ilgili fonksiyonda değişikliği yapar kurtulursunuz.

7) Güvenlik Güvenlik ve Güvenlik

Uygulamanızda güvenlik göz ardı edilmemesi gereken en önemli konuların başında gelir. Bugün daha uygulama yeni gelişiyor çok büyük kullanıcı kitlemiz yok ilerde düşünürüz, kullanıcı profilimiz belli sorun olmaz, uygulamanın bu bölümünde güvenliğe bu kadar düşmemize gerek yok gibi göz ardı ettiğiniz şeyler gelecekte çok canınızı yakabilir.

Uygulama geliştirmede güvenliği hep düşünerek kod yazmak uygulamayı en baştan bu şekilde geliştirmek çok sağlıklı olacaktır.Bunu kendinize felsefe edinmenizi öneririm bu kendinizi de uygulamanızı da geliştirecektir.

Kullanıcılara güvenmeyerek uygulama geliştirmek gerekiyor. Bu kötü bir şey değil. Siz bütün kullanıcılarınıza tam güvenirsiniz ancak 1 kullanıcı gelir onu diğer kullanıcılarınızdan ayırt edemezsiniz ve çalışan sisteminizi de diğer kullanıcıları da üzebilir.

Tüm kullanıcı veri girişlerini, veri çıkışlarını filtrelemek, uygulamanızı itinayla bozmaya çalışmaktan denemeler yapmaktan güvenlik taramalarından ve gelişmeleri takip etmekten kaçınmayın.

8) Döngüler İçinde Sorgular Çalıştırmayın

Dögü içinde yaptığınız işemlere dikkat edin. Mümkün olduğunca optimize edin. Farkında olmadan yazdığınız kodlar sistemi gereğinden fazla yorar meşgul eder. Döngü içinde database işlemlerinden kaçınmaya çalışın.

9) Database Güvenli Veri Ekleme

Nasıl ki istemci tarafında kullanıcı verilerini XSS için etkisiz kılıyorsak aynı durumun veri tabanı versiyonu da var. Yani veri tabanına gelecek verilerinde kontrolden filtreden geçirerek SQL Injection saldırılarından korumamız gerekir. Bunun için alışagelmiş mysql_real_escape_string olsa da yeterli değil. Peki ya ne gerekiyor? PDO, Mysqli gibi yeni yapılar kendi güvenli yöntemlerini sunuyor. Örneğin PDO için:

<?php
//Sql sorgu yapısı olustur
$stmt = $db->prepare("SELECT name FROM users WHERE username = :username");
 
//Olusturulan sorgu yapınıza ait parametreleri degerlerini ekleyin
$stmt->bindParam(':username', $username);
 
//Islemi calistir
$stmt->execute();

Ayrıca kullandığımız hemen hemen tüm freamworkler güvenlik açıklarına karşı geliştirilip gerekli önlem mekanizmaları sağlamaktadır.

10) Her Olumsuz Durumda “die()” Kullanmayın

Bir çok geliştirmeler de olumsuz durumlar için die, exit gibi uygulamayı bitirici işlemlerle sonlandırırız. Bu iyi bir kullanım değildir, tabi uygulamanızın ve kodların yapısına göre değişebilir. Mümkün olduğunca hataları yakalamayı onları yönetmeyi bilmemiz gerekiyor. Hatalardan böyle kaçamayız. Hataları yakalayarak kontrol etmeyi, log tutma gibi, aynı zamanda uygulamanın çalışmasını sonlandırarak değil bunu uygun şekilde uygulama çalışmaya devam ederken işleyip gerekli bilgi mesajları vererek halletmemiz daha uygun olacaktır.

11) Doğrulama İşemleri

İllaki her uygulamamızda doğrulama işlemlerine ihtiyaç duymuşuzdur. E-mail olsun, sayı ve metin gereken alanlar olsun. Bunlar için hemen devede pire aramayın. Her şey için regex kullanmaktan, internette aramaktan, kendiniz geliştirmekten vazgeçin. Bu maliyetli bir iştir. Hem kendiniz hem projeniz için. Hemen yanınızda duran var olan fonksiyonları inceleyin. Dile hakim olun. “filter_var” keşfedin. Örneğin email kontrolü için:

if(!filter_var($emailAddress, FILTER_VALIDATE_EMAIL)) {
 //gecersiz email
}

12) Php Kısa Etiketler

Benimde aslında sık kullandığım kısa etiket yapısı içinde bir uyarı var. Bazı sunucularda php kısa etiket kullanımı kapalı olabilir. Bunda ne var diyorsanız: sunucu bize ait değilse, veya yaptığımız uygulamayı dağıtmayı düşünüyorsak küçük görünen bu sorun büyük bir dert olabilir. Bunu düşünerek kaçınmamızda fayda var bende kendime alıştırcam bunu:) Yani:

<?= $degisken ?> yerine <?php echo $degisken?> kullanılmalı.

Php.ini de “Short Open Tag” satırını bularak “on” açık hale getirebiliriz.

13) Optimizasyonlar

Gözden kaçırdığınız yada bundan bir şey olmaz dediğiniz yapılar proje geliştikçe damlaya damlaya göl olur misali uygulamanıza zararı dokunur. Örneğin bir fonksiyonu aynı işlemi aynı değerlerle birden fazla çağırıp kullanacaksanız dönen değerini bir değişkende tutup onu kullanmanız, fonksiyonu tekrar çalıştırmaktan daha verimli olacağı çoğu zaman göz ardı ediliyor.Çok basit bir örnek:

for($i = 0; $i < count( getUsers() ); $i++){
 // islemler
 }

Burada getUsers adında bir fonksiyon var. Buradan dönen kayıtların sayısı kadar çalışacak döngü hazırlanıyor.Buraya kadar güzel. Peki ilerleyen satırlarda bizim yine aynı kullanıcı bilgilerine (getUsers fonksiyonundan dönen değerlere) ihtiyacımız var ve kullanıyorsak? Örneğin:

$users = getUsers();
echo "İlk kullanıcı" . $users[0];

İşte o zaman sorun. Çünkü getUsers fonksiyonu tekrar gidip çalışacak sonuç üretecek tekrar değerleri geri return edecek. En başta bir değişkene sonuç alınır bu değişken üzerinden işlemler gerçekleştirilirse daha performanslı ve uygun olacaktır. Çok büyük değer var değişken ile boşuna bellek kullanayım diyorsanız da unset ile bellekten silebilirsiniz değişken ile işiniz bitince

$users = getUsers();
...
for($i = 0; $i < count( $users ); $i++){
 // islemler
 }
...
echo "İlk kullanıcı" . $users[0];
unset($users);

14) Veritabanı Normalizasyonu

Hemen hemen tüm uygulamalarımız veri tabanı gerektiriyor en azından çoğunluğu. Bu veri tabanıyla içli dışlı olmamızı gerektirir. Çünkü burada hazırlanan yapı, tasarım uygulamamızın tüm geleceğini etkileyecektir. Uygulamamız bu yapıya göre çalışacak, kontrollerimiz, sorgularımız buraya göre şekillenecektir. Doğal olarak verimliliği, performansı, işleyişi de derinden etkileyecektir. Gereksiz yapılar, datalar, yanlış tasarımlar hem uygulamanızı etkileyecek hemde maliyetlerinizi arttıracaktır.

15) Standartlarda Kod Geliştirin

Buda çoğu zaman gözden kaçan dikkat edilmeyen bir sorundur. Dikkat edildiğinde ise tadından yenmez. Benim içinde çok önemli olup uymayanların arkasını toplamak zorunda kalabiliyorsunuz. Kabul görmüş kod standartları vardır PSR-0, PSR-1, PSR-2 gibi.PSR(Php Standards Recommendation – Önerilen PHP Standrtları) Bu gibi kabul görmüş global standrtlarda kod geliştirirseniz her yerde kolayca anlaşabilirsiniz. Dünyanın diğer ucundaki bir programcı da gelir kodlarınız anlar, sizde onların ne yapmak istediğini anlayıp anlaşabilirsiniz. Global olarak uygulama geliştirmiş olursunuz her kes tarafından anlaşılır kabul görmüş standartlarda ve kalitede.Kullandığımız freamworkler de yine bu standartlar doğrultusunda geliştirilir. Örneğin laravel psr kod standartlarını ve diğer bazı standartlar ile geliştirilmiştir.

En azından kendinizin bile standartları olmalı. Bu kod okunurluğundan birlikte grup çalışmalarına kadar faydası olacaktır. Hem kendinizin hem projenizin kalitesi artar.

PHP Framework Interop Group tarafından kurallar ortaya koyulmuştur. Bu gruba bir çok freamwork ve üye destekleyicisidir. Php-fig adresinden bu standartları inceleyebilirsiniz.

 

Yazıyı daha da uzun tutmamak adına burada ara vermiş olalım. Yazı serisi şekilde devamını getirmeyi planlıyorum. Diğer yazılarda da önemli bilgiler edinecek, unuttuklarımızı hatırlatacak, bildiklerimizi pekiştirecek, projemize ve kendimize kaliteli değerler katacağını düşünüyorum.

Git Nedir ? Nasıl Kullanılır ?

Git sürüm kontrol (versiyon kontrol) ve kaynak kod yönetim sistemidir. Versiyon kontrol nedir; yapmış olduğumuz projede adım adım geliştirmeler yaparız. Projenin son halini de bozmamak için kendimizce kopyalar alırız. Kendimizce çeşitli klasörleme sistemleri oluştururuz.  xx_v1, xx_v2 yada proje_adi_05_02_14 gibi . Proje büyüdükçe geliştirmeler arttıkça dağınık ve içinden  çıkılmaz bir hal alıyor. İşte versiyonlama sistemi bizi bu işkenceden kurtarır. Yaptığımız geliştirmeleri, yaptığımız yorumlarla zamanlarıyla birlikte saklar böylece tek çatıda karmaşadan uzak, içinde boğulmadan geliştirmemizi sağlar.

Bu sayede artık ne zaman hangi değişiklikleri yapmıştık diye düşünmeden projenin tüm gelişim serisini takip etmiş oluruz.

“Eyvah son yaptığım değişiklikler projeyi uçurdu ne yapacağım nasıl geri alacağım” diye haykırışlara çare olur, şimdilik bu kadarı yeterli sanırım:)

Git Diğer Özellikler

Aynı anda birlikte çalışma imkanı sağlar

Git en büyük özelliğinden birisi ise birden çok kişi ile birlikte çalışmasını sağlar. Hemde bunu tek bir merkeze sürekli bağlı kalmadan dağıtık offline şekilde gerçekleştirebiliyorsunuz. Çalışma dosyalarını her bir kullanıcı kendi local’ ine çekerek(clone – kopyalama işlemi gerçekleştirilir) orada kendi geliştirmelerini yaparlar. Bu İnternete sürekli bağlı kalmadan çalışabilmeyi sağlar. Yani siz yolda, evde çay bahçesinde de geliştirmelerinizi yapabilir daha sonra  uzak merkeze(depoya) gönderebilirsiniz.(Gönderme işlemi pull, pull etmek)

Proje güvenliliği

Projede çalışan kullanıcıların her birinde projenin kopyaları olduğu için güvenlidir. Tabi projenin güncel hallerini kullanıcılarınızın takip etmesi suretiyle:) Her kullanıcıda projenin kopyaları bulunduğu için sizin bilgisayarınız havaya da uçsa repoda gitse projeniz hala yaşıyor olacaktır.

Projeyi dallara (branch) parçalara ayırarak çalışma

Farklı kaynaklardan dallardan hızlı, kolay birleştirme

Kaynak depoları disk üzerinde çok az yer kaplar verimlilik sağlar.

Açık kaynak dünyası tarafından popüler. Birçok kullanıcı tarafından kullanılmakta.

Projenizi açık kaynağa sunarak daha hızlı ve etkili gelişmesini sağlayıp inceleyebileceğiniz gibi diğer açık kaynak geliştirmelere de katılabilir git üzerinden dosya alışverişleri sağlayabilirsiniz.

Github kullanımı, Github ile ekip ve proje yönetimi.” Social Coding” Platformu. Git ile oluşturduğunuz kod depolarını bulutta saklamanızı sağlar. Bu alanda Github dışında Bitbucket gibi alternatiflerde vardır.

Projenin adım adım gelişim süreci takip edilmiş olunur. Kimlerin hangi geliştirmeler yaptıkları zaman serisi halinde bulunur.

Şimdilik bu kadar bilgi yeterli sanırım, kapsamlı ve geniş bir konudur.Özellikle Github hakkında ayrı yazılar yazılabilir, araştırmanızı ve kullanmanızı öneririm.

Versiyon Kontrol Sistemleri

Git

Subversion

Microsoft Team Foundation Server

Bazaar

CVS (Concurrent Versions System)

Git Nasıl Kurulur

Linux Git Kurulumu:

Oldukça basit Terminal de şu kod satırını çalıştırıyoruz:

$ apt-get install git-core

Farklı linux sürümlerinde kurulum değişebilir, kullandığınız sürüme göre kontrol edebilirsiniz.

Windows Git Kurulumu:

Windows için Git versiyonunu indirmemiz gerekiyor. Bu adresten detaylı bilgi alabilir, indirip basit şekilde kurulumu gerçekleştirebilirsiniz. Bulunduğunuz klasörde mouse sağ tuş ile Git Bash ile git komut satırına – terminale, Git Gui ile git masa üstü programına ulaşabilirsiniz. Komutları öğrenmeniz açısından komut satırını kullanmanızı öneririm alıştıktan sonra daha çok seveceksiniz:)

Git Konfigürasyonu

Kurulum bittikten sonra bir kaç ayarlamalar yapmalıyız. Bu aşama zorunlu değildir. Yapılması önerilir.

Ayarlar “.gitconfig” dosyasında tutulur. Bir kere yapmanız yeterli olur.

$ git config --global user.name “Tahsin Yüksel”

$ git config --global user.email info@tahsinyuksel.com

Böylece kullanıcı adımız ve email adresimizi tanıtmış olduk.

Git tüm ayarımızın listesini şu kod ile görüntüleyebiliriz.

$ git config --list
user.name=tahsin yüksel
user.email=info@tahsinyuksel.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

Yine ayarları değiştirmek için de aynı şekilde kullanabiliriz.

Git Yardım Almak

$ git help <eylem>

$ git <eylem> --help

$ man git-<eylem>
 

Örneğin, config komutu için kılavuzu sayfasını görüntülemek için şu komutu çalıştırabilirsiniz:

$ git help config

Github ve diğer git servisleri için güvenli bağlantı sağlamamız için bilgisayarımızı tanıtmamız gerekiyor. Bu sebeple SSH key oluşturmalıyız. Şimdilik bu kısmı geçiyorum. Git SSH key oluşturma için araştırabilirsiniz.

Git kavram – terimler:

Genel olarak kullanacağımız Git komut ve kavramlarına aşina olmak adına aşağıda yer verdim.

repository: Depo. Projenin ana klasörü gibi düşünebilirsiniz. Local ve Remote depolar olacaktır.

init: Bulunulan dizinde yerel bir kod deposu oluşturur. Proje başlatmak için ilk aşamadır.

clone: Kopyalamaya, klonlama. Uzak kod deposunun kopyasını almayı sağlar

pull: Uzak depodaki değişikliklerin ardından son halini almayı sağlar

push: Yerel deponuzda yaptığınız değişiklikleri uzak depoya göndermek için kullanılır.

branch: Dal. Projeyi parçalara ayırarak çalışma imkanı verir.Farklı özellikler geliştirm

commit: Yaptığımız çalışmaları depoya eklerken verdiğimiz etiket, mesaj, açıklayıcı yazı.

merge: Birleştirme. 2 farklı dal da çalışıyorsak değişiklikleri birleştirmek için kullanılır.

checkout: Dal seçimi yapmamızı sağlar. Dallar arasında geçiş, seçim yaparız.

.gitignore dosyası: Çalışmamızda bazı dosyaların veya dizinlerin versiyonlamasını yani depoya dahil olmasını istemeyiz. Bazen önemli kritik bilgiler içeren dosyalar olabilir bazende programın ürettiği dosyalar olabilir. Bunları depodan devre dışı etmemizi sağlar.  “.gitignore ” dosyası içinde versiyonlamasını istemediğimiz dosya veya dizinleri belirtiriz.

Not: Açıklamalar herkesin anlayabileceği tarzda sunulmuştur birebir kavramları karşılamayabilir.

Git çalışma prensibi ile ilgili bilgilere şuradan erişebilirsiniz.

Git workflow
Git data transport commands

Evet git hakkında temel bilgileri,  avantajlarını, kurulumu, ve ilk ayarlamalarını gördük. Sonraki yazıda Github ile entegre çalışma, kullanım ve komutları inceleyeceğiz.

Son olarak tavsiyem:

Gerek kendi geliştirmelerinizde gerekse gireceğiniz iş hayatında hemen hemen bir çok kurumda bu sistemler kullanılıyor ve bilinmesi ihtiyaç duyuluyor. Yukarıda saydığımız bazı özelliklerden dolayı kurumlarda özellikle toplu çalışmalar gerçekleştirildiğinden bu sistemler %90 üzerinde kullanılıyor.

Henüz başlamadıysanız şimdiden Git veya türevi versiyon kontrol sistemleri ile çalışmaya başlamanızı öneririm. Bunun hem size katkısı hemde gireceğiniz iş hayatınızda artısı olacağını ekleyerek yazının sonuna geliyoruz.