基于Flask的待办事项应用重构

▎项目来源

原始项目
github.com/BasicTodoApp


▎运行环境

# 基础环境(Python 3.10+)
pip install flask==2.2.3

# 运行命令
python app.py

问题1:未过滤用户输入
# 原代码(app.py:15)
@app.route('/add', methods=['POST'])
def add():
    content = request.form['content']  # 直接获取未过滤输入
    db.execute("INSERT INTO todos (content) VALUES (?)", (content,))
‌重构方案‌:添加表单验证
from flask_wtf import FlaskForm
from wtforms import StringField, validators

class TodoForm(FlaskForm):
    content = StringField('内容', [validators.Length(min=1, max=100)])

问题2:硬删除数据
# 原代码(app.py:28)
@app.route('/delete/<int:id>')
def delete(id):
    db.execute("DELETE FROM todos WHERE id=?", (id,))  # 直接物理删除
‌重构方案‌:软删除设计
ALTER TABLE todos ADD COLUMN is_deleted BOOLEAN DEFAULT 0;

▎重构效果对比
功能点	         原版风险	               重构后改进
添加事项	   可能注入500字超长文本	      限制100字符并过滤HTML
删除操作	       数据永久丢失	             标记删除可恢复
错误处理	  直接显示Python错误页面	        友好错误提示页面

核心安全代码
# 新增数据验证层(security.py)
def sanitize_input(text):
    from bs4 import BeautifulSoup
    return BeautifulSoup(text, "lxml").text  # 过滤HTML标签

# 软删除实现
@app.route('/delete/<int:id>')
def delete(id):
    try:
        db.execute("UPDATE todos SET is_deleted=1 WHERE id=?", (id,))
        return redirect(url_for('index'))
    except Exception as e:
        return render_template('error.html', msg="删除失败: "+str(e))

逆向工程总结
1‌.防御式编程‌:对所有用户输入添加消毒处理
‌2.数据保护‌:用软删除替代物理删除
‌3.用户体验‌:增加删除确认对话框
posted @ 2025-02-26 18:53  JJaymes  阅读(59)  评论(0)    收藏  举报