Arşivler: 2008

Programlama Dilleri ve Yapısal Özellikleri

Yorum Yapılmamış

18/10/2008 at 16:15Kategori:.Net | Bilgisayar | Java | Python

Bu yıl java dilin öğrenmeyi hayal ettiğim programlama dili dersinin içeriğinin değiştiğini öğrendiğimde önce biraz üzüntü duydum. Kendim java öğrenirken de burada paylaşmak istiyordum ki bu düşüncelerimi gerçekleştiremeyecek olmak beni üzdü. Fakat içeriği öğrendiğimde çok farklı şeyler düşündüm çünkü aldığım ders ile çoğu revaçta olan dilleri karşılaştırmalı olarak göreceğiz. Bu sayede dillerin gelişim süreçlerini bileceğiz ve uygulamalar için uygun dillerin seçimini de yapmamız kolay olacak. Bir diğer konu ise almaa başladığımız veri yapıları ve algoritmalar dersi. İlk başta bir yazılım mühendisi ile dışarıdan bu işi öğrenen bir progamcının farkının olmadığını düşünüyordum. Bu iki dersle birlikte özellikle yazılım konularında başarılı olmak için Veri Yapılarının ve Algoritmaların mühendis - tekniker- programcı ayrımı gözetmeden çok iyi incelenmesi gerektiğini öğrendim.
En önemli nokta da derslerin ve bu yoğunluğun arasında bazı şeylere zaman ayıramıyor olmam. Bunların başında da değerli blogum geliyor. Artık yazılarım azalıyor gibi olsa da daha dolu dolu içeriklerle tekrar birlikte olmak dileğiyle...

FileUpload Kontrolünü Etkili Kullanmak ve Güvenlik Konuları

Yorum Yapılmamış

04/10/2008 at 14:06Kategori:.Net

File Upload Kontrolü ASP.net 2.0 ile gelince çoğu problemimiz çözüldü fakat server ile ilgili ve HTTP altyapısında bulunan bazı kısıtlardan dolayı File Upload kullanımında sürükle bıraktan daha fazlasını bilmek gerekiyor. Öncelikli olarak server için yapılması gereken ayarlama FileUpload sonucu gönderilen dosyaların saklanacağı klasörün Network Service kullanıcı için read-write izinlerini sağlıyor olması gerekli. Bunun için ISS ile ya da Klasör için Advance Configurations ayarlarını yapmamız gerekiyor.(ISS 6-7 için Network Service,ISS 5 için ASP.net kullanıcısıdır.)
Bir diğer sorun da web.config içerinden ayarlanabilecek bir ayarlamayla

ile kb cinsinden dosya boyutları ve sn cinsinden time out süreleri ayarlanmalıdır. Bu iki konu aşıldığında ise FileUpload kontrolünü kullanmak kolay olacaktır. Server da gerçekleştireceğiniz diğer işlemler(XML okuma yazma ya da basit file Stream dahi) için ISS için söylediğim ayarlamalar yapılmalıdır. File upload kontrolünün bulunduğu sayfa için role tabanlı ya da windows tabanlı bir güvenlik sistemi oluşturulması izinsiz kişilerin sizin dosyalarınız arasına dosya göndermesini engeller fakat izinsiz kod çalıştırılmasını engellemek için sadece ihtiyaca göre dosya uzantılarını kısıtlarsak bunun önüne kolayca geçebiliriz.

protected void Button1_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile) // Dosya yolu girilmişse
{
string extension = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();
if (extension == ".jpg" extension == ".gif")
{
try
{
string path = Request.PhysicalApplicationPath + @"data\";
string dosyaAdi = Path.GetFileName(FileUpload1.PostedFile.FileName);
string uploadYolu = Path.Combine(path, dosyaAdi);
FileUpload1.PostedFile.SaveAs(uploadYolu);
Label1.Text = string.Format("Dosya yüklendi..
Dosya adı: {0}
Dosya boyutu: {1} byte
Dosya adresi: {2}", FileUpload1.PostedFile.FileName, FileUpload1.PostedFile.ContentLength, Server.MapPath("data") + FileUpload1.PostedFile.FileName);
}
catch (Exception ex)
{
Label1.Text = ex.Message;
}
}
}
}
Bu kodlarla ben sadece resim dosyaları için açtığım bir klasöre istediğim resim formatlarında olan dosyaları kabul ettim.Eğer böyle bir kontrol yapmamış olursam kötü niyetli bir kişi benim yapmış olduğum fileupload kontrolü ile kendi yazdığı asd.aspx ve asd.aspx.vb (kötü niyetli kişimiz vb ile yazıyor olsun :) ) ) dosyalarını atarak ilk olarak düşünebildiğim benim klasörümdeki tüm resimlerimi silebilir. Bunu önlemenin diğer bir yolu da klasörümüzde bir kod sayfası bulundurmayacaksak ISS altındaki bu klasör için Network Service kullanıcısının executable yeteneğini kaldırabiliriz.

