8 Mayıs 2017 Pazartesi

Mongo DB de CRUD ve diğer işlemler için örnek kodlar

MongoDB konsolu için kullanılacak bazı temel komutları sizler için derledim. Başlangıçta sizi bu dertten kurtarmak için işe yarayacağını umuyorum. İyi çalışmalar..

EKLE

db.user.insert( { name : “sahin”, lastname: “besinci”, addedDate: new Date() } )
-> name şahin, lastname beşinci, addedDate bugün olan değeri user tablosuna ekler.

LİSTELE

db.user.find()
-> tablodaki bütün verileri getirir.

db.user.find() [0]
-> tablodaki ilk veriyi getirir.

db.user.findOne()
-> tablodaki ilk veriyi getirir.

db.user.findOne( { name : “sahin”  } )
-> name:”sahin” olan verilerin ilkini getir.

db.user.find().pertty()
-> tablodaki bütün verileri getirir. Json formatında düzenli görüntüler.

db.user.find( { name : “sahin” } )
-> name: “sahin” olan satırları getir.

db.user.find( { } , { name: true } )
-> name değerine sahip olan değerleri getirir. false olursa sahip olmayanları getirir

db.user.find( { name : “sahin”  } , { lastname : 1  } )
-> virgülden önceki ilk deger filtre için, ikincisi istenilen parametreleri belirtir

SİL

db.user.remove( {  } )
-> bütün satırları siler.

db.user.remove( { name: “sahin” } )
-> name:”sahin” olanların name değerlerini siler.

db.user.remove( { _id= ObjectId(“5616543215a4s6df313543a”) } )
-> id ye sahip satırı siler.


GÜNCELLE ;

db.user.update( { name:”sahin”  } , { $set : { soyadi : ”besinci” } } )
-> name:”sahin” olan satırın soyadı:”besinci” olarak günceller.

db.user.update( { name:”sahin”  } , { $set : { soyadi : ”besinci” } } , { multi : true } )
-> name:”sahin” olan bütün satırların soyadı:”besinci” olarak günceller.


DİĞER

db.user.count()
-> tablodaki toplam satır sayısını getirir.

db.user.find().skip(10)
-> 10 satırı atlar.

db.user.find().limit(10)
-> Sadece 10 satır getirir.

db.user.find().sort( { age : 1  } )
-> age ASC sıralaması yapar. -1 olsaydı DESC sıralardı.

db.getCollectionNames()
-> veritabanındaki tablo isimlerini  getirir.


use <table name>
use user  
-> user tablosuyla etkileşim yapar.

show dbs
-> server daki veritabanlarını getirir.

show collections
-> veritabanının tablolarını getirir.

MongoDB Kurulumu, Çalıştırılması, Basit Bir Örneği | Setup MongoDB, Executing, tutorial

Mongo dbnin kurulması çalıştırılması ve basit bir örnekle anlatılması için hazırlanmıştır. Mongo DB yi çalıştırabilmek için öncelikle mongod.exe yi çalıştırarak server hizmetini aktifleştirmemiz gerekmektedir. Bu serveri çalıştırmak için MongoDB nin kurulu olduğu dizine cmd ekranından ulaşmamız gerekmektedir.


C:\MongoDB

şeklinde kurulu olduğunu varsayıyorum,

cmd ekranında

cd "C:\MongoDB\bin"



komutunu yazıp enterlıyoruz. Konsolumuz bu klasöre giriş yaptıktan sonra yeni bir komut yazıyoruz. Bu yazacağımız komut MongoDB nin server hizmetini çalıştırmasını sağlayacaktır. Veritabanı için yazacağımız kodlar bu server üzerinden hizmet vermeye başlayacaktır. Konuyu fazla dağıtmadan devam edelim. Bu kodu yazmadan önce bir data klasörü oluşturmamız gerekmektedir. Bu klasörde verilerimiz yer alacaktır. “Data” Klasörümüzü MongoDB içinde manuel olarak el ile oluşturuyorum.

asdfasdfAlıntısı.PNG

Klasörümü oluşturduktan sonra hizmeti çalıştıralm. MongoDB hizmetinin çalışmasını sağlayan kodumuz:

mongod.exe --dbpath "C:\MongoDB\Data"


yazıp enterlıyoruz. Ve hizmetimiz çalışmakta...


Artık shell ekranımızdan veritabanı işlemleri yapabiliri. Shell ekranına gidebilmek için yeni cmd ekranı açıyoruz. Aynı şekilde MongoDB kalsörünün bin kalsörüne gidiyoruz.
> cd "C:\MongoDB\bin"

yazıp enterlıyoruz. Şimdi shellimizi çalıştıralım.

> mongo.exe

yazıp enterlıyoruz. Ve artık shell ekranındayız. Öncelikle herhangi veritabanımız varmı, onu görmek için

asdfasdasdfAlıntısı.PNG
> show dbs

yazıp enterlıyoruz. Aşağıda 3 adet veritabanı adı gözükmektedir. deneme isimli olan veritabanını daha önceden ben oluşturduğum için burada takılmayın. Şimdi veritabanımıza geçiş yapmak istiyoruz diyelim. Bunun için;

> use deneme

yazarak geçiş yapıyoruz. Eğer geçiş yapmak istediğiniz veritabanı mevcut değilse ve enterladıysanız hem geçişi yapar hemde olmayan veritabanını oluşturur. Geçişi yaptığımıza göre şimdi veritabanındaki tabloları görüntülemek isteyelim.

