1.HTML转义的背景
在Web应用程序中,用户输入的数据可能会被直接插入到HTML、JavaScript或SQL语句中,如果没有正确的过滤和转义,就会导致注入攻击。比如说,用户提交名称为`<script>alert('bad')</script>`,它将被直接插入到HTML代码中,从而导致恶意脚本在用户的浏览器中执行,可能会导致跨站脚本攻击(XSS)。因此,为了防止注入攻击,应该对用户输入的数据进行严格的过滤和转义,以确保它们不会被误解为代码。
2.代码展示
from flask import Flask from markupsafe import escape app = Flask(__name__) # 创建flask核心对象 """ 当返回 HTML ( Flask 中的默认响应类型)时,为了防止注入攻击,所有用户提供的值在输出渲染前必须被转义。 使用 Jinja渲染的 HTML 模板会自动执行此操作。 """ # 路由和视图函数 @app.route('/<name>', methods=['get', 'post']) def hello(name): """ 使用escape() 可以手动转义, 如果一个用户想要提交其名称为 <script>alert("bad")</script> , 那么 宁可转义为文本,也好过在浏览器中执行脚本。 :param name: :return: """ return f'hello, {escape(name)}' if __name__ == "__main__": # 启动服务器 app.run(debug=True)
3.代码讲解
上述代码中使用markupsafe导入escape方法将用户输入的内容转义为安全的内容。当然,使用 Jinja渲染的 HTML 模板会自动执行此转义操作。
那么, 什么是jinjia渲染的HTML呢?Jinja渲染的HTML模板通常包含HTML标记和Jinja模板语言标记。以下是一个简单的示例:
```html
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ heading }}</h1>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>
```
在这个示例中,`{{ title }}`和`{{ heading }}`是Jinja模板语言标记,它们将在渲染时被替换为相应的变量值。`{% for item in items %}`和`{% endfor %}`是Jinja模板语言标记,它们用于循环遍历`items`列表中的每个元素,并将每个元素替换为`{{ item }}`。最终,Jinja将渲染出一个HTML页面,其中包含了相应的变量值和循环遍历的结果。