web.config-I

Yorum Yapılmamış

02/10/2008 at 18:27Kategori:.Net

web.config ASP.net ile haşır neşir olan herkesin birgün kesinlikle karşılaşacağı ve daha da önemlisi bir daha onsuz yapamayacağı bir dosya. Evet dosya çünkü içinde bildiğimiz XML formatında yazılmış bazı veriler var. Bu veriler ise işte o noktada kıyamet kopuyor doğru ayarlar sizi birçok sorumluluktan korurken, yanlış veya bilinmeyen yönleriyle bizi çok sıkı bir yola itiyor. Ben bu yazımda karşılaştığım ve sık sık kullandığım konulara yer vermeye çalışacağım.
Öncelikle web.config neyi ayarlar konusuna değinmeliyiz. Web.config aslında her server da bulunan ve güvenlik, doğrulama ve diğer verileri taşıyan machine.config dosyalarını ezmeye yarayan bir dosyadır. Ezmeye sözcüğünü kullandım çünkü durumu bu sözcük çok iyi anlatıyor. web.config ile ayarladığınız konularda sizin ayarlarınız etkin olurken hiç değinmediğiniz konularda serverda bulunan machine.config ler içindeki bilgilere göre hareket ediliyor. machine.config- ler diyorum çünkü machine.configler çok sayıdadır. (Birisi .net framework klasörü içindedir.) Local ISS ile çalıştırdığımız asp.net sayfalarımız için machine.config leri kullanarak da düzenleme yapabiliriz fakat bu iyi bir yöntem değildir çünkü çoğu programcı kendi bilgisayarında yazdığı kodu kendi ISS i ile internete yaymaz. config dosyalarının hiyerarşisini anladığımıza göre benim karşılaştığım noktalara değinebiliriz.
İlk konu bölgesel konular.Biz kullandığımız çoğu veriyi serverdan alma ihtiyacı duyarız. Saat - Tarih gibi bilgileri DateNow(); ile alınca benim bilgisayarımda Amerikan formatlarına göre gelirken Türkiyedeki bir hosting firmasında Türkiye ye göre gelir ve godaddy den hosting almışsanız yine Amerikan formatlarında gelir. Türk kullanıcıya 12.02 PM 12 Aug . 2008 gibi bi veriyi okutmak pek doğru olmaz. Bu sorunu çözmek için serverdaki ayarları kendinize göre değiştirmeniz gerekir. Bunu da web.config içerisine



ekleyerek sağlayabilirsiniz.
Burada eksik kalan nokta XML yapısında olan bir döküman olduğu için web.config içerinde zaten element olarak yazmanıza gerek yoktur. İncelediğinizde zaten var olduğunu göreceksiniz.


Bir web.config dosyasının hiyerarşik dizilimi:






şeklindedir.
Diğer önemli konu da web.config global bir dosyadır. En önemli özelliklerinden biri dışarıdan bir kullanıcının bu dosyayı indirip okuyamıyor olmasıdır. Durum böyle olunca bizim global verilerimiz için de iyi bir saklama konumu olacaktır. Sql bağlantısı kullanan uygulamalarda ConnectionString bilgisini bu dosyaya elementleri arasına yazmak adettendir. Adet olarak kabul görmesinin sebebi ise SqlConnection bilgilerimiz değişince sadece tek yerden bu veriyi değiştiriyor olmamızdır. Bu veriyi kodlarımız arasında nasıl kullanacağız derseniz tek satırlık kod ile işiniz çözülecektir.
ConfigurationSettings.AppSettings("sConnectionString");

