▎项目来源
原始项目
github.com/BasicTodoApp
- 作者:BeginnerDev2024
- 原博客:《Python Flask入门教程》
- 问题:无数据验证、硬删除风险、无错误处理
▎运行环境
# 基础环境(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, validatorsclass 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 BeautifulSoupreturn 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.用户体验:增加删除确认对话框