asdqwefasdasdfAlıntısı.PNG
> show collections

yazıp enterlıyoruz. Görüldüğü üzere bir adet user tablomuz mevcutmuş. Bunuda ben daha önceden oluşturmuştum. Tablo oluşturmak için özellikle çaba sarfetmemize gerek yok. Şimdi tabloda yapacağımız sorgulama işlemi ile o tabloyu oluşturabiliyoruz. Mantık: sorgularken olmayan tabloyu oluşturup onun üzerinde sorgulama yapmaktır. Yada olan tablo üzerince oluşturmadan sorgulama yapmaktır. Şimdi uye tablosu üzerinde ekleme işlemi yapalım.

asdqasdfasdfwefasdasdfAlıntısı.PNG
> db.uye.insert( { adi:“Ahmet”, soyadi : “Soylu” } )

yazıp enterlıyoruz. Ekrana eklendi bilgisi olan 1 sonucu döndürülüyor. şimdi eklediğimiz bilgiyi görmek için ekrana getirme sorgusu yazalım diğer bi deyişle SELECT sorgusu,

asdqasdasdfasdffasdfwefasdasdfAlıntısı.PNG
> db.uye.find()

yazıp enterlıyoruz. Görüldüğü üzere sorgumuz ekrana getirildi. Eklediğimiz veriyi Json formatında getirmeyi başardık. Şimdi bu veri üzerinde güncelleme yapmak isteyelim.





> db.uye.update({adi:"Ahmet"}, {$set: { age: 23, soyadi:"Besinci"}})

yazıp enterlıyoruz. Gelen bilgidende anlaşılacağı üzere Matched:Karşılaşma bulundu ve Modified:Düzenleme yapıldı sonuçları 1 döndü. Bu işlem sadece bir satır güncellemesi için kullanılır. Bütün satırlara kullanabilmek için;

> db.uye.update({adi:"Ahmet"}, {$set: { age: 23, soyadi:"Besinci"}}, {multi:true})

multi:true eklemek gerekmektedir. Böylece bütün tablodaki bütün adi Ahmet olanların soyadi ve yasi bilgisi güncellenir. Şimdi CRUD(Create,Read, Update, Delete) işleminin sonuncusu olan silme işlemini gerçekleştirelim.

Silme işlemi 2 şekilde anlatmak istiyorum. Birincisi eklediğimiz verilerin adi, yasi gibi sildirme işlemleri. İkincisi Id sini vererek komple satırı sildirme işlemidir.

İlki için;

asdAlıntısı.PNG
> db.uye.remove( { name: “Ahmet” } )

yazıp enterlıyoruz. name:”Ahmet” olan değerleri tablodan silmeye başlar.

İkincisi için;
asdasdAlıntısı.PNG
> db.uye.remove({_id:ObjectId("59106619f3f299487e2d3b89")})

yazıp enterlıyoruz. Ve id si eşit olan satırı komple silmeye başlıyor.

sizin için bazı temel komutları derledim.
Başlangıç için anlatılacaklar bu kadar arkadaşlar, İyi çalışmalar.

16 Haziran 2016 Perşembe

Change sprite with script | Sprite yi script ile değiştirme Unity3d

Merhaba arkadaşlar, unityde oluşturduğumuz nesnelerin kod ile görünümlerini bazen değiştirmek isteriz. Sprite olarak oluşturduğumuz görünüm dosyalarında bu değişiklikleri kod ile nasıl değiştiririz işte burada yazacağımız kod bize bu değişikliği sağlayacaktır.

Örneğin; ilerleyen bir nesnemizin zıplarken farklı bir görünüme sahip olmasını isteriz.

public Sprite changeObject;
public GameObject object = new GameObject();
 

void Start()
{
    object.gameObject.GetComponent<SpriteRenderer>().sprite = changeObject;

}

bu satırda gerçekleştirdiğimiz atama işlemi ile, nesnemizin sahip olduğu görünümü başka bir görünüm ile değiştirmekteyiz.


14 Haziran 2016 Salı

use properties for gameObject | Nesnenin özelliklerini kullanma, Unity3d

Merhaba arkadaşlar, unity3d projesinde oluşturduğumuz script dosyamızda, projemizdeki bir nesneni hareket etmesi ya da nesneyi renklendirme gibi farklı şekiller uygulamak isteriz. Script dosyamızı oluşturduktan sonra bu dosya ile nesneyi bir şekilde bağdaştırmamız gerekecektir. Bu bağdaştırma özelliği için öğrendiğim iki metodu sizinle paylaşacağım.
Script dosyasını oluşturduktan sonra AddComponent ile öncelikle nesnemin kontrolörüne(inspector) ekliyorum.
Add Componente tıkladıktan sonra Component menüsünden Scripts i seçiyorum. Burada görünen İsimler daha önceden oluşturmuş olduğum Script dosyalarımın isimleridir. Nesneme eklemek istediğim Script dosyasının ismini bu menüden bularak tıklıyorum ve kontrolörüme(inspector) ekliyorum. Ekledikten sonra kontrolörümde(inspector) Script dosyamın eklendiğini görüyorum.


Nesnem ile Script dosyamı birleştirdikten sonra Script dosyamda nesnemin özelliklerini kullanacağım.
İlk öğrendiğim metod Script dosyamda

public GameObject cube;

değişken tanımlaması yapıyorum. Bu tanımlamadan sonra dosyamı kaydedip Unitye dönüyorum. Nesneme tıkladıktan sonra kontrolörde(inspector) Script özellikğimin eklendiği bölüme geliyorum ve burada Script dosyasında tanımlama yaptığım değişkenimin adının yazıldığını görüyorum.


