3 Şubat 2012 Cuma

Djangoda Güvenlik


Web formlarla çalışırken önemli tehtid kullanıcı giriş alanlarından tehlikeli kod yeme olasılığıdır. Bunlardan birincisi sql injection yönetemidir.
Basitçe tanımlarsak kullanıcının giriş yaptığı alan üzerinden SQl parçacığı girerek , database'imizde sql kod parçası çalıştırmasıdır.
Bunu yapabildiği takdirde verileri çekmekten, tüm database'imizi silmeye kadar imkan saldırganımız için mümkündür. Ancak django ile çalışıyorsak rahat
bir nefes alabiliriz. Django otomatik olarak kullanıcı giriş alanlarından gelen bu saldırıları temizler.

Bir diğer saldırı yönetemi ise Cross-site scripting'dir. Bu yöntemde saldırganımız veri giriş alanlarından html, yada javascript veri gönderir ki,
Bu veri db'e kayıt ediliyorsa başka kullanıcılarıda etkileyerek dramatik sonuçlar yaratabilir. En basit zarar sitenize giren kişilerin otomatik porno yada
reklam sitelerine yönelndirilmesidir. Ki sitenizin şifre sonran sayfasının bir benzeride kolaylık açılık kullanıcından bilgileri çekilebilir. Bunun için django'nun
bzilere sunduğu yöntem oldukça basit bir geliştirmedir. Tüm kullanıcıdan gelen datalar geri gösterilmesinden escape filtresi uygulanmalıdır.

<.h1>Merhaba, {{ name|escape }} hoşgeldin!

<.input type="text" name="q" value="{{ query|escape }}".>

gibi.

Bir diğer tehlike, projenin debug modda bırakılması durumunda oluşur. Debug modda bir hata oluştuğunda hata hakkında oldukça ayrıntılı bilgi verilmektedir.
Burada aktarılan bilgiler sistem hakkında saldırgan için çok önemli bilgiler içerebilir. Bunun için sisteminiz production'a alındığında DEBUG değeri false 'a
atanmalıdır. Geliştiriciler bu durumda bu hata mesajlarını nasıl alacak diye sorarsanız, ADMINS kısmında tanımlı kullanıcılara bu hata mesajları mail olarak atılacaktır.



http://www.djangobook.com/en/beta/chapter20/

2 Şubat 2012 Perşembe

Django ile admin arayüzü oluşturmak

Djangoda oldukça hoşunuza gideceğim uygulamalardan bir tane otomatik admin arayüzü.
Hemen hemen her projede gerekli olan ama aynı kodu yazıp yazıp durmaktan sıkıldığımız bu modülü django ile bir kaç satırda oluşturmamız mümkün.

Öncelikle yapmamız gereken Admin arayüzünden yönetilecek database modellerimizi işaretlemek. Bunun içinde tek yapmamız gereken model tanımlamalarızın altına

class Admin:
pass

eklemek.

Bir sonra ki aşamada setting.py altında INSTALLED_APPS içine
"django.contrib.admin"
ekliyoruz.Yine burada "django.contrib.sessions" , "django.contrib.auth","django.contrib.contenttypes" alanlarının uncomment olmasına dikkat ediyoruz.
Ayrıca MIDDLEWARE_CLASSES 'da ki elemanları da açıyoruz. Sonra

python manage.py syncdb
ile db admin tablo yapısını oluşturalım.

Son olarak da url.py 'i düzenleyelim.

Map kısmına

url(r'^admin/', include(admin.site.urls)),
ekliyoruz. Sonrada
admin.autodiscover()
admin.site.register(modelClassName)

alanlarını ekliyoruz.
işte bu kadar, artık bir admin arayüzüne sahipsiniz.

Not: Projeyi ilk yarattığınızda sizeden bir superuser istemnişti bu kısımda tanımlama yapmadıysanız django/contrib/auth/bin/create_superuser.py 'ı çalıştırarak superuser yaratabilirsiniz.

Models

