面试题答案
一键面试身份验证机制主要差异
- Django
- 内置完善系统:Django有一套内置的强大的身份验证系统,它提供了用户模型(
User
)、权限管理、密码哈希等功能。可以轻松实现用户注册、登录、密码重置等常见身份验证流程。例如,使用django.contrib.auth
模块,通过简单配置和调用相关视图函数或类视图,就能完成基本身份验证功能。 - 基于会话和中间件:通常基于会话(session)来管理用户状态,并且通过中间件机制来实现身份验证的全局处理。例如,
AuthenticationMiddleware
会在每个请求处理前检查用户的会话状态,判断用户是否已认证。
- 内置完善系统:Django有一套内置的强大的身份验证系统,它提供了用户模型(
- Flask
- 轻量级,扩展性强:Flask本身没有内置的身份验证系统,需要开发者自行选择第三方库来实现身份验证。常见的有
Flask - Login
等。这种方式给予开发者更多的灵活性,可以根据项目需求定制身份验证机制。 - 灵活的实现方式:可以基于不同的认证方式,如令牌(token)认证、HTTP基本认证等,通过装饰器等方式来实现对视图函数的身份验证控制。例如,使用
Flask - Login
时,通过定义用户加载回调函数和在视图函数上使用@login_required
装饰器来限制未登录用户访问。
- 轻量级,扩展性强:Flask本身没有内置的身份验证系统,需要开发者自行选择第三方库来实现身份验证。常见的有
防范常见Web安全漏洞
- 防范SQL注入
- Django
- ORM(对象关系映射):Django使用ORM进行数据库操作,ORM会对输入数据进行自动转义和参数化查询。例如,当使用
filter
方法进行数据库查询时:
- ORM(对象关系映射):Django使用ORM进行数据库操作,ORM会对输入数据进行自动转义和参数化查询。例如,当使用
- Django
from myapp.models import Book
books = Book.objects.filter(title__contains='keyword')
ORM会将'keyword'
作为参数传递给数据库,而不是直接嵌入SQL语句,从而防止SQL注入。
- 原生SQL安全调用:即使使用原生SQL,Django也支持参数化查询。例如:
from django.db import connection
with connection.cursor() as cursor:
cursor.execute("SELECT * FROM myapp_book WHERE title LIKE %s", ['%keyword%'])
results = cursor.fetchall()
- Flask
- 使用数据库抽象层库:如果使用
Flask - SQLAlchemy
(一个流行的数据库抽象层库),它同样支持参数化查询。例如:
- 使用数据库抽象层库:如果使用
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
class Book(db.Model):
id = db.Column(db.Integer, primary_key = True)
title = db.Column(db.String(100))
books = Book.query.filter(Book.title.like('%keyword%')).all()
- **手动参数化**:对于原生SQL操作,开发者需要手动进行参数化。例如,使用`psycopg2`库连接PostgreSQL数据库:
import psycopg2
conn = psycopg2.connect(database="mydb", user="user", password="password", host="127.0.0.1", port="5432")
cur = conn.cursor()
cur.execute("SELECT * FROM book WHERE title LIKE %s", ('%keyword%',))
rows = cur.fetchall()
- 防范跨站脚本攻击(XSS)
- Django
- 自动转义:Django模板系统会对变量进行自动转义。例如,在模板中渲染变量:
- Django
{{ user_input }}
如果user_input
包含<script>alert('XSS')</script>
,Django会将其转义为<script>alert('XSS')</script>
,使其在浏览器中不会作为脚本执行。
- 安全标记:可以使用mark_safe
函数标记安全的HTML内容。例如:
from django.utils.safestring import mark_safe
safe_html = mark_safe('<p>Some safe HTML</p>')
- Flask
- Jinja2模板转义:Flask默认使用Jinja2模板引擎,Jinja2会对变量进行自动转义。例如:
{{ user_input }}
同样会对恶意脚本内容进行转义。
- 手动控制:开发者也可以手动控制转义,使用|safe
过滤器标记安全内容。例如:
{{ safe_html|safe }}
其中safe_html
是开发者确认安全的HTML字符串。