Django信息安全相关之CSRF和XSS
什么是xss攻击
xss攻击:黑客把恶意的JS脚本提交到后端,后端把恶意脚本渲染显示出来
什么是CSRF?
1、你登录建行官网后 你的浏览器就保存了建行网站的cokie,(如果不关闭这个页面cookie一直生效,就可以发送任何请求)专门在cappron试了一下;
2、与此同时你 点了其他恶意页面(CSRF攻击的条件)
3、这个页面携带着你的cokie 伪造你 向到招商银行提交 一个转账form表单你就傻逼了!
(问题关键:登录某网站之后有了cokie,就可以发送任何请求;这时候最危险)
如何防止CSRF攻击
服务端端开启 csrf认证之后,
客户端发送get请求 要form表单时,在里面加上{% csrf_token %}一个随机字符串
客户端收到这个 带随机字符串的 form表单之后
客户端在向服务端 发post请求(不仅要有cokie还检查这个from表单是不是携带{% csrf_token %})
(不要以为有了cokie就可以随意发送 post请求了!)
说白了就是:服务端生成随机字符串发给客户端,下次客户端来了要检查他的这个随机字符串
{% csrf_token %}{
<QueryDict: {'csrfmiddlewaretoken': ['Vk4rQ7L3d2stscFgHq7lKWTWSEcZrIRAAw3QJv6G2FLopBVJb7sONVbiP9aqDjgj'], 'user': ['我'], 'pwd': ['q'], 'gender': ['1'], 'login': ['yes']}>
Django应用CSRF
1.服务端全部禁用CSRF验证
在项目的setings文件把这个 中间件注释掉
'django.middleware.csrf.CsrfViewMiddleware',
2、局部使用
免除FBV的 CRFS验证
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt(免除)
def login(request):
if request.method=='GET':
return render(request,'login.html')
else:
print(request.POST)
return HttpResponse('OK')
要求FBV使用CRFS验证
from django.views.decorators.csrf import csrf_exempt,csrf_protect @csrf_protect(保护)
def login(request):
if request.method=='GET':
return render(request,'login.html')
else:
print(request.POST)
return HttpResponse('OK')
3、CBV应用CSRF验证
要想在CBC局部使用或者禁用CRF验证就必须 导入method_decorator(方法装饰)
from django.utils.decorators import method_decorator
@method_decorator(csrf_exempt,name='dispatch')
class login(View):
def get(self,request):
return render(request,'login.html') def post(self,request):
return HttpResponse("ok")
4、from表单添加CSRFtocken
{% csrf_token %}

Ajax应用CSRF
如果服务端开启了CSRF验证,客户端就发送post请求就必须携带 服务端给的CSRF
那问题来了如果发 ajanx请求呢?
答案:客户端发送 get请求时,服务端会把CSRF tocken放在form表单中(隐藏的input标签)发送给客户端
如果客户端再发post请求给服务端找到这个标签,name="csrfmiddlewaretoken"发送给服务端
<script src="/static/zhanggen.js"></script>
</head>
<body>
<h1>欢迎来到百合网</h1>
<form> {# 服务端开启csrf认证#}
<p>用户:<input type="text" name="user" ></p>
<p>密码:<input type="password" name="pwd"></p>
<p>
性别:男:<input type="radio" name="gender" value="1" b="1">
女:<input type="radio" name="gender" value="2">
</p>
<p><input type="checkbox" name="login" value="yes" zhanggen="1">一周免登录</p>
<input type="button" value="提交" onclick="a()">
</form>
</body>
<script>
function a(){
tocken=$('[name="csrfmiddlewaretoken"]').val()
$.ajax({
url:'/login/',
type:'POST',
data:{'csrfmiddlewaretoken':tocken},
或者这样data:{'csrfmiddlewaretoken':'{{csrf_token}}'},最后福建小伙向淫王一问
})
}
</script>
</html>
2、如果没有from表单携带CSRF的话,不要忘了CSRF的随机字符串也会放在cookie里面哦!!
从cookie中获取csrftokenf需要借助 jquery.cookie.js插件
/*!
* jQuery Cookie Plugin v1.4.1
* https://github.com/carhartl/jquery-cookie
*
* Copyright 2013 Klaus Hartl
* Released under the MIT license
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// CommonJS
factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
}(function ($) { var pluses = /\+/g; function encode(s) {
return config.raw ? s : encodeURIComponent(s);
} function decode(s) {
return config.raw ? s : decodeURIComponent(s);
} function stringifyCookieValue(value) {
return encode(config.json ? JSON.stringify(value) : String(value));
} function parseCookieValue(s) {
if (s.indexOf('"') === 0) {
// This is a quoted cookie as according to RFC2068, unescape...
s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
} try {
// Replace server-side written pluses with spaces.
// If we can't decode the cookie, ignore it, it's unusable.
// If we can't parse the cookie, ignore it, it's unusable.
s = decodeURIComponent(s.replace(pluses, ' '));
return config.json ? JSON.parse(s) : s;
} catch(e) {}
} function read(s, converter) {
var value = config.raw ? s : parseCookieValue(s);
return $.isFunction(converter) ? converter(value) : value;
} var config = $.cookie = function (key, value, options) { // Write if (value !== undefined && !$.isFunction(value)) {
options = $.extend({}, config.defaults, options); if (typeof options.expires === 'number') {
var days = options.expires, t = options.expires = new Date();
t.setTime(+t + days * 864e+5);
} return (document.cookie = [
encode(key), '=', stringifyCookieValue(value),
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
options.path ? '; path=' + options.path : '',
options.domain ? '; domain=' + options.domain : '',
options.secure ? '; secure' : ''
].join(''));
} // Read var result = key ? undefined : {}; // To prevent the for loop in the first place assign an empty array
// in case there are no cookies at all. Also prevents odd result when
// calling $.cookie().
var cookies = document.cookie ? document.cookie.split('; ') : []; for (var i = 0, l = cookies.length; i < l; i++) {
var parts = cookies[i].split('=');
var name = decode(parts.shift());
var cookie = parts.join('='); if (key && key === name) {
// If second argument (value) is a function it's a converter...
result = read(cookie, value);
break;
} // Prevent storing a cookie that we couldn't decode.
if (!key && (cookie = read(cookie)) !== undefined) {
result[name] = cookie;
}
} return result;
}; config.defaults = {}; $.removeCookie = function (key, options) {
if ($.cookie(key) === undefined) {
return false;
} // Must not alter options, thus extending a fresh object...
$.cookie(key, '', $.extend({}, options, { expires: -1 }));
return !$.cookie(key);
}; }));

导入<script src="/static/jquery.cookie.js"></script>
发送ajax:data:{
"X-CSRFToken", $.cookie('csrftoken')
},
如果是在cookie里面 获取的 CSRF tocken(记号)就不能放在 ajax的请求体里面了
放在请求头里,而且必须以这个格式(headers:{'X-CSRFToken':tocken},) 这是Django规定
注意cookie里的 CSRF tocken和 from表单里的不一样
响应头设置CSRF-Tocken,使用ajax向Django后台发送json数据.
$.ajax({
type: 'POST',
async: false,
cache: false,
url: '{% url "instance_add" %}',
headers:{"X-CSRFToken":$.cookie('csrftoken')},
contentType: "application/json; charset=utf-8",
dataType: "json",
traditional:true,
data:JSON.stringify({
"data_mode_type": $data_mode_type,
'database_type': $database_type,
'host': $host,
'port': $port,
'instance_nikename': $instance_nikename,
'db_business': $db_business,
'DBA': $DBA,
'responsible_person': $responsible_person
}),
success: function (data) {
alert(1)
}
});
})
ajax
from django.shortcuts import render,HttpResponse,redirect
from DB_auto.form_validate.add_dbinfo import dbinfo_create
import json def instance_add(request):
if request.method=='POST':
json_data=json.loads(request.body.decode('utf-8'))
obj=dbinfo_create(json_data)
if obj.is_valid():
print(obj.cleaned_data)
else:
print(obj.errors)
return render(request,'add_dbinfo.html')
django后台使用form验证json数据
Django信息安全相关之CSRF和XSS的更多相关文章
- PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等
页面导航: 首页 → 网络编程 → PHP编程 → php技巧 → 正文内容 PHP安全 PHP开发中常见的安全问题详解和解决方法(如Sql注入.CSRF.Xss.CC等) 作者: 字体:[增加 减小 ...
- 常见的 CSRF、XSS、sql注入、DDOS流量攻击
CSRF攻击 :跨站请求伪造攻击 ,CSRF全名是Cross-site request forgery,是一种对网站的恶意利用,CSRF比XSS更具危险性 攻击者一般会使用吸引人的图片去引导用户点击进 ...
- web安全CSRF和XSS
web端的安全攻击有CSRF和XSS两种,将通过以下三个方面介绍这两种安全攻击: 1.基本概念和缩写 2.攻击原理 3.防御措施 CSRF 1.基本概念和缩写 CSRF(Cross-site req ...
- 面试 07-安全问题:CSRF和XSS
07-安全问题:CSRF和XSS #前言 面试中的安全问题,明确来说,就两个方面: CSRF:基本概念.攻击方式.防御措施 XSS:基本概念.攻击方式.防御措施 这两个问题,一般不会问太难. 有人问: ...
- token、cookie和session区别以及django中的cookie,csrf
参考:https://my.oschina.net/xianggao/blog/395675?fromerr=GC9KVenE [前言]登录时需要post的表单信息. 先跳过具体案例,讲解基础知识: ...
- 玩转Django的POST请求 CSRF
玩转Django的POST请求 CSRF 不少麻油们玩django都会碰到这个问题,POST请求莫名其妙的返回 403 foribidden,希望这篇博文能解答所有问题 三种方法 To enable ...
- CSRF和XSS
XSS(跨站脚本攻击): 攻击者发现XSS漏洞——构造代码——发送给受害人——受害人打开——攻击者获取受害人的cookie——完成攻击 XSS是什么?它的全名是:Cross-site scriptin ...
- Django学习系列之CSRF
Django CSRF 什么是CSRF CSRF, Cross Site Request Forgery, 跨站点伪造请求.举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果 某个用户已经登录到 ...
- 前端安全问题之CSRF和XSS
一.CSRF 1.什么是 CSRF CSRF(全称 Cross-site request forgery),即跨站请求伪造 2.攻击原理 用户登录A网站,并生成 Cookie,在不登出的情况下访问危险 ...
随机推荐
- 前端UI框架总结
H-ui 前端框架 架起设计与后端的桥梁轻量级前端框架,简单免费,兼容性好,服务中国网站. 官网:http://www.h-ui.net/H-ui.admin.shtml github下载:https ...
- C++使用thread类进行多线程编程
C++11中引入了一个用于多线程操作的thread类,简单多线程示例: #include <iostream> #include <thread> #include <W ...
- How Many O's? UVA - 11038
这个题个人感觉有点难,不容易理解. 题意 给你两个数,n,m,找出从n到m所有的数一共包含几个0,看似简单,包含0的不就都是整数么,然后就用暴力循环来找,绝对TL.我自己写这题也没有什么好的办法,没有 ...
- 串口.Qt532测试(同步)
环境:Win7x64.Qt5.3.2 MSVC OpenGL(x86).vs2010(x86) ZC:这里的例子是 同步的函数操作,貌似 如果子线程在等待 WaitCommEvent(...)或Rea ...
- [原][源码][tinyxml][opencv]按照规格剪切所有的图片
源码: #include <iostream> #include <fstream> #include <opencv2/core/core.hpp> #inclu ...
- asp.net 虹软人脸识别sdk 释放内存
初始化时申请内存,用完记得释放,不然就会报“内存已满”的. 使用时: pMem = Marshal.AllocHGlobal(detectSize); 释放内存: Marshal.FreeHGloba ...
- DOCTYPE的作用以及标准模式和兼容模式的区别
<!doctype>声明必须处于HTML文档的头部,在<html>标签之前,告知浏览器的解析器用什么文档标准解析这个文档.DOCTYPE不存在或格式不正确会导致文档以兼容模式呈 ...
- Qt解析Json数据
1 JSON数据简介 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范) ...
- ubuntu 14.04 postgresql 的总结
1)为了允许远程连接: a) http://askubuntu.com/questions/423165/remotely-access-postgresql-database To open the ...
- 如何通过 Terminal 设置截图存储的位置
由于截图的默认位置是存储在 desktop 上的,而 desktop 又是我们经常见的地方,有一个干净的界面对良好的电脑的体验非常重要,那么可以通过改变截图的默认的存储位置来改变.而改变这一路径需要用 ...