Değişken adının yanında bulunan "None" değerinin üzerine, Project sekmesinde bulunan nesnemi basılı tutup bırakıyorum.


bu işlemi yaptıktan sonra, Script dosyamda cube değişkeninde yaptığım değişiklikler oyundaki nesnemin üzerindeki değişikliklere neden olacaktır.

İkinci öğrendiğim metod ise Script dosyamda

public GameObject cube = GameObject.Find("Cube");

tanımlaması ile ilk yöntemim gibi nesneme ile script dosyamdaki değişken ile müdahale edebileceğim.  Burada bulunan Find fonksiyonu içerisine verilen parametre adı Hierarchy sekmesindeki nesnemin adı ile aynı olmalıdır.

Bu tanımlamalar ile yapılan bir örnek kod paylaşmak isterim.


 bu tanımlama sayesinde cube nesnemin bulunduğu pozisyon her üst ok ile alt oka tıklamamla değişecektir.

Unity3d InvokeRepeating, Invoke ve CancelInvoke nedir ? | What is InvokeRepeating, Invoke and CancelInvoke on Unity3d ?

Yeni başladığım unityle karşılaştığım bir metodu sizinle paylaşacağım. Bu metod ile unityde süreklilik sağlayabilmekteyiz. Yani Unity3d de nesneler üzerinde sürekli işlemler yaptırmak istiyorsak zamanlayıcı gibi kullanabileceğimiz InvokeRepeating metodu bize oldukça yardımcı olmaktadır. Bu metodun kullanımı:


şeklindedir. InvokeRepeating' in ilk parametresi olan "PropFunction" string değeri, fonksiyonun ismidir. Biz fonksiyonun ismini vererek o fonksiyonu InvokeRepeating fonksiyonunda sürekli çağırmasını sağlamaktayız.
İkinci parametre olan 3 değeri ile InvokeRepeating metodunu, programın çalışmasında sonraki başlatılma süresidir. Yani program başladıktan 3 sn sonra InvokeRepeating çalışmaya başlayacak.
Son parametre olan 1 ise string olarak ismini verdiğimiz fonksiyonun kaç saniyede bir sürekli çalışması istiyorsak verdiğimiz değerdir.


Invoke metodumuz ise süreklilik ifade etmeden bir kereliğine çalıştırmak istediğimiz fonksiyonlar için kullanılmaktadır. Örneğin, Invoke metodumuz da başlangıçta belirleyeceğimiz değerleri fonksiyon çağrısı yaparak tanımlayabiliriz. Çalışacak fonksiyon için program başlamasından sonra belirli bir süre sonra çalışmasını istiyorsak bu fonksiyonun özelliğini kullanarak bunu gerçekleştirebiliriz.


İlk parametre ile fonksiyonumuzun ismini vererek çağırma işlemi gerçekleştiriliyor. İkinci parametremiz sayesinde ise fonksiyonun kaç saniye sonra çalışmasını istiyorsak o süre aralığını vererek istenilen zamanda çalışmasını istiyoruz.


CancelInvoke fonksiyonu, çalışan invoke fonksiyonunu sonlandırmak için kullanılır. Mesela InvokeRepeating fonksiyonumuz çalıştıktan sonra sürekli olarak çalışacaktır. InvokeRepeating fonksiyonun sürekliliğinin engellenmesini istediğimiz anda CancelInvoke metodunu çalıştırılarak sonlandırmış olacağız.


Görüldüğü gibi tek parametre alan CancelInvoke fonksiyonunun aldığı parametre, Daha önceden InvokeRepeating ile çalıştırdığımız fonksiyonun ismini vererek o fonksiyonun çalışmasını durdurmaktayız. CancelInvoke fonksiyonu son kez çağırılan fonksiyonun sonlanması ile sonlanacaktır. Çağırılan fonksiyon kesmeye uğramayacaktır.


11 Haziran 2016 Cumartesi

Android ile Php web servisi oluşturma - Mysql Oluşturma ve sunucuya yükleme | Create php web service use with Android - Creating Mysql and upload server

Merhaba arkadaşlar, Bu yazımızda Android ile php web servisleri projesinde veritabanımızı oluşturacağız. Veritabanımı olarak Mysql kullanacağız. Öncelikle lokalde oluşturacağımız veritabanını daha sonrasında sunucumuza yükleyeceğiz. Bir önceki yazımızda sunucumuzdan bahsetmiştik.

Buradan Yazının Videolu anlatımına geçebilirsiniz.

Şimdi gelelim Veritabanımızı oluşturmaya. Bunun için önceden yüklediğimiz XAMPP serverde apache ile MySQL' i çalıştırıyoruz.


Daha sonra tarayıcımıza http://localhost:(apache port)/phpmyadmin yazarak phpmyadminimizi açıyoruz. Apache portum 31 olarak ayarlı. O yüzden ben http://localhost:31/phpmyadmin yazarak phpmyadmine giriş yapıyorum. Kullanıcı adı ile şifrem olmadığı için direk bağlantı sağlıyorum. Eğer sizin kullanıcı adı ve şifreniz varsa lütfen bilgilerinizi girip giriş yapın. Giriş yaptıktan sonra;

Yeni veritabanı oluşturuyorum adını 'DBphp' koyuyorum.



Oluşturulan veritabanımın SQL sekmesine tıklayarak aşağıdaki kodları kopyalayıp çalıştırıyorum.

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

