Ali GOREN

Open Source, JavaScript, Python, .NET

Flask Uygulamalarında Formlara CSRF Protection Eklemek

| Permalink

Selamlar.

Side project olarak bir Flask uygulaması geliştiriyorum Blueprintler, factory methodlar falan havada uçuşuyor sistemde.

Açıkcası bu denli bir projeyi tek başına Flask ile yönetmek benim için farklı bir deneyim oluyor. Bu sayede Flask temellerini iyice tekrarlamış oluyorum.

Neyse bir şey fark ettim. Kullanıcılar isterse uzaktan başka bir kullanıcıya POST etme işlemi yaptırabiliyor. Bu benim sistemimde olmasını istemediğim bir şey.

Çünkü POST edilecek kısım REST endpoint’i değil. Sessionlar falan allahtan işliyor 🙂 Aklıma direkt Flask-WTF geldi. Flask WTForms gibi garip bir adı var o.O bense neler düşünmüştüm 😛

Klasip ASP.Net kullanıcıları çok iyi hatırlayacaktır, değişik form elementlerine sahipti garipler. Bunda öyle değil ama aynı mantık üzerinden gidiyor diyebiliriz Flask-WTF için.

Kısacası formları yönetmenize imkan tanıyan bir kütüphane. HTML formları oluşturmanın Pythoncası kısaca. Çok uzatmayalım 😛

Kurulum

pip install flask-wtf

Bu kadar basit. Kurulumu yaptınız. Şimdi bunu projeye dahil edelim. Bu dahil işlemi factory kısmında yani paket içerisindeki init.py içinde yer alacak.

Şöyle import edelim ve instance alalım;

from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect()

Dilerseniz direkt constructor içerisine app instance basabilirsiniz ya da init_app içerisine basabilirsiniz. Ben bu uygulamada örneğimi böyle yapacağım.

def create_app(cfg: str = ''):
    csrf.init_app(app)

Evet bu kısım bu kadar. Diğer kısımların kodlarını vermedim siz zaten içeride böyle init ettiğinizi bilin. Bu işlemi yaptıktan sonra formlarınıza csrf token eklemediğiniz sürece token error alacaksınız. Ona göre dikkatli davranın ve proje büyümeden bunu dahil edin. Tabii burada exclude edilecekler de vardır. Neyse diyelim ki şöyle bir formunuz var

<form method="POST" action="{{ url_for('auth.login') }}">
    <div class="field">
        <label for="username" class="label">Username</label>
        <div class="control">
            <input id="username" class="input is-dark" type="text" name="username" placeholder="Your Username"
            autofocus="">
        </div>
    </div>
</form>

Bu forma aşağıdaki gibi bir csrf token ekleceksiniz. Burada input hidden olacak 🙂

<form method="POST" action="{{ url_for('auth.login') }}">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
    <div class="field">
        <label for="username" class="label">Username</label>
        <div class="control">
            <input id="username" class="input is-dark" type="text" name="username" placeholder="Your Username"
            autofocus="">
        </div>
    </div>
</form>

Kısacası ekleyeceğiniz şey şu;

<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />

Bu kullanım FlaskForm kullanılmadığı durumlarda uygun. Eğer formlarınızı FlaskForm ile oluşturuyorsanız aşağıdaki kullanımı uygulamanız daha uygun.

{{ form.csrf_token }}

Evet hepsi bu kadar artık formlarınız csrf token ile korunmakta 🙂 Umarım faydalı olmuştur. Okuduğunuz için teşekkürler.

İyi çalışmalar dilerim 🙂

Kaynaklar