1.客户(模板页面(html页面) ) --------> 服务员(函数处理业务请求) --------> 厨子 (使用原材料作饭:数据库相关的操做)html
2.模板页面(views)---->控制器(controller:函数)---->模型 (models:建表与数据库相关)前端
1.django独有:M(model:用类建表)、T(tempalte:HTML模板) 、V(views:业务逻辑函数)ajax
M(model) : models
T(tempalte) : views
V(views): controller
1.三种安全攻击:CSRF, xss, sql注入 2.csrf:跨站请求伪造攻击sql
3.相关内容:(参考:http://www.javashuo.com/article/p-elkpezpl-eg.html)数据库
django为用户实现防止跨站请求伪造的功能,经过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能又分为全局和局部。
全局:
中间件 django.middleware.csrf.CsrfViewMiddleware
局部:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即使settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即使settings中设置了全局中间件。
注意:from django.views.decorators.csrf import csrf_exempt,csrf_protect
4.当用==post==提交数据的时候,django会去检查是否有一个csrf的随机字符串,若是没有就会报错,这也是以前咱们一直将其注释的缘由django
# 1.开启全局的csrf验证:
# 1.1 settings中,打开注释
'django.middleware.csrf.CsrfViewMiddleware',
# 1.2 表单中,开启csrf_token
# html文件中:
<form>
{% csrf_token %} # 写了会经过验证
<input type='text'>
</form>
# 在views文件中:
def test1(request):
return HttpResponse("ok")
# 1.3 如上,全站都会进行csrf验证
# 2.局部的函数, 不进行csrf验证
# 2.1 settings中,打开注释
'django.middleware.csrf.CsrfViewMiddleware',
# 2.2 在views中:
from django.views.decorators.csrf import csrf_exempt
5.当用户经过get方式访问页面的时候,会生成一个csrf的随机字符串,而且cookie中也存放了这个随机字符串,当用户再次提交数据的时候会带着这个随机字符串提交,若是没有这个随机字符串则没法提交成功后端
6.CBV(class base views): 就是在视图里使用类处理请求安全
1.提升了代码的复用性,可使用面向对象的技术,好比Mixin(多继承)cookie
2.能够用不一样的函数针对不一样的HTTP方法处理,而不是经过不少if判断,提升代码可读性xss
from django.views.decorators.csrf import csrf_protect
from django.utils.decorators import method_decorator
from django.views import View
7.经过 ajax 验证CSRF
若是经过ajax进行提交数据,这里提交的csrftoken是经过请求头中存放,须要提交一个字典类型的数据,即这个时候须要一个key(X_CSRFtoken)
在views中的login函数中:from django.conf import settings,而后打印print(settings.CSRF_HEADER_NAME),这里须要注意一个问题,这里导入的settings并非咱们在项目文件下看到的settings.py文件,这里是是一个全局的settings配置,而当咱们在项目目录下的settings.py中配置的时候,咱们添加的配置则会覆盖全局settings中的配置
print(settings.CSRF_HEADER_NAME)打印的内容为:HTTP_X_CSRFTOKEN。这里的HTTP_X_CSRFTOKEN是django在X_CSRF的前面添加了HTTP_,因此实际传递的是就是X_CSRFtoken,而在前端页面的ajax传递的时候因为不能使用下划线因此传递的是X_CSRFtoken
<body>
<form action="/test/" method="post">
{% csrf_token %}
<input type="text">
<input type="submit" value="sub">
</form>
</body>
<!-- 将token放置到请求头中,携带过去 -->
<script>
//在页面中会有一个隐藏的input标签中,存放csrf验证码,咱们能够经过伪类进行获取
token = $('input[name="csrfmiddlewaretoken"]').val()
// headers : {'X-CSRFToken': token}
$.ajax({
type:'POST',
url:'/test/',
data:{'name':'xxxx'},
headers : {'X-CSRFToken': token},
sucess;fucntion(data){
console.log(data);
}
})
</script>
8.总结:
1.CSRF在ajax提交的时候是经过请求头传给后台的
2.csrf在前端的key为:X-CSRFtoken,到后端的时候django会自动添加HTTP_。所以最后为:HTTP_X_CSRFtoken