CREATE TABLE `uyeler` (
  `UyeID` int(11) NOT NULL,
  `AdSoyad` varchar(255) NOT NULL,
  `Email` varchar(255) NOT NULL,
  `Sifre` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin5;

 
ALTER TABLE `uyeler`
  ADD PRIMARY KEY (`UyeID`);


ALTER TABLE `uyeler`
  MODIFY `UyeID` int(11) NOT NULL AUTO_INCREMENT;


 
çalıştırdığım zaman veritabanımda bir tane tablo oluşması gerekmektedir. Sonra veritabanımızın yedeğini alacağız. Bu yedeği alıp sunucumuza yükleyeceğiz.



Veritabanımıza seçerek;


Üstteki menüden Dışa aktara tıklıyoruz. Hiç bir ayarı değiştirmeden Git'e tıklıyoruz ve veritabanımızın yedeğini indiriyoruz.


Oluşan DBphp.sql dosyasını masaüstümüze alalım ki sunucuya yüklerken birdaha dosya yolunu göstermekle uğraşmayalım.


Şimdi sunucumuza giriş yapalım. Giriş yaptıktan sonra menüden Gelişmiş Araçların altında bulunan Veri Tabanı Yöneticisi' ne tıklıyoruz.


Açılan pencerede yeni bir veritabanı oluşturmamız gerekiyor.Veritabanı adının başında değiştirilemez bir isim yer alıyor ve devamında koymak istediğimiz veritabanı adını yazıyoruz. Ben değiştirilemez ismin devamına "dbphp" ekliyorum. Şifremi yazıyorum. Veritabanı oluştura tıklıyorum.


Oluşan veritabanı hemen sayfanın alt tarafında görüntüleniyor.



Burada Yönetim Başlığı altında bulunan "phpMyAdmin 4 See all tools" linkine tıklayarak sunucumun phpmyadmini ni açıyorum.


Açılan panelde İçe aktara tıklıyorum.

Gözata tıklıyorum. Burada DBphp.sql dosyamı daha önceden masaüstüme almıştım. Masaüstüne aldığım dosyamı seçiyorum ve Git' e tıklayarak sunucumdaki veritabanıma yedeklemiş olduğum veritabanını yüklemiş oluyorum.

Şimdi projemizin geri kalanına devam edelim.

Kullanılan materyaller:
- DBphp.sql

Android ile Php Web Service Kullanmak | Php web service use with Android (Videolu Anlatım)

Merhabalar Arkadaşlar, Yakın zamanda Android ile Asp.Net web servis kullanımı ile ilgili bir projeyi beraber yapmıştık. Şimdi Android uygulaması ile birlikte php web servis kullanımı yapacağız. Yapacağımız servisler web üzerinde canlı olarak yayın yapacak. Lokal de sınırlı kalmayacağız. Böylece canlı ortamda uygulamalarımızın çalışırlığınıda bir nevi öğrenmiş olacağız. Biliyorsakta bilmeyen arkadaşlarımız için öğretici bir yazı olacak.

Android uygulamamız olarak basit bir uygulama olacak. İçerisinde üyelik bilgileri ile ekle, sil ve listele özelliği bulunan bir uygulama yapaccağız. Verilerimiz, android uygulamamızdan web servislerimiz aracılığıyla veritabanımıza ulaşacak.

Kullanılan Uygulamalar
- Android (Android Studio)
- Lokal sunucu (Xampp server) - Phpmyadmin kullanılacak.
- Web Hosting - Linux (Biz.nf - http://cp1.biz.nf/beta)
- Notepad++ (Web servis)
- FileZilla
- Advanced Rest Client (ARC - Web servis client)
- TeamViewer (Android Emülator)

Kurulumlar:
- Android Studio Kurulumu
- Lokal Sunucu Kurulumu
- Web Hosting Üyeliği alma
- Notepad++ Kurulumu
- Advanced Rest Client Kurulumu
- TeamViewer Kurulumu PC - Mobil Bağlantısı

1- Web hosting' den öncelikle üyeliğimizi alalım. Videolu anlatım.
2- Mysql veritabanımızı oluşturalım ve sunucuya yükleyelim. İkinci işlem olarak Android uygulamamızın tasarımını oluşturalım. Videolu anlatım.
3- Web servislerini Androidin isteklerine göre oluşturacağız. Videolu anlatım.
4- Android ile uye ekleme işlemini gerçekleştirelim. Videolu anlatım.
5- Android ile uye listeleme işlemini gerçekleştirelim. Videolu anlatım. 
6- Android ile uye silme işlemini gerçekleştirelim. Videolu anlatım.

Uygulamamızın sonuna gelmiş bulunmaktayız.


-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

Uygulamamızda kullanılan dosyalara aşağıdaki linklerden edinebilirsiniz.



- Web Servisleri :
- Android Uygulama :
- DBphp.sql:





2 Nisan 2016 Cumartesi

html ile asenkron yapı kullanımı | use asenkron communication with html

En aşağıda gördüğümüz a href linkleri ile java fonksiyonuna parametre gönderiyoruz. Gönderdiğimiz parametre sonucu ilgili html sayfasını,

document.getElementById("ortaForm").innerHTML = xmlhttp.responseText;

komut satırında ortaForm id' sine sahip etiketin içersine gönderiyoruz.
fonksiyon içerisindeki yapı sayesinde çağırdığımız html sayfasını ana sayfa yenilenmeden yapıyoruz. Böylece oluşturulmuş projedeki sitenin performansının daha iyi olmasını sağlar. AJAX ile daha kullanışlı sayfalar oluşturabiliriz. Gerekli araçları kullanarak bir sayfada birden fazla işlem yaptırabiliriz. 


Bu yapı sadece html çağırımı ile sınırlı değildir. Php, .txt, .xml, .json vb. birçok değişik dosyayı asenkron biçimde çağırmaktadır.

<html>
<head>
    <script>
        function listele(file)
        {   
            if (window.XMLHttpRequest)
            {
                xmlhttp = new XMLHttpRequest();
            }
            else
            {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.onreadystatechange = function()
            {
                if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
                {
                    document.getElementById("ortaForm").innerHTML = xmlhttp.responseText;
                }
            }
            xmlhttp.open("GET", file, true);
            xmlhttp.send();
        }
    </script>

</head>
<body>

    <a href="#" onclick = "
listele('ders.html')"> 1. Yarıyıl derslerini listele </a></br>
    <a href="#" onclick = "
listele('ders2.html')"> 2. Yarıyıl derslerini listele </a>

    <div style="border:1px solid red; width:500px; height:250px;">

        <div id="ortaForm">
        </div>
   
    </div>
</body>
</html>


Herhangi bir hata almanız durumunda, projenizdeki <script> tagları bu yapının kullanımını engelleyebilir. diğer script taglarını silip bu yapıyı birde öyle deneyin ve çalıştığını göreceksiniz.

1 Nisan 2016 Cuma

Sql injection Savunma Yolları - İnputları Filtrelemek | defense of inputs for SQL injection - Filtre inputs

Sql injection bir forma parametre girerek onu ilgili yere göndererek gerçekleştirilir. Bu gönderme sonucunda veri tabanı ile ilgili işlemler yapılır. Bu işlemlerin amacını girdiğimiz input değerleri ile değiştirebilmekteyiz. Biz geliştiriciler olarak fonksiyonumuzun amacı dışına çıkmasını istemeyiz. Bu yüzden de bu gibi input değerlerini engellemeliyiz. Öncelikle ne gibi inputlar la bizim fonksiyonumuzun amacını değiştirdiklerini bir görelim:

"select * from Admin Where AdminAdi = '" + input1 + "' and ' AdminSifre = '" + input2 + "'"

bu sorgumuzun sonucunda Admin adi ve şifresi ile eşleşen bir veri olursa değerimiz pozitif olacaktır. Eşleşme olmazsa değerimiz null olarak dönecektir. Bu sorguyu kötü niyetli kişiler istediği gibi girebilebilir. Mesela admin adı için girilen input 1 değeri

1' or '1' = '1'"-- olursa şöyle bir tablo ortaya çıkacaktır.

"select * from Admin Where AdminAdi = '1' or '1' = '1'"--' and ' AdminSifre = '" + input2 + "'

bu sorgu sonucu pozitif olarak dönecektir. Çünkü 1=1 sorgusu sayesinde sorgunun değeri 1 olacaktır ve AdminSifre bilgisi yorum satırı olarak görülecektir. Bu gibi açıklıklar için savunma yollarını konuşalım.

Örneklerimi C# üzerinden vereceğim fakat bu fikirleri kullanarak istediğiniz dilde sizde oluşturabilirsiniz.

1- Öncelikle bu örneğimizin önüne geçecek bir filtre oluşturalım.

            public static string Temizle(string Metin)
        {
            string deger = Metin;
            try {
            deger = deger.Replace("'", "");
            deger = deger.Replace("<", "");
            deger = deger.Replace(">", "");
            deger = deger.Replace("&", "");
            deger = deger.Replace("[", "");
            deger = deger.Replace("]", "");
            }catch(Exception e) { }
            return deger;
        } 

 bu fonksiyonumuzu kullanarak özel işaretlerin silinmesini engelleyebiliriz. Böylece kötü niyetli kişiler sorgumuzun amacını değiştiremez.

2- İnput değerimizin sadece sayı olarak girilmesini istiyorsak;

        public static string sayikontrol(string Text)
        {
            try
            {
                int x = Convert.ToInt32(Text);
            }
            catch
            {
                Text = "0";
            }

            return Text;
        }


kullanabiliriz. Böylece sayı olarak girilmeyen karakterlerin engellenmesini sağlamış oluruz.

3- Url adresini input olarak alır isek şöyle bir filtre uygulayabiliriz.

        public static string UrlSeo(string Metin)
        {
            string deger = Metin;
            deger = deger.Replace("'", "");
            deger = deger.Replace(" ", "_");
            deger = deger.Replace("<", "");
            deger = deger.Replace(">", "");
            deger = deger.Replace("&", "");
            deger = deger.Replace("[", "");
            deger = deger.Replace("]", "");
            deger = deger.Replace("ı", "i");
            deger = deger.Replace("ö", "o");
            deger = deger.Replace("ü", "u");
            deger = deger.Replace("ş", "s");
            deger = deger.Replace("ç", "c");
            deger = deger.Replace("ğ", "g");
            deger = deger.Replace("İ", "i");
            deger = deger.Replace("Ö", "o");
            deger = deger.Replace("Ü", "u");
            deger = deger.Replace("Ş", "s");
            deger = deger.Replace("Ç", "c");
            deger = deger.Replace("Ğ", "g");

            return deger;
        }

böylece türkçe karakterler ve bazı özel karakterlerin kullanılmasını engelleyebiliriz.

4- İnputlarımız için validator(doğrulayıcı) kullanımı oldukça iş görmektedir.  Bunun için ilgili makalelerde arama yapabilirsiniz. Size bu konuyu bir örnekle kısaca açıklayayım.

<td class="style2">
    <asp:TextBox ID="txtemail" runat="server">
    </asp:TextBox>
 </td>

 <td>
    <asp:RegularExpressionValidator ID="remail" runat="server"
       ControlToValidate="txtemail" ErrorMessage="Mail adresini gir"
       ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">
    </asp:RegularExpressionValidator>
 </td>


burada email adresinde farklı karakterler olması durumunda input değerini kabul etmeyecektir ve ekrana ilgili hatayı bastıracaktır.

5- Url de görülen get metodu ile aldığımız bazı veriler bizim savunmasız kalmamıza neden olabilmektedir. Örneğin:

http://savunmasizsite.com/index.asp?id=1; SHUTDOWN WİTH NOWAIT;

parametresini girerek idnin yanındaki noktalı virgül ile sql cümlesini tamamlar ve yanındaki diğer komut cümlesi ile sql veritabanınızın servis hizmetini durdurabilir. Bu durumda bizim savunmamız burada gelen parametrenin belli uzunlukta olması gerektiğidir. Parametre uzunluğunu kısıtlarsak buradaki sorgu amacına ulaşmayacak ve veritabanımız hizmeti sağlamaya devam edecektir.

6- C#' ta sql sorugu için daha güvenilir bir kullanım mevcuttur. Sql sorgusunda parametre kullanılmalıdır. Yani;

string cmdStr = "SELECT * FROM Users WHERE UserName=@UserName AND Password=@Password";
SqlCommand cmd = new SqlCommand(cmdStr, sqlConnection);
cmd.Parameters.Add("@UserName",SqlDbType.NVarChar,50);
cmd.Parameters.Add("@Password",SqlDbType.NVarChar,50);
// İlk veri girişi
cmd.Parameters["@UserName"].Value="Burak";
cmd.Parameters["@Password"].Value="Burak12041976";
cmd.ExecuteNonQuery();


Bu sayede gelen parametreler tek tırnaktan bağımsız çalışacaktır ve hız açısından da bu kullanım önerilmektedir. Görüldüğü gibi gelen parametre tipleride belirlenmiş oldu. Veri tipleri farklı olursa bir engelleme söz konusu olacaktır.



Zamanla başka savunma yöntemlerimi sizinle bu yazımda tekrar paylaşacağım. Tekrar görüşmek üzere.

31 Mart 2016 Perşembe

Android ile Web Servis Kullanmak (Asp.Net) | asp.net web service use with Android (Video)

Asp.Web servisi oluşturuldu. Bu servisin içersinde sunucuya yüklenmiş olan veritabanına veri ekleme ve verileri getirme özellikleri içeren fonksiyonlar tanımlandı. Bu sayede Android uygulaması ile geliştirilen uygulamanın bu servisi kullanarak parametre göndermesi ya da bu servisten veri istekleri yapması sağlanmıştır. Böylece uygulama istekte bulunduğu web servis ile sunucudaki veritabanına ulaşması sağlanmıştır.

Birde bu yapıyı videolarla ve ya makale ile anlatmaya çalıştım. Kolay gelsin

1 - Somee.com'a üye olundu.



2 - VeriTabanı oluşturma ve bu veritabanını sunucuya yükleme işlemleri yapıldı.




3 - Asp.net Web servis projesi oluşturuldu. Web servis ile veri ekleme ve listeleme yapıldı. Web servis sunucuya yüklendi.



4 - Android uygulaması için proje oluşturuldu. Bu projenin ana menüsü tasarlandı ve çalışır hale getirildi.



5 - Android uygulaması ile web servis bağlandı. Web servise parametreler gönderilerek veri ekleme işlemi yapıldı.



6 - Android uygulama ile web servis bağlandı. Web servisten uygulamaya veriler getirildi ve veri listeleme yapıldı.



Projenin Dökümanları :
- Sql Veri Tabanı
- Asp.net web servis
- Android projesi

30 Mart 2016 Çarşamba

Android ile Web Servis Kullanmak (Asp.Net) | asp.net web service use with Android

Merhabalar arkadaşlar,
(Videolu anlatım)
Web Servis konusunda size yardımcı olmaya çalışacağım, Bu makalemde size android programlama yapanlar için, asp.net ile oluşturacağımız web servisini kullanmayı basit bir şekilde anlatmaya çalışacağım.

Öncelikle servisimiz için bir veritabanı oluşturalım. (MsSql oluşturma)

Veritabanımız hazır sırada webservisimizi oluşturalım. (Asp.net Web Servis Oluşturma)

Son olarak android ile bu servisleri kullanmak kaldı.
Android Studiomuzu açıyoruz ve yeni proje oluşturuyoruz. Projemizin adını WebServis koydum ve next dedim;

sonraki ekranda hiç bir değişiklik yapmadan next diyerek geçiyorum;

sonraki ekranda boş bir aktivity projesi seçeceğim. Bunun için "Add No Activity" seçiyorum. Finish tıklıyorum. Projemin oluşmasını bekliyorum.


Projem oluştuktan sonra ekranın solundaki "Project" etiketine tıklayarak projenin dosya hiyerarşisini görüntülüyorum. Bu görüntünün "Android" dosya hiyerarşisi olmasını istiyorum.
Projeme ilk olarak bir java sınıfı eklemek istiyorum. Eklemek için com.webservis klasörünün üzerine sağ tıklıyorum sonra New>Java Class tıklıyorum. Yeni sınıfımın adını "MainActivity" yazıyorum ve OK tıklıyorum. artık yeni sınıfım eklenmiş oluyor. Yeni sınıfıma aşağıdaki kodları ekliyorum.


MainActivity.java
package com.webservis;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    Button bEkle, bListele, bSil;
    TextView etIP;
    String Url;
    View.OnClickListener Listener;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        install_elements();
        bEkle.setOnClickListener(Listener);
        bListele.setOnClickListener(Listener);
    }
    private void activity(Class c)
    {
        Intent intent = new Intent(MainActivity.this,c);
        intent.putExtra("Url", Url);
        startActivity(intent);
    }

    private void install_elements() {
        bEkle = (Button) findViewById(R.id.bEkleGit);
        bListele = (Button) findViewById(R.id.bListeleGit);
        etIP = (TextView) findViewById(R.id.etIP);
        Url = "http://denemelerdenemeler.somee.com/"; //--> Somee.com
        //Url = "http://10.7.1.183/";  //---> Ev ip
        //Url = "http://10.7.1.113/";    //---> Okul ip

        Listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                switch (v.getId()) {

                    case R.id.bEkleGit:     activity(Ekle.class);    break;
                    case R.id.bListeleGit:  activity(Listele.class);   break;
                    default:                break;
                }
            }
        };
    }
}


