<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Armaan</title>
    <description>The latest articles on DEV Community by Armaan (@armaan_8bf96932363f87e420).</description>
    <link>https://dev.to/armaan_8bf96932363f87e420</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3243742%2F2b378de7-99d0-4584-b7fa-5a45ca34df1a.jpg</url>
      <title>DEV Community: Armaan</title>
      <link>https://dev.to/armaan_8bf96932363f87e420</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/armaan_8bf96932363f87e420"/>
    <language>en</language>
    <item>
      <title>HOW TO BUILD AND SECURE A SECURE FLASK LOGIN SYSTEM</title>
      <dc:creator>Armaan</dc:creator>
      <pubDate>Mon, 16 Jun 2025 17:35:02 +0000</pubDate>
      <link>https://dev.to/armaan_8bf96932363f87e420/how-to-build-and-secure-a-secure-flask-login-system-1ola</link>
      <guid>https://dev.to/armaan_8bf96932363f87e420/how-to-build-and-secure-a-secure-flask-login-system-1ola</guid>
      <description>&lt;p&gt;WHY I BUILD THIS &lt;/p&gt;

&lt;p&gt;As a cybersecurity student and a enthusiastic developer aiming for real life projects . I want to understand how login system works under the hood, how they're broken and fixed.&lt;br&gt;
  More importantly you can learn how secure a flask login system can be 💡(AND A BASIC BEGINNER FRINEDLY REAL WORLD PROJECT FOR DEV BEGINNERS )&lt;/p&gt;

&lt;p&gt;WHAT I USED ⚠&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.11&lt;/li&gt;
&lt;li&gt;Flask -&amp;gt; Web framework&lt;/li&gt;
&lt;li&gt;SQlite -&amp;gt; For lightweight Db&lt;/li&gt;
&lt;li&gt;Html and Bootstrap -&amp;gt; For Frontend&lt;/li&gt;
&lt;li&gt;Werkzeug -&amp;gt; For password hashing&lt;/li&gt;
&lt;li&gt;Security Extras :-
    1.Input sanitization
    2.Hashed passwords
    3.Basic session management &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;STEP BY STEP:&lt;/strong&gt; BUILDING THE LOGIN SYSTEM &amp;gt;&amp;gt;&amp;gt;&lt;br&gt;
project setup:-&lt;br&gt;
    pip install flask&lt;br&gt;
    mkdir flask-login-app&lt;br&gt;
    cd flask-login-app&lt;br&gt;
    touch app.py&lt;/p&gt;

&lt;p&gt;MINIMAL FLASK LOGIN SYSTEM : &lt;br&gt;
from flask import Flask, render_template,request,redirect,session&lt;br&gt;
from wekzeug.security import generate_password_hash, check_password_hash&lt;/p&gt;

&lt;p&gt;app = flask(&lt;strong&gt;name&lt;/strong&gt;)&lt;br&gt;
app.secret_key = 'yoursecretkey'&lt;/p&gt;

&lt;p&gt;users = {} #simulated db for now&lt;br&gt;
@app.route('/',methods=['GET','POST'])&lt;br&gt;
def login():&lt;br&gt;
    if requested.method == 'POST':&lt;br&gt;
       username = request.form['username']&lt;br&gt;
       password = request.form['password']&lt;br&gt;
       user = users.get(username)&lt;br&gt;
     if user and check_password_hassh(user['password'],password):&lt;br&gt;
     session['user'] = username&lt;br&gt;
      return f"welcome back, {username}!"&lt;br&gt;
   return "login failed."&lt;br&gt;
 return render_template('login.html')&lt;/p&gt;

&lt;p&gt;@app.route('/register',methods =['GET','POST'])&lt;br&gt;
def register():&lt;br&gt;
        if request.emthod =='POST':&lt;br&gt;
           username = request.form['username']&lt;br&gt;
           password = request.form['password']&lt;br&gt;
           users[username] = {&lt;br&gt;
                  'password': generate_password_hash(password)&lt;br&gt;
          }&lt;br&gt;
          return redirect('/')&lt;br&gt;
      return render_template('register.html')&lt;br&gt;
if_&lt;em&gt;name&lt;/em&gt;_ == '&lt;strong&gt;main&lt;/strong&gt;':&lt;br&gt;
   app.run()debug=true)&lt;br&gt;
&lt;strong&gt;Simple login.html and register.html&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Login&lt;/p&gt;

&lt;p&gt;&lt;a href="/register"&gt;Register&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How I Secured It&lt;br&gt;
✅ Password Hashing&lt;/p&gt;

&lt;p&gt;python&lt;br&gt;
Copy code&lt;br&gt;
generate_password_hash(password) : for storing&lt;br&gt;
check_password_hash(hash, password)  # for verifying&lt;br&gt;
✅ Session Management&lt;/p&gt;

&lt;p&gt;session['user'] keeps the user logged in&lt;/p&gt;

&lt;p&gt;app.secret_key keeps sessions signed&lt;/p&gt;

&lt;p&gt;✅ Input Sanitization&lt;/p&gt;

&lt;p&gt;Basic HTML forms with required&lt;/p&gt;

&lt;p&gt;Use Flask’s built-in request sanitization&lt;/p&gt;

&lt;p&gt;✅ No Hardcoded Passwords&lt;/p&gt;

&lt;p&gt;All stored passwords are hashed using Werkzeug's SHA256&lt;/p&gt;

&lt;p&gt;✅ Minimal Error Exposure&lt;/p&gt;

&lt;p&gt;Don't show stack traces or errors on login fail&lt;/p&gt;

&lt;p&gt;🚫 What I Avoided (On Purpose)&lt;br&gt;
❌ No SQL injection-prone raw queries&lt;/p&gt;

&lt;p&gt;❌ No storing passwords in plain text&lt;/p&gt;

&lt;p&gt;❌ No sensitive debug info on the frontend&lt;/p&gt;

&lt;p&gt;❌ No use of eval() or insecure libs&lt;/p&gt;

&lt;p&gt;🔄 What’s Next (TODOs)&lt;br&gt;
Integrate SQLite for persistent DB&lt;/p&gt;

&lt;p&gt;Add JWT or session expiry&lt;/p&gt;

&lt;p&gt;Use CSRF protection via Flask-WTF&lt;/p&gt;

&lt;p&gt;Implement Account Lockout after N failed attempts&lt;/p&gt;

&lt;p&gt;Log failed login attempts for analysis&lt;/p&gt;

&lt;p&gt;🧠 What I Learned&lt;br&gt;
Building the system taught me:&lt;/p&gt;

&lt;p&gt;How vulnerabilities enter at the login layer&lt;/p&gt;

&lt;p&gt;The importance of hashing&lt;/p&gt;

&lt;p&gt;That security ≠ a one-time feature, but a continuous mindset&lt;/p&gt;

&lt;p&gt;💬 Final Thoughts&lt;br&gt;
If you're learning Flask, don’t just build a login system. Break it, fix it, and secure it. That’s how you grow from a dev into a security-minded engineer.&lt;/p&gt;

&lt;p&gt;Let me know what you'd add to secure this better — I'm still learning!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>python</category>
      <category>security</category>
    </item>
  </channel>
</rss>
