Xml veritabanı hakkında bir soru

Merhaba arkadaşlar, ben yaklaşık dört-beş gün önce https://www.astro.com sitesinin yöneticisinden geliştirmek istediğim bir istatistiksel program için kişilere ait bir takım bilgileri içeren veritabanını benimle paylaşıp paylaşamayacağını sormuştum. Veritabanı ziplenmiş bir xml formatında tutuluyor. Kendisi bana şifre gönderdi ve xml dosyasını dışarı çıkardım. Sonra başladım oluşturmak istediğim programı tasarlamaya. Dün programı tasarlama aşaması sonlandı, bir kaç test yaptım ve programın kullanılabilir durumda olduğunu gördüm. Sonra site yöneticine bir mail attım, programı geliştirmeyi tamamladığımı ve kendisinden gelecek mesaja göre programı ya başkalarıyla paylaşacağımı ya da paylaşmayacağımı bildirdim. Bana veritabanını sadece kişisel kullanım için bana gönderdiğini ve onu paylaşmamam gerektiğini söyledi.

Şimdi benim amacım, bu veritabanını başkalarının erişemeyeceği şekilde gizli tutmak ama aynı zamanda programı başkalarının da kullanabileceği hale getirmek. Bunu nasıl yapabilirim?

Aklıma gelen yöntemlerden bir tanesi, xml dosyasında bulunan verileri sql veritabanına çekmek daha sonra bu sql veritabanını da sql-cypher ile şifrelemek. Ancak yazdığım algoritmanın bir kısmını değiştirmek gerekecek. Bu seçenek şimdilik askıda duruyor. Ayrıca veritabanı şifrelemenin ne kadar güvenli olduğunu bilmiyorum, daha önce hiç bu konuda çalışmalar da yapmadım. İnternette biraz araştırdım, xml veritabanını şifrelemek ile alakalı kaynaklar buldum. Ama yine de programı sunduğum zaman insanlara şifrelenmiş veritabanı gidecek, o zamanda da site yöneticisinin benden istediği şeyi yerine getirmemiş olacağım. Bu konuda bana neler önerebilirsiniz?

Sormak istediğim bir soru var. XML veritabanını programınızla beraber mi dağıtacaksınız, yoksa bir sunucu üzerinde mi tutacaksınız?

Aslında xml veritabanını dağıtmamayı düşünüyorum. Eğer onu dağıtmazsam bir sunucu mu kullanmam gerekir?

Başka bir yolu yok gibi görünüyor. Veritabanını tek merkezden hem erişilir kılmak, hem de güvende tutmak sanırım sadece sunucu yoluyla mümkün.

1 Beğeni

Böyle bir sunucu tasarlamak için herhalde socket modülünü kullanmayacağız değil mi?
Bir başka sorum ise şu, kullanıcılar her programı çalıştırdığında sunucudan tekrar tekrar verileri almak zorunda mı kalacaklar?

Programınızın nasıl çalıştığını bilmiyorum. Yani, kullanıcıların programa girip bazı istatistikleri görüntüledikleri bir program ise sunucuya bağlanıp yeni verileri almak zorundalar. Ancak, ben kullanıcılarımın aldığı verileri kaydedip, bir daha ki programı açtığında bunları göstermek istiyorum diyorsanız bu sefer de kullanıcı tarafında bir veritabanı oluşturup verileri buraya kaydedersiniz. Tabi bu verilerin görülmesini istemiyorsanız, AES şifreleme tekniklerini kullanabilirsiniz. Bu şifreleme yöntemi, verileri anahtar ile şifreleyip yine aynı anahtar ile çözümleyen bir şifreleme yöntemidir. Bu anahtarı kullanıcının oluşturmasını tercih edebilirsiniz.

Sunucu için, şu mantığı anlatmak istedim. Bugün internet üzerindeki sayfalar önce isteği değerlendirir, sonra bu sonuca göre veritabanından verileri çeker ve istemciye gönderir. Bu işi Django gibi sistemler le de yapabilirsiniz örneğin. Mesela sunucunuzda Django ile yaptığınız proje çalışır ve /verial.html sayfasına istek geldiğinde bu isteği işler. Yani şöyle düşünün, bir web sayfasına birtakım veriler göndermek için genelde form kullanırız. Bu form’lar da genelde POST metodu ile gönderilir.