Bu sınıf için bir görünüm dosyası oluşturmam lazım. Bu dosyayı oluşturabilmek için dosya hiyerarşisideki res klasörüne sağ tıklıyorum. New>Android resource directory tıklıyorum ve "Directory Name" kısmına "layout" yazıyorum ve OK butonuna tıklıyorum. Bu sayede klasörümüze layout dosyasını eklemiş oluyoruz. Bu klasörün altında yeni bi dosya oluşturacağım. layout klasörünün üstüne sağ tıklıyorum New > Layout resource file tıklıyorum. "File name" kısmına "activity_main" yazıyorum ve OK tıklıyorum. Oluşturduğum bu dosyaya çift tıklıyorum ve aşağıdaki gibi layout dosyanın text kısmına giriyorum. Aşağıda text kısmının nerede olduğunu görebilirsiniz.


Bu kısma aşağıdaki kodlarımı ekliyorum:

activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_marginTop="100dp"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:id="@+id/bEkleGit"
        android:text="Ekle"
        android:layout_gravity="center"/>
    <Button
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:id="@+id/bListeleGit"
        android:text="Listele"
        android:layout_gravity="center"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/abc_action_button_min_width_material"
        android:id="@+id/etIP"/>
</LinearLayout>
 

Main Activity sınıfımız ile menü ekranımızı oluşturmuş oluyoruz. Bu ekranda Ekleme ve Listeleme butonları mevcuttur. Bu butonlara tıklandığında yeni görünümlere gidilecek. Bu görünümlerden ilki ekle görünümü. Öncelikle Ekle java sınıfımızı oluşturalım. Bunun için com.webservis klasörümüze sağ tıklayarak yeni bir java sınıfı oluşturacağız. Sınıfımızın adını "Ekle" koyuyorum. Aşağıdaki kodları bu sınıfıma ekliyorum.