Ayrıca bu ayarlar içerinde SMTP server bilgilerini saklamak da mantıklı bir çözüm olur.


C# Güvenlik Önerileri

Yorum Yapılmamış

10/08/2008 at 12:11Kategori:.Net

MSDN dökümanları arasında dolaşırken C# ile yazdığımız kodlarda güvenlik için öneriler adlı bir yazı ilgimi çekti. Dilimin döndüğü kadarıyla burada yazmaya çalışacağım.
1.) Değişkenler arasındaki işlemlerde (toplama çıkarma..) ve diğer over-flow ihtimallerine karşı checked anahtar sözcüğü kullanılmalı.
2.) Parametre olarak her zaman kısıtlayıcı türler kullanılmalı. Örnek olarak bir metoda veri yapısı sayısını aktaracak olan parametre int yerine uint olarak tanımlanmalı.
3.) Dosya isimlerine dayalı karar vermeyin. Dosya isimleri değişik yöntemlerle kısaltılmış olabilir.
4.) Uygulama içinde kesinlikle hard code password ya da özel bilgi bulundurulmamalı.
5.) Sql Sorguları ile her giriş kontrol edilmelidir.
6.) E- mail adresi gibi girişler System.Text.RegularExpressions sınıfında bulunan fonksiyonlarla kontrol ettirilmeli.
7.) Hata yakalama sonucunda ortaya çıkan mesajlar direk olarak kullanıcıya gösterilmemeli. Çünkü bu mesajlar veri türleri ya da program işleyişi hakkında kötü amaçlı kişilere bilgiler verebilir.
8.) Uygulamanızın mümkün olan en az izinle çalışabilmesini sağlamanız gerekli. Çünkü çok az uygulama administrator girişi gerektirir.
9.) Kişisel şifreleme algoritmaları kullanmayın. System.Cryptography sınıfını kullanın.(Bu maddeye fazla katılmıyorum. En zeki siz MS çalışanları mısınız? :) )
10.) Assembly lerinize güçlü isimler verin.
11.) XML veya diğer konfigurasyon dosyasında çok hassas bilgi depolamayın.
12.) Native kodun güvenli olduğuna emin olun.
13.) Delegelerinizi (Delegates) dışarı aktarırken bir uyarı kullanın.
14.) Visual Studio code analysis tool kullanarak kodlarınızı analiz ettirin. 200 e yakın tehdit ve açığın kapatıldığı görülmüştür.
Ayrıca bir öneri de benden. Yazdığımız kodların güvenliği için programın en son olarak bir dotfuscator aracından geçirilmesi gerekli. Bu araç çalışma zamanındaki kodu tekrar c# koduna dönüştüren yazılımlara karşı koruma görevini yerine getiriyor. Değişken- Fonksiyon- Özellik isimleri değiştirilerek anlamsızlaştırılıyor ve böylece kodu bir araç kullanarak elde eden kişi koddan fazla birşey anlayamıyor.

C# BASICS: Boxing ve Unboxing

Yorum Yapılmamış

08/07/2008 at 12:04Kategori:.Net

C# dilinde boxing ve unboxing çok basit gibi görünen fakat çok önemli bir yer tutan kavramlardır. C# dilinde temel tipleri deger tipleri(value types ) ve referans tipleri(reference types) olarak iki tiptir ve bu tiplerin bellekte saklanma şekilleri farklılık gösterir. Bu konudaki en önemli nokta da işte bu bellek bölgeleridir. Bellek bölgeleri Stack(yığın) ve Heap(öbek ) olarak iki kısımdır. Değer tipi değişkenler belleğin stack alanında bulunurlar. Değer tipi değişkenler bool, int, char, double, sbyte, byte, short, decimal, struct, uint, enum, ulong, float, ushort tipleridir. Referans tipleri ise class, interface, delegate, object tipleridir.Şimdi c# da herşey bir nesnedir veya objectir diyoruz da bir integer veri tipi nereden türetilmiştir diye akıllara bir soru gelebilir. Cevap structlarda gizlidir. Structlar anlatılırkenc# da classlar varken structlara neden ihtiyaç duyulduğu gibi bir soru akıllara gelir ve ardından hemen cevap olarak structların stack bölgesinde saklandığı ve stack bölgesine heap bölgesinde saklanan verilere göre daha hızlı erişim sağlanacağıdır. İlk sorunun cevabı da değer tiplerinin (int gibi) aslında birer struct olduğudur.Değer tipleri stack alanında tutulurlar fakat referans tipleri stack alanında (C dilindeki işaretçilere benzetebiliriz) bir referans bulundururlar ve asıl değerler heap alanında saklanırlar. İşlem yapılacağı zaman referans türünün işaret ettiği heap bölgesinden veri aktarılır.