İstek sunucuya geldiğinde sunucu isteğe bakar ve POST olduğunu gördüğünde, beraberinde bir form gönderildiğini anlar. Sonra form verilerini işler ve sonucu istemciye cevap olarak gönderir. Bu cevap, veritabanından çekilen veriler olabilir.

Kısaca bu işi socket seviyesinde değil, Django gibi frameworkler seviyesinde yapabilirsiniz.

2 Beğeni

Basitçe anlatmak gerekirse program şu şekilde çalışıyor.

  1. xml.etree.ElementTree modülü ile xml veritabanınındaki veriler okunuyor ve üzerlerinde bir takım düzeltmeler yapıldıktan sonra daha sonra kullanılmak üzere fonksiyonlar içinde bekletiliyor.

  2. swisseph modülü ile düzenlenmiş veritabanındaki julian zaman damgaları, enlem ve boylamlar (zaman ve mekan verileri) kullanılarak gökyüzündeki gezegenlerin hangi burçlarda olduğu, evlerin dereceleri, burçların ve gezegenlerin hangi evlere düştüğü hesaplanıyor. Yine bir takım veri maniplasyonlarıyla bu veriler düzenleniyor ve yine daha sonra kullanılmak üzere fonksiyonlar içinde bekletiliyor.

  3. tkinter modülü kullanıcıya bir kullanıcı arayüzü sunmak için kullanıldı. İşte bildiğiniz gibi treeview, button, menubutton, checkbutton gibi özelliklere sahip bir arayüz var. Ve kullanıcı bütün hesaplama işlemlerini buradan gerçekleştiriyor. Ayrıca veritabanındaki verileri farklı kategorilere göre seçmek ve treeview üzerinde görüntülemek için tuşlar tanımlı. Bir kategoride diyelim 80 tane kayıt var. Kullanıcı dilerse bu 80 kayıttan istediği kaydı silebiliyor. Menüde 3 adet hesaplama fonksiyonunu çalıştıran düğme var. Bunlardan biri bir kategoride bulunan tüm haritalarda gözlemlenen verileri bir tabloya yerleştiriyor. Bir diğer fonksiyon iki kategorinin (araştırma grubunun ve kontrol grubunun) gözlem verilerini kullanarak bir beklenen değer tablosu oluşturmaya yarıyor. Son fonksiyon ise beklenen değer tablosu ile araştırma grubu tablosunu kullanarak bir ki-kare analiz tablosu oluşturuyor.

  4. xlrd/xlwt modülleri yardımıyla da excel tabloları okunuyor ve yazdırılıyor.

Kullanıcın sunucudan aldığı verileri bir veritabanına kaydetmesi ve bu veritabanının şifrelenmesi seçeneği bir veritabanını şifreleyip onlara gönderme seçeneğine benzemiyor mu? Yani eğer şifrelenmiş veritabanı sadece program onu çalıştırmak istediği zaman açılıyor ama başka türlü açılamıyorsa sunucuya gerek yok değil mi?

Django ile çok ilgilenmedim ama başlangıç olarak ufak çaplı bir blog oluşturmuştum. Bilgim bununla sınırlı. http://pythonanywhere.com ücretsiz bir hosting servisi sunuyordu dosyaları ortaya atmıştım. Yine bu iş için o site kullanılabilir mi yoksa belli bir miktar ücret ödeyip kendime bir alan mı satın almalıyım? Bir de django ile bir blog oluşturmak o kadar da zor değildi, bu iş için hangi konuları öğrenmem gerekiyor biraz bilgi verirseniz sevinirim.,

Edit: Gerek duyarsanız, sizinle ekran görüntüleri de paylaşabilirim.

1 Beğeni