Ekle.java
package com.webservis;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import java.net.URI;
import java.net.URLEncoder;

public class Ekle extends Activity {

    EditText etIsim, etEmail;
    Button bEkle;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ekle_main);
        install_elements();

        bEkle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                new PhpGetSendWS().execute();
            }
        });

    }

    class PhpGetSendWS extends AsyncTask<String, String, String>
    {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... params) {

            try {
                HttpClient httpclient = new DefaultHttpClient();
                HttpGet request = new HttpGet();

                String isim = URLEncoder.encode(etIsim.getText().toString(),"utf-8");
                String email = URLEncoder.encode(etEmail.getText().toString(), "utf-8");

                request.setURI(new URI(getIntent().getStringExtra("Url") +
                        "uyelik.asmx/UyeEkle?AdSoyad=" + isim + "&E_posta=" + email));
                //Get isteğimizi URL yoluyla belirliyoruz.

                if(!httpclient.execute(request).equals(null)) //İsteğimizi gerçekleştiriyoruz.
                {
                    ToastYazdir("Eklendi");
                    Thread.sleep(1500);
                    Intent i = new Intent(Ekle.this,Listele.class);
                    i.putExtra("Url", getIntent().getStringExtra("Url"));
                    startActivity(i);
                }

            }catch (Exception e)
            {
                ToastYazdir("Hata oluştu.");
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
        }

    };
    public static String convertStreamToString(java.io.InputStream is){
        java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
        return s.hasNext() ? s.next():"";
    }
    private void ToastYazdir(final String str)
    {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
            }
        });
    }
    private void install_elements()
    {
        etIsim = (EditText) findViewById(R.id.etIsim);
        etEmail = (EditText) findViewById(R.id.etEmail);
        bEkle = (Button) findViewById(R.id.bEkle);
    }
}