Boxing ve Unboxing işlemleri de bu arada devreye giriyor. Boxing bir değer türünden bir değişkeni referans türünden nesneye aktarmaktır. Unboxing işlemi ise referans türünden bir nesnenin işaret ettiği değeri, değer türünden bir değişkene aktarmaktır.Tabiki değer ve referans tipleri arasındaki fark bu tiplerin ya da referansların işleri bitiğinde belleğin serbest bırakılması sırasında da olrata çıkıyor. Değer tipleri otomatik olarak belleğe geri verilirken referans türlerinin geri kazandırılmasında stact bölgesindeki referans ya da başvuru otomatik olarak belleğe kazandırılırken heap bölgesindeki veriler Garbage Collection mekanizması ile kazanılır.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BoxingAndUnboxing
{
class Program
{
static void Main(string[] args)
{
int sayi = 31111;
object obj;
obj = sayi;
//Boxing işlemi...
Console.WriteLine("Sayi: {0} obj : {1}", sayi, obj);
}}}
Burada boxing işlemi otomatik olarak yapılır ve integer degerinde bir object referans tipi oluşturulur. Unboxing işlemi ise boxing işlemi gibi otomatik yapılmaz ve programcının unboxing işlemi sırasında dikkatli olması gerekir. Çünkü her zaman tipler arasında dönüşüm yapılamayabilir. Dikkatsiz unboxing işlemlerinde veri kayıpları olabilir ve exception fırlatılır.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BoxingAndUnboxing
{
class Program
{
static void Main(string[] args)
{
int sayi = 31111;object obj;obj = sayi;
//Boxing işlemi...
Console.WriteLine("Sayi: {0} obj : {1}", sayi, obj);int sayi2;sayi2 = (int)obj;
// Unboxing İşlemi...
Console.WriteLine("Sayi2 : {0}", sayi2);
}}}

UAC kontrolü

Yorum Yapılmamış

29/06/2008 at 12:01Kategori:Bilgisayar

Bazen programlarımızda windows versiyonunu gözeterek işlemler ya da ayrıcalıklar oluşturmak zorunda olabiliriz. Kullanıcının işletim sisteminin en azından hangi sistem kuşağından olduğunu anlayabiliriz hemde çok kısa yoldan.XP versiyon 5; vista versiyon 6 dır. Yine Environment sınıfından yararlanacağız.Ben programımızın aradığı özelliğin UAC kontrolü olduğunu varsayarak bir örnek yaptım ve işletim sistemin vista olduğu için versiyon 6 bilgisini aldım.
using System;
using System.IO;
class UAC
{
public static void Main()
{
if (ChechUAC())
{
Console.WriteLine("UAC may be enabled");
}
}
public static bool ChechUAC()
{
int MajorNumber = Environment.OSVersion.Version.Major;if (MajorNumber >= 6)
return true;
return false;
}
}

Kullanıcı Dizinlerine Ulaşmanın Kolay Yolu

Yorum Yapılmamış

06/05/2008 at 11:59Kategori:.Net

Kullanıcının kullandığı desktop - my documents- videos- Application Data ve temp gibi daha birçok işlevsel klasörlerin adreslerini kolayca yakalamamıza yarayan GetFolderPaht(..) metodu ile yazdığımız uygulamalarda kolayca dosyalarımızla çalışabiliriz.
Örnek olarak masaüstüne bir txt dosyası oluşturup içine merhaba yazdıran bir dosya akışının kullanılması
using System;
using System.IO;
class IOO
{
public static void Main()
{
string Path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
StreamWriter sw = new StreamWriter(Path + @"\deneme.txt", true);
sw.WriteLine("Merhaba");
sw.Close();
}
}
şeklinde ve oldukça kolay.Environment.NewLine; satırı ile de yeni Consol uygulamanızda yeni bir satıra atlayabilirsiniz. Environment sınıfını incelemekte yarar var:)