Öncelikle programınızda kullandığınız veritabanının içeriğinin sizin tarafınızdan sürekli güncellendiğini ve kullanıcıların sürekli güncel verilere eriştiklerini düşünerek yazmıştım. Yani bir nevi haber sitesi gibi, sürekli güncel içerikli bir sistem olarak düşünmüştüm.

Eğer bu veritabanındaki verilerin güncelliği sizin için önemli değilse, tabi ki şifreli bir şekilde dağıtılabilir. Bu durumda verileri şifrelemeniz gerekiyor. Ve ilk siz şifreleyeceğiniz için, şifreyi siz biliyor olacaksınız.

Şifrelediğiniz bu veritabanını programla beraber kullanıcıya dağıttığınızda, kullanıcıya şunu demeniz gerekiyor “Varsayılan şifreniz 12345, lütfen güvenlik için şifrenizi değiştirin”. Ancak şurda şöyle bir durum var. Elindeki anahtar ile veritabanının açıldığını anlayan bir kullanıcı, veritabanını başka bir program ile açıp içindeki verilerin şifresini de elindeki anahtarla açarak görünmesini istemediğiniz tüm verileri görebilir. Çünkü elinin altında şifrelenmiş bir veritabanı var ve bunu çözmesi için gereken anahtar da kendisinde.

Ancak ben şifreyi de vermeyeceğim, sadece program içerisinde kendim kullanacağım veritabanını açmak için diyorsanız, kaynak kodlarınıza erişimin olmadığından emin olmalısınız.

Son olarak sunucu kısmına gelirsek, blog üzerinden anlatmak isterim. Sizin blog’unuzda muhtemelen bir veritabanı vardı ve siz yayınlarınızı burda tutuyordunuz. Kullanıcılar hangi yayını görmek istiyorsa, id’si ile veritabanından çekip kullanıcıya gösteriyordunuz. İşte burda da aynı mantıkla düşünebilirsiniz. Verilerinizin bir veritabanında tutulduğunu düşünürseniz, kullanıcıya göstermek istediğiniz veriyi bu veritabanından alarak sonucu bir html belgesi olarak değil, bir json verisi olarak gönderirsiniz. Anlaşılır olması açısından, şöyle örnekleyebiliriz.

Diyelim ki Django siteniz abc.com adresinde tutuluyor. Ve bu sitenizde “/verial.html” url’sine gelen istekleri yöneten bir fonksiyonunuz var. Yani abc.com/verial.html sayfasına programınızda istek gönderdiğinizde, sunucu tarafında şöyle bir fonksiyon çalışsın.

Eğer /verial.html adresine istek geldiyse:
    veritabanından verileri cek ve HttpRequest olarak gönder

HttpRequest’in ne iş yaptığını biliyorsunuzdur. Burada isterseniz verilerinizi json haline getirip de gönderebilirsiniz. https://docs.djangoproject.com/en/2.1/ref/request-response/#jsonresponse-objects

Kısaca sunucumuzun yaptığı iş, gelen isteklere göre veritabanından veriler çekmek ve cevabını göndermek. Böylece kullanıcının arkada hangi veritabanı olduğundan haberi bile olmayacaktır.

Bunlar benim fikirlerim. Daha optimum çözüm önerileri olan varsa bizimle paylaşabilir. Ben güvenlik önlemlerini de göze alarak bu çözümleri sunuyorum. Umarım, anlaşılır anlatabilmişimdir.

2 Beğeni

Veritabanı benim tarafımdan güncellenmiyor. Aksine site güncellemeleri kendisi yapıyor. Lisans sözleşmesi gereği, yanlış hatırlamıyorsam ben daha sonra bu güncellenmiş veritabanını sitedeki yöneticiden tekrar isteyebiliyorum diye biliyorum.

Yani şifrelenmiş bir veritabanı program tarafından açılmaya çalışıldığında bu şifreyi otomatik olarak açmak mümkün değil değil mi? Eğer kullanıcının bir şifre girip veritabanını açması gerekiyorsa, bu da verilerin görülebileceği anlamına geliyor.