Bu kodları Ekle sınıfımıza ekledikten sonra Http kütüphanesini dosyamıza dahil etmeliyiz. Http Kütüphanesini Ekledikten sonra Ekle sınıfımızın layout dosyasını ekleyelim. Dosya hiyerarşisindeki layout klasörüne daha öncedende eklediğimiz gibi sağ tıklayarak "ekle_main" adında layout ekliyorum. Bu layouta çift tıklıyorum ve Text bölümüne aşağıdaki kodları yapıştırıyorum.

ekle_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:layout_marginTop="100dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="Ad ve Soyad"
        android:ems="10"
        android:id="@+id/etIsim"
        android:layout_gravity="center_horizontal" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textEmailAddress"
        android:hint="Email"
        android:ems="10"
        android:id="@+id/etEmail"
        android:layout_gravity="center_horizontal" />

    <Button
        android:layout_marginTop="50dp"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text="Ekle"
        android:id="@+id/bEkle"
        android:layout_gravity="center_horizontal" />
</LinearLayout>


Daha sonra ana ekranımızdaki listeleme özelliğini yapacağız. Bunun için Listele sınıfımı oluşturacağım. Oluşturabilmem için com.webservis dosyama sağ tıklıyorum ve yeni bir java sınıfını "Listele" adı altında ekliyorum. Bu sınıfıma aşağıdaki kodları ekliyorum.