(http://www.djangobook.com)

Django framework'te en etkiliyici bulduğum yapılardan biri de model'ler (diğer frameworklerde geçen entity kelimesi nedense daha sevimli geliyor)
Tabloda ki veri alanlarını modeline yaz,

class Book(models.Model):
title = models.CharField(maxlength=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
settings.py'den db bağlantı ayarlarını yap ve Console'dan

manage.py syncdb
Hooppp...Database tabloda hazır. E nasıl kullanacağız Peki??
books = Book.object.order_by('name')

kitaplar geldi bile.. (tabii kayıt atmadığımızdan boş ama kaydı atmış gibi deam edelim.)
Süper !!

Şimdi biraz sorgu konularına girelim;

tüm objeler :

books = Book.objects.all()

Filtrelemek istersek

Book.objects.filter(name="django simple")
Publisher.objects.filter(country="U.S.A.", state_province="CA")

like çekersek :

Publisher.objects.filter(name__contains="press")

tek bir obje çekmek istersek :

Publisher.objects.get(name="Apress Publishing")

tabi bu method sonucunda birden fazla obje gelirse hata veriliceği unutulmamalı. Dbden tüm kayıtları çekip,listeden de tabi ilk veriyi alabiliriz:

Publisher.objects.all()[0]

ilk örneğimizde sıralama ile çekmiştik, bu işlemi biraz daha geliştirilelim.Önce state sonra adrese göre sıraların

Publisher.objects.order_by("state_provice", "address")

tersten sıralamak istersek

Publisher.objects.order_by("-name")

Bu sıralama işini default olarakda gerçekleştirebiliriz. bunun için model classa şunu ekleyebiliriz.

class Meta:
ordering = ["name"]


Bunları karma olarak da kullanabiliriz:

Publisher.objects.filter(country="U.S.A.").order_by("-name")


1 Şubat 2012 Çarşamba

Django için hosting firması arayışları

Şİmdilik küçüprojeler yapacağımız düşünürsek, hem ucuz -mümkünse ücretsiz- hemde deploymentı pratik hosting firması arayışımızda ilk gözümüze çarpan altta ki hsoting firmalarını sıralayan site oldu.


Bumların arasında

http://www.ep.io/


ücretsiz olmalarıyla,



kalitesine aldığı övgülerle, dikkat çekmekte. Ancak seçim gene de zor..

Birde bunları araştırırken fark ettim ki email servisi verenler var, vermeyenler var. Yada veririz ama bizden çıkan spamdir, ulaştırıcı servis kullanın diyen.Bu email olaylarıda bayağı karışmış. Onlar içinde ayrı sistemler ortaya çıkmış;



31 Ocak 2012 Salı

django form postbacklerde alanların geri dolması

Django ile html template ile çalışırken ilk basit sorun, hata durumunda postbacklerde ilgili alanların geri doldurulması oldu;

Mesela bir form girişi yapıyorsunuz form.is_valid() false olarak geri dönüş yaptı. Peki kullanıcının daha önce girdiği verileri nasıl geri yollayacağız. Çözümü sorun kadar basit.

1) Eğer template içinde html elementler yerine django objelerini kullanarak html'iniz hazırlarsanız, bu sorun otomatik olarak django tarafından yönetilmektedir.
yani;

<..label for="id_willDate">Gönderilecek tarih : <..input type="text" name="willDate" id="id_willDate"/..>

kodunda input html elemanı yerine django objesini atayalım. (Elbette django tarafında form classımız yazılı olmalı)

<..label for="id_willDate"..>Gönderilecek tarih :<../label..>{{form.willDate}}

bu işlem ile template'mizden html input elemanımız otomatik olarak yaratılmakta ve postback işleminde yönetilmektedir.

2) Html template tarafında değerin varlık kontrolünü yaparak elle atayalım.

<..input type="text" name="willDate" id="id_willDate" '
{% if form.willDate.value %}
value="{{form.willDate.value}}"
{%endif%}
/..>


tuhaf günler dileğiyle..