Şu kısmı tam olarak anlamadım. Yani yine veritabanı şifrelenir ve program bu şifreli veritabanının şifresini kendi açar ve kapatır öyle mi? Şayet öyleyse kullanıcının veritabanında bulunan verileri görme ihtimali ortadan kalkar mı (kaynak kodlarına erişimin olmadığı durumda)?

Evet ön-tanımlı olarak bir tane sqlite veritabanı kullanılıyordu. Bir tane post gönderme kodu vardı. Başlığı ve mesajı yazıyordum ve gönderme koduna bunları yerleştirip enter tuşuna bastığım zaman gönderi yayınlanmış oluyordu. Ama bu bloğu sadece meraktan oluşturmuştum, kimseye de birşey göndermedim. Yukarıda bahsettiğim gibi şu an hatırlamadığım bir kaç kod yardımıyla bir post eklenebiliyordu, değiştirilebiliyordu, silinebiliyordu. Ayrıca henüz tam vakıf olamadığım bir şey vardı. html dosyasının içinde postlar için kullanılan bir for döngüsü vardı ve şuna benzer şekilde → {% for … %} kullanılıyordu.

Daha önce json ile hiç çalışmadım. Gerçekten web ile daha önce fazla ilgilenmedim. Ve bu yüzden sizin çok rahat anlattığınız şeyleri bile anlamakta zorluk çekebilirim.

2 Beğeni

Özür dilerim o zaman, bazı şeyleri kendi açımdan yazınca evet bana göre kolay size göre zor olabiliyor. Bu bakımdan kusura bakmayın.

Aslında konuyu yazarak anlatmak zor, en güzeli uygulayarak anlatmak. Ancak bu da mümkün olmadığı için elimden geldiğince ifade etmeye çalışacağım.

Veritabanının şifrelemesinden kastımız, içindeki verilerin şifrelenmesidir. Yani içerisinden çektiğiniz veri şifreli veri olacaktır. O zaman bu şifreli veriyi anlamlandırmak için, yazdığınız program içerisinde şifreyi çözmek gerekir. Bunun için anahtar lazım olduğu için, anahtarı da program içerisinde bir değişken olarak tuttuğunuzu düşünün.

def sifre_coz(veri,anahtar):
    sifre cözme işlemi

veri = "Y29kZXJpc3Rhbg=="
anahtar = "12345"
cozulmus = sifre_coz(veri,anahtar)

İşte burada demek istediğim, eğer kaynak kodlarınızı kimse görmüyorsa anahtarınızı da kimse bilemeyecek. Veritabanındaki verilerin hangi anahtarla açıldığını da göremeyecektir. Yani veritabanını bir veritabanı görüntüleyici program vasıtasıyla açarsa kendisine şifreli veriler görünecektir. Bu durumda anahtarı tahmin etmesi gerekecektir. Eğer anahtarınız güçlü karakterlerden oluşuyorsa, bunu bulması imkansıza yakındır.

2 Beğeni

Yok ya ne kusuru, olur mu öyle şey.

Şimdi aslında ben programı ilgililere sunma taraftarıyım. Bir kaç tane astroloji verileri üzerinde istatistiksel çalışma yapan arkadaş var. Onların işine de yarayabilir. Ama site yöneticisi kesin bir dille ne veritabanını ne de şifreyi paylaşmamam gerektiğini söyledi. Beyefendi babam yaşında ve böyle sürekli cevap veren bir insan da değil, belki işi gücü var. Yani mesela sorular sorduğum zaman hepsine cevap alamıyorum. Mesela diyor ki, veritabanını ve şifreyi paylaşma, şifreyi sana kişisel araştırman için gönderdim. Şimdi bu söylediği şu anlama da geliyor mu merak ediyorum, Senin programını senin haricinde benim iznim olmaksızın benim veritabanımı kullandığı için kimse kullanmamalı. Mesela şimdi sizden öneriler geliyor ama beyefendinin tutumunun kapsamını da tam bilemiyorum. Yani ona “Veritabanının bilgilerini bir sunucuda tutsam ve kullanıcılar programı çalıştırdığı zaman veritabanının bilgilerini program çekse sizin için bir mahsuru var mı?” şeklinde bir soru sorsam ne cevap verir bilmiyorum. Mesela cevabı evet kullanabilir olursa, aklıma direk şu soru gelir, “İyi de o zaman neden veritabanını paylaşma diyorsunuz, bu çalışmayı kullanacak olan insanlar sanki programlama mı biliyorlar, hem bilse bile, sizin verilerinizle sizin istemediğiniz ne yapabilirler ki?” Bu da beyefendiye sorulacak bir soru değil. :slight_smile:

Yoksa şöyle bir yöntem de izleyebilirim, kullanıcılara programı veririm, veritabanını da gidin site yöneticisinden isteyin derim. Bu da belki site yöneticisini rahatsız eder. Ne yapacağım bilmiyorum. Şimdi beyefendiye üst üste şöyle mi yapsam böyle mi yapsam diye mesaj atıp sık boğaz da etmek istemiyorum. Anlayacağınız sizin şu anda önerdiğiniz yollara bile izin olup olmadığını öğrenemedim.

2 Beğeni

İşte ben de bunun hakkında soru sormak istiyordum da, sormadım :smiley: Site yöneticisinin izni olmadan dağıtırsanız, bu sefer de başınıza iş açabilirsiniz. Sanırım, sizin sadece programı deneme amaçlı veritabanını istediğinizi düşünmüş ve bunu göndermiş. Dağıtık bir program yazacağınızı söylediniz mi acaba?

Eğer kesin bir dille bunları paylaşmanızı istemiyorsa, dağıtıp kullanmanızı da istemeyecektir muhtemelen. Verilerin benzerini bir başka yerden alma ihtimaliniz yok mu? Hem özgür bir şekilde kullanırsınız, şifreleme ve sunucuyla uğraşmak zorunda kalmazsınız.

1 Beğeni

Lisans talep ettiğimde beyefendi bir kaç soru sorarak geri dönüş yaptı. İşte veritabanıyla ne yapacaksınız, nasıl bir çalışma düşünüyorsunuz, hangi araçları kullanacaksınız, neyi görmeyi umuyorsunuz, daha önce hiç istatistiksel çalışmalar yaptınız mı şeklinde sorular sordu. Ben de ona cevap olarak şunlara benzer şeyler yazdım. “Zaten sizin sitenizde herkese açık olan online veritabanından pdf dosyalarını kullanıyordum. Ama kategorilerdeki kayıtları seçmek biraz zaman alıyordu. Bu pdf dosyalarında tutulan verileri kullanan üç tane program hazırladım. Ve belki biliyorsunuz belki bilmiyorsunuz ama forumunuzda da 3 tane istatistiksel çalışma yaptım. İşte linkleri şurada. Eğer veritabanınızı benimle paylaşırsanız orada yaptığım işlemlerin aynısını yapmaya devam edeceğim. Tek farkı bu veritabanı sayesinde işleri daha da hızlandırmış olacağım. İşte kullanacağım dil Python’dır.” şeklinde bir cevap gönderdim. Ayrıca cevabımda ücretsiz bir program tasarlamayı düşündüğümü de belirttim, o söylediğime yönelik bir yorum yapmadı. Sonra programcı mısınız diye sordu, ben de hayır jeoloji mühendisiyim ama iki-üç yıldır da programlama ile ilgiyim, işte şu şu konularda kendimi geliştirmeye çalıştım, işte bu github adresim, eğer merak ediyorsanız bir kaç tane çalışma koydum oradan bakabilirsiniz dedim. Sonraki mailde bana şifreyi gönderdi. Ve hemen altında da bu şifreyi kimseyle paylaşma yazıyordu.

Yani evet ben de beyefendinin hem güvenini sarsmak istemiyorum, Allah razı olsun bir iyilik yaptı, mahçup duruma düşmeyelim. Sonra bir de tabi bu işin yasal boyutu var.

