30-05-2017, Saat: 17:12
Web formları, server'a toplu olarak veri göndermek için kullanılırlar. Örnek olarak html etiketi olan form etiketine bakalım:
Kod:
#user.html
<form action="/user" method="post">
Username: <input type="text" name="username">
Password: <input type="password" name="password">
<input type="submit" value="Submit">
</form>
from flask import request
...
@app.route('/user', methods=['GET', 'POST'])
def user():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
print(username, password)
return render_template('user.html')
Yukardaki örneğimizde
Kod:
index.html
sayfasında bir form elemanı tanımladık bu form elemanın metodunu post olarak belirledik ki
Kod:
Submit
butonuna tıklandığında belgiler action özelliğindeki url'e gönderilecekler.
Kod:
user()
ismindeki view fonksiyonu eğer metot
Kod:
POST
ise
Kod:
request
nesnesi üzerinden form elemanının değerlerine erişiyoruz.
Kod:
request.form.get('username')
bu kullanımda
Kod:
get()
metodunun parametresi input etiketlerinin name özelliğinin değeridir. Yani html etiketlerine name özelliği ile erişiyoruz.
view fonksiyonuna
Kod:
methods=['GET', 'POST']
eklenmesi bu view fonksiyonunun bu iki metodu da desteklediği anlamına gelir. Eğer
Kod:
POST
metodunu eklemeseydik Method not allowed hatası alırdık. Flask view fonksiyonları varsayılan olarak
Kod:
GET
metodunu desteklerler.
Bu şekilde html form elemanlarıyla uğraşmak hem zahmetli bir iştir ve güvenlik sorunlarını da beraberinde getirir.
Cross-Site Request Forgery (CSRF):
Bir güvenlik sorunudur; tarayıcılar parolalarımızı, email adreslerimizi, şifrelerimizi çereklerde(cookie) şifrelenmiş halde saklarlar. Bu yüzden oturumumu açık bırak seçeneği çerezler tarafından kontrol edilir. Belirli bir sayfa için saklanmış olan bu bilgiler o sayfaya her istek yapıldığında bu çerezlerle birlikte gönderilir. Eğer bu sayfaya istek başka bir uygulama tarafında o sayfaya yapılırsa (3. parti bir site tarafından), bu kişiler kullanıcının bilgilerini sosyal mühendislikle elde edebilirler.
CSRF'den korunma:
Her server'a istek yapıldığında csrf tokenları değiştirilir ve bu token çerezlerde kaydedilir. Form verisi gönderilirken bu token da gönderilir. Giden verideki token ile serverdaki token değerlerinin aynı olup olmadığı kontrol edilir. Bu güvenlik sorunu için flask'ın bir önlemi yoktur. Çünkü flask herhangi bir form validasyon framework'üne sahip değildir. Ancak flask-wtf isimli form eklentisi bu ihtiyacı karşılar.
Flask-WTF eklentisini yüklemek için:
Kod:
$ pip install flask-wtf
flask-wtf eklentisi csrf güvenlik sorunu için formlara token ekler. Bu tokenı oluşturmak için flask uygulamasının
Kod:
config
özelliğine
Kod:
SECRET_KEY
isminde bir anahtar eklenmelidir:
Kod:
app.config["SECRET_KEY"] = "gizli değer buraya yazılır."
#veya
app.config.update(SECRET_KEY="gizli değer...")
config: Flask uygulama instancı'nın özelliğidir(attribute). Bu attribu python list(liste veri yapısı) sınıfından türetilmiştir.