使用 Flask 安全渲染 HTML

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

当返回 HTML(Flask 中的默认响应类型)时,必须对输出中渲染的任何用户提供的值进行转义,以防止注入攻击。在本实验中,你将学习如何使用 escape 来实现这一点。稍后介绍的 Jinja 渲染的 HTML 模板会自动执行此操作。目前,你可以手动使用 escape 来完成此操作。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/AdvancedTopicsGroup(["Advanced Topics"]) python/BasicConceptsGroup -.-> python/strings("Strings") python/ModulesandPackagesGroup -.-> python/using_packages("Using Packages") python/AdvancedTopicsGroup -.-> python/decorators("Decorators") subgraph Lab Skills python/strings -.-> lab-148875{{"使用 Flask 安全渲染 HTML"}} python/using_packages -.-> lab-148875{{"使用 Flask 安全渲染 HTML"}} python/decorators -.-> lab-148875{{"使用 Flask 安全渲染 HTML"}} end

转义

在这一步中,你将学习如何使用 escape 来实现防止注入攻击的保护。

  1. 打开 html_escaping.py 文件,首先导入 Flask 类和 escape
from flask import Flask
from markupsafe import escape
  1. 接下来创建 Flask 类的一个实例。
app = Flask(__name__)
  1. 然后我们使用 route() 装饰器创建一个路径 /,并定义一个名为 escaping 的视图函数。在函数中定义一个 JavaScript 代码片段,并使用 escape 将其渲染为文本,转义任何在 HTML 中具有特殊含义的字符。
@app.route('/')
def escaping():
    input = "<script>alert('XSS attack');</script>"
    escaped_input = escape(input)
    return f"User input: {escaped_input}"
  1. 创建脚本的 main 入口点,用于在端口 5000 启动 Flask 应用程序,并启用调试模式。
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)
  1. 要运行应用程序,首先使用以下命令在终端中启动 Flask 应用程序:
python3 html_escaping.py

然后打开位于界面顶部的 "Web 5000" 标签,刷新页面,你应该会看到以下消息:
XSS 攻击防护示例

  • <script> 标签被安全地显示为文本,而不会作为 JavaScript 执行,这展示了如何防止 XSS 攻击。

总结

在本实验中,我们学习了如何使用 escape 手动转义输入内容。这在处理潜在的有害攻击时非常有用。稍后我们将学习如何使用 Jinja 渲染模板,它可以自动且高效地完成这一操作。