安全:
xss:
跨站脚本攻击
web网站:js脚本
例如在网站留言这个<script>alert('123')</script>
此时再次打开网页会弹出一个对话框,这是因为alert的js脚本作用,所以要过滤js脚本
django默认自带转义不会让js脚本作用,加了safe后取消了对数据的转义
-<script>alert('123')</script> #弹出对话框
-<script>document.cookie</script> #获取到cookie,打开网页会得到用户的cookie,不安全
csrf:
跨站请求伪造
方法:加随机的字符串
只能防止一大部分人
django的方法:
-FBV
全站使用csrf验证
-开启django.middleware.csrf.CsrfViewMiddleware
-开启后在form表单里添加token
<form action="/csrf1/" method="post">
{% csrf_token %}
<input type="text" name="username">
<input type="submit" value="提交">
</form>
全站使用csrf,但是局部业务不适用csrf
-开启django.middleware.csrf.CsrfViewMiddleware
-针对局部业务函数,加上如下装饰器:
from django.views.decorators.csrf import csrf_exempt, csrf_protect
@csrf_protect
def csrf1(request):
if request.method == 'GET':
return render(request, 'csrf1.html')
else:
username = request.POST.get('username')
return HttpResponse('ok')
-CBV
from django.utils.decorators import method_decorator
@method_decorator(csrf_protect, name="get")#只能定义一个
@method_decorator(csrf_protect, name="post")#加两个写两次
class UserInfo(views):
def get(self,req):
pass
def post(self,req):
pass
ajax方式提交数据
1.data数据:
第一种方式 通过jquery获取csrf_token然后用ajax的data传送
$("#btn").click(function () {
var csrf_token = $("input[name='csrfmiddlewaretoken']").val();#通过name获取csrf_token
$.ajax({
url:"/csrf/",
type:"POST",
data:{"username":$("#username").val(),"csrfmiddlewaretoken":csrf_token}#csrf的key不能改
})
})
第二种方式 在headers里传送
$("#btn").click(function () {
$.ajax({
url:"/csrf/",
type:"POST",
headers:{'X-CSRFToken':crsf_token},
data:{"username":$("#username").val()}#csrf的key不能改
})
})
第二种方式更加安全
django 安全 csrf xss攻击
最新推荐文章于 2024-09-13 13:54:41 发布