İşte programı dağıtmamı da mı istemiyor yoksa sadece veritabanının mı dağıtılmasını istemiyor onu tam olarak anlayamadım. Konusu da geçmedi.

Valla verilerin benzerini başka bir yerden alma imkanım var mı emin değilim. Bu site astroloji kayıtlarının da tutulduğu dünyadaki en büyük ve en tanınmış site. Astrotheme diye bir site daha var daha önce orada vakit geçirmedim. Ama onların da bir veritabanının olduğunu biiyorum.

Bir kaç tane, istatistiksel araştırma için tasarlanmış daha profesyonel tasarıma sahip programlar var, onlar da parayla satılıyor. Onlar verileri nerden aldılar bilmiyorum.

1 Beğeni

Astroloji hakkında fazla bilgim yok, bu yüzden verileri bulma konusunda yardımcı olabilseydim keşke ama olamayacağımı düşünüyorum.

Programınız profesyonel olarak kullanılacak bir program değil sanırım. Sadece birkaç arkadaşınızın kullanımına sunacaksınız galiba. Peki bu veritabanının arkadaşlarınıza dağıtacağınızı ve güvende olduğunu söyleseniz? Biraz tuhaf olabilir, ama bir denemekte fayda var. Yani beyefendiye biraz daha mı niyetinizi açsanız ne :slight_smile:

2 Beğeni

Zaten astroloji çevresinde, istatisiksel çalışmalar yapan çok fazla insan olduğunu sanmıyorum. Yani çoğunun ilgisi astrolojik yorumlamaya yönelik. Zaten istatistiği astrolojiye uyarlamanın amacı da bu yorumların ne kadar doğru ne kadar geçerli olduğunu ortaya koymak. Çünkü çok fazla spekülasyon üretilen bir alan.

Yani profesyonel olarak kullanılabilir mi, kullanan kişinin amacına bağlı. Profesyonel tasarıma sahip bir program değil demek istemiştim. Yani minimal bir program ama görevini yerine getiriyor.

Evet böyle bir soru sorabilirim de ama beyefendi kimseyle paylaşma dedi. O biraz beni tereddüte düşürüyor. Şimdi site yöneticisi rahatsız olsun da istemem. Ama sormadan cevabını öğrenemeyiz de. Fakat soru biraz tuhaf olur sanki aynı python’daki gibi except durumu gibi bir durum arıyormuşum gibi görünürüm. “Siz bu programı kimseyle paylaşmayın dediniz ama bir arkadaşım istisna olabilir mi?” :smile: Ne bileyim ya sanki rahatsız eder adamı, sizce?

1 Beğeni

Bence rahatsız olmaz, tabi daha önce defalarca sormadıysanız. Bilemiyorum gerçekten, ama bir tane “finally” hakkınız var gibi :smiley:

2 Beğeni

Bir defa şifreyi aldıktan sonra, programın tasarımı bitince ne olacak diye düşünürken sordum, ama bir soruyu iki farklı mesaja yaydım, veritabanını şifrelesem mi yoksa başka bir şey mi yapsam diye düşünürken iki farklı mail gönderdim. Bunlara cevap gelmedi. :slight_smile: Bir de program bittikten sonra, bu sabah sordum. 6-7 satırlık bir mail attım, geri dönüş olarak tek bir satırda “Elbette veritabanını kimseyle paylaşamazsın, senin kendi kişisel çalışman için gönderildi bu.” şeklinde bir cevap aldım. :slight_smile: Ben de tamam, tekrar teşekkür ederim diye mesaj yazdım.

1 Beğeni

Bu duruma göre, paylaşmanızı istemiyor belli. Ama sizin, elinizdeki veritabanına ne yapacağınıza karışmamış :slight_smile:

1 Beğeni

Neyse, biraz zaman geçsin, adamı da daraltmayayım, belki sonra sorarım. Bu arada da iyice düşünürüm. Çok teşekkür ederim zaman ayırdığınız için. :slight_smile:

1 Beğeni

Bence de. Rica ederim, kolay gelsin :slight_smile:

1 Beğeni