Django开发与攻防测试(入门篇)
字数 1042 2025-08-18 11:37:23
Django开发与攻防测试(入门篇)教学文档
一、Django基础开发
1. 环境搭建与项目创建
# 下载指定版本Django
pip install django==1.8.2 -i https://pypi.mirrors.ustc.edu.cn/simple/
# 创建虚拟环境
virtualenv django_demo
cd django_demo
source bin/activate
# 创建项目目录结构
mkdir learn_django
cd learn_django
# 创建Django项目
python django-admin.py startproject django_web
# 创建应用
python manage.py startapp django_app
2. Django架构模式
Django采用MTV模式(Model-Template-View),与传统的MVC模式对应关系如下:
- Model(模型) - 数据存取层
- Template(模板) - 表现层
- View(视图) - 业务逻辑层
3. 静态Web开发
模板层
在项目根目录创建templates文件夹,添加index.html:
<!DOCTYPE html>
<html>
<head>
<title>Django Learning</title>
</head>
<body>
<h1>Hellow,Django!</h1>
</body>
</html>
视图层
在django_app/views.py中添加视图函数:
from django.shortcuts import render
def index(request):
return render(request,'index.html')
URL路由
在django_web/urls.py中配置路由:
from django.conf.urls import include, url
from django.contrib import admin
from django_app.views import index
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^index/', index),
]
4. 动态Web开发
数据库配置
修改settings.py中的数据库配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'your_db_name',
'USER': 'your_db_user',
'PASSWORD': 'your_db_password',
'HOST': 'localhost',
'PORT': '3306',
}
}
模型层
在django_app/models.py中定义模型:
from django.db import models
class DjangoTest(models.Model):
text = models.CharField(max_length=20)
数据库迁移
python manage.py makemigrations
python manage.py migrate
管理员界面
创建超级用户:
python manage.py createsuperuser
注册模型到admin:
from django.contrib import admin
from .models import DjangoTest
admin.site.register(DjangoTest)
动态视图
带参数的视图函数:
def index(request, id):
text = DjangoTest.objects.all()
iden = int(id)
context = {'text': text[iden]}
return render(request, 'index.html', context)
动态模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Django test</title>
</head>
<body>
<h1>ID: {{ text.id }}</h1>
<h1>Hello:{{ text.text }}</h1>
</body>
</html>
二、Django安全攻防
1. 格式化字符串漏洞
漏洞代码
template = 'Hello {user}! , You can set your email is:' + request.POST.get('email')
return render(request, 'index.html', {"value": template.format(user=request.user)})
攻击方式
通过构造email参数为{user.password}可以获取用户密码哈希值
修复方案
- 避免直接拼接用户输入到格式化字符串
- 使用模板系统分离数据和展示
2. XSS漏洞
漏洞代码
info = request.POST.get('info')
return render(request,'index.html',{"value":info})
Django的XSS防护机制
- 默认开启自动转义(escape)
- 可通过
safe过滤器关闭转义 - 可通过
autoescape标签控制转义
危险用法
{{ value | safe }}
修复方案
import cgi
info = request.POST.get('info')
info = cgi.escape(info)
return render(request,'index.html',{"value":info})
3. SQL注入漏洞
危险查询方式
id = request.POST.get('id')
tag = dj.objects.extra(where={'id={}'.format(id)})[0].text
攻击方式
构造id参数为1 or 1=1等恶意SQL片段
修复方案
使用参数化查询:
tag = dj.objects.extra(where=['id=%s'], params=[id])
4. 其他安全建议
- 始终使用Django内置的ORM进行数据库操作
- 避免直接使用
eval()或exec()执行用户输入 - 使用Django的CSRF保护机制
- 定期更新Django版本以获取安全补丁
- 使用
@login_required装饰器保护敏感视图 - 配置适当的权限系统
三、开发实践建议
-
项目结构规划
- 合理划分应用模块
- 使用虚拟环境隔离依赖
- 遵循PEP8编码规范
-
调试技巧
- 使用
print(queryset.query)查看生成的SQL - 利用Django shell进行快速测试
- 配置日志记录系统
- 使用
-
性能优化
- 使用
select_related和prefetch_related减少查询次数 - 合理使用缓存
- 优化模板渲染
- 使用
-
测试策略
- 编写单元测试
- 进行安全扫描
- 压力测试关键接口