import jwt
from flask import Flask, request
@app.route('/protected')
def protected_route():
# Vulnerable: No signature verification
token = request.headers.get('Authorization')
if token:
try:
# Dangerous: verify=False allows forged tokens
payload = jwt.decode(token, verify=False)
user_id = payload.get('user_id')
return f'Welcome user {user_id}'
except:
pass
return 'Unauthorized', 401
@app.route('/admin')
def admin_route():
# Vulnerable: No algorithm specification
token = request.headers.get('Authorization')
if token:
try:
# Dangerous: algorithm not specified, can use 'none'
payload = jwt.decode(token, 'secret')
if payload.get('role') == 'admin':
return 'Admin access granted'
except:
pass
return 'Access denied', 403
# Vulnerable: Decoding without any verification
def get_user_from_token(token):
return jwt.decode(token, options={"verify_signature": False})
import jwt
from flask import Flask, request
from datetime import datetime, timezone
# Secure: Use strong secret key
JWT_SECRET = 'your-256-bit-secret-key'
JWT_ALGORITHM = 'HS256'
@app.route('/protected')
def protected_route():
# Secure: Proper signature verification
token = request.headers.get('Authorization')
if token and token.startswith('Bearer '):
token = token[7:] # Remove 'Bearer ' prefix
try:
# Secure: Verify signature and algorithm
payload = jwt.decode(
token,
JWT_SECRET,
algorithms=[JWT_ALGORITHM]
)
# Validate expiration
exp = payload.get('exp')
if exp and datetime.fromtimestamp(exp, timezone.utc) < datetime.now(timezone.utc):
return 'Token expired', 401
user_id = payload.get('user_id')
return f'Welcome user {user_id}'
except jwt.InvalidTokenError as e:
return f'Invalid token: {str(e)}', 401
return 'Unauthorized', 401
@app.route('/admin')
def admin_route():
# Secure: Full validation with all checks
token = request.headers.get('Authorization')
if token and token.startswith('Bearer '):
token = token[7:]
try:
# Secure: Comprehensive validation
payload = jwt.decode(
token,
JWT_SECRET,
algorithms=[JWT_ALGORITHM],
options={
"verify_signature": True,
"verify_exp": True,
"verify_iat": True,
"require": ["exp", "iat", "user_id", "role"]
}
)
if payload.get('role') == 'admin':
return 'Admin access granted'
else:
return 'Insufficient privileges', 403
except jwt.InvalidTokenError as e:
return f'Invalid token: {str(e)}', 401
return 'Access denied', 403
# Secure: Proper token validation function
def get_user_from_token(token):
try:
payload = jwt.decode(
token,
JWT_SECRET,
algorithms=[JWT_ALGORITHM]
)
return payload.get('user_id')
except jwt.InvalidTokenError:
return None