Listele.java

package com.webservis;


import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Listele extends Activity {
    ArrayAdapter<String> adapter;
    String resp = null;
    ArrayList<String> data = new ArrayList<>();
    boolean post=false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listele);

        new AspData().execute();

    }

    public class AspData extends AsyncTask<String, String, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... params) {

/*
            // GET METODU

            DefaultHttpClient hc = new DefaultHttpClient();
            ResponseHandler response = new BasicResponseHandler();
            HttpGet http = new HttpGet(getIntent().getStringExtra("Url")+"uyelik.asmx/GetUyeler?");

            try {
                resp = (String) hc.execute(http, response);
                resp = cutstring(resp);

                JSONArray json = new JSONArray(resp);

                for(int i=0;i<json.length();i++){
                    JSONObject e = json.getJSONObject(i);
                    data.add(e.getString("AdiSoyadi") + " - " + e.getString("Eposta"));
                }

                adapter = new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_list_item_1,data);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
*/

          
            // POST METODU
            try
            {
                HttpClient httpClient=new DefaultHttpClient();
                HttpPost httpPost=new HttpPost(getIntent().getStringExtra("Url")+"uyelik.asmx/GetUyeler");
                HttpResponse httpResponse=  httpClient.execute(httpPost);
                resp = readResponse(httpResponse);
                post = true;
                resp = cutstring(resp);

                JSONArray json = new JSONArray(resp);

                for(int i=0;i<json.length();i++){
                    JSONObject e = json.getJSONObject(i);
                    data.add(e.getString("AdiSoyadi") + " - " + e.getString("Eposta"));
                }

                adapter = new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_list_item_1,data);
            }
            catch(Exception exception)  {}


            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            ListView lv = (ListView) findViewById(R.id.myListView);
            lv.setAdapter(adapter);
        }

        private  String cutstring(String resp)
        {
            resp = resp.replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", "");
            resp = resp.replace("<string xmlns=\"http://tempuri.org/\">", "");
            resp = resp.replace("</string>","");
            if(!post)
                resp = resp.substring(2,resp.length());
            return resp;
        }
        public String readResponse(HttpResponse res) {
            InputStream is=null;
            String return_text="";
            try {
                is=res.getEntity().getContent();
                BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(is));
                StringBuffer sb = new StringBuffer();
                String line="";
                while ((line=bufferedReader.readLine())!=null)
                {
                    sb.append(line);
                }
                return_text=sb.toString();

            } catch (Exception e)  { }
            return return_text;
        }
    }

}


sonrasında bu sınıfın görünüm dosyasını ekliyorum. Bunun için layout klasörüme sağ tıklıyorum yeni bir layout dosyasını "listele" adı altında ekliyorum. eklediğim bu dosyanın Text bölümüne geçip aşağıdaki kodları ekliyorum.

listele.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/myListView"
        android:background="@color/accent_material_light"
        android:layout_gravity="center_horizontal"/>

</LinearLayout>


projemin bütün sınıflarını ve görünümlerini tamamladım.Geriye tek bir adım kaldı buda AndroidManifest.xml dosyama aşağıdaki kodları eklemem. Bu kodlar Activity sınıfından kalıtım alan sınıfların görünümlerini sağlaması açısından luzumludur.

Android manifest dosyama;

AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.webservis">

<application android:allowBackup="true" android:label="@string/app_name"
    android:icon="@mipmap/ic_launcher" android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".Ekle" >
        <intent-filter>
            <action android:name="android.intent.action.EKLE" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity android:name=".Listele" >
        <intent-filter>
            <action android:name="android.intent.action.LISTELE" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>


ekledikten sonra artık projemi çalıştırabilirim. Android studio da projemi çalıştırıyorum.
    Run > Run 'app'  (Shift + F10)


telefonda ilk olarak ekleme işlemi yapacağım bunun için Ekle butonuna tıklıyorum.



Ad Soyad ve Email bölümüne verilerimi yazıyorum ve Ekle butonuna tıklıyorum. Eklendi uyarısını aldıktan sonra listeleme ekranına yönlendirme yapıldı.


Görüldüğü gibi listeleme ekranında girdiğim veri görüntülendi.

Evet arkadaşlar Asp.net ile Web servisimizi oluşturduk, Sql veritabanımız ile web servisimizi bağladık ve android ile bu servisi kullandık. Buradaki ekranlarımız yaptığımızın uygulamanın görüntüleridir. Herhangi bir sorun olursa yorum olarak belirtirseniz yardımcı olmaya çalışacağım.

Proje Dökümanları :
- Sql Veri Tabanı 
- Asp.WebServis
- Android Uygulaması