XSS攻击 跨站请求伪造(CSRF)原理及作用 全局配置CSRF 局部配置CSRF用户数据提交方式
XSS攻击
XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。例如web页面可以运行评论中的js代码
XSS攻击的危害包括
- 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
- 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
- 盗窃企业重要的具有商业价值的资料
- 非法转账
- 强制发送电子邮件
- 网站挂马
- 控制受害者机器向其它网站发起攻击
跨站请求伪造(CSRF)原理及作用
作用:实现防止跨站请求伪造的功能
-
原理
- 用户向服务器发出请求(例如,GET),服务器端返回用户请求,并将服务器端唯一解密的CSRF生成的随机字符串发送给用户。
- 用户向服务器提交数据时,需要带着服务端给用户的加密随机字符串;否则,不允许用户提交数据。
-
检测原理
- 当用户从服务器端获取数据时,没有限制
- 当用户向服务器端提交数据时,首先验证加密随机字符串是否存在、正确,然后再进行业务处理。
全局配置CSRF
工程中的settings.py
MIDDLEWARE = [
'django.middleware.csrf.CsrfViewMiddleware',
]
局部配置CSRF
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_protect 当前函数强制设置防跨站请求伪造功能,即便settings.py中没有设置全局中间件。
@csrf_exempt 取消当前函数防跨站请求伪造功能,即便settings.py中设置了全局中间件。
以装饰器的形式添加到相应函数上,即可
用户数据提交方式
-
form表单
<form action="/login/" method="post"> {% csrf_token %} </form>
效果:表单和cookie中都存在了
-
ajax
数据提交到请求头
请求头里面不能出现下划线,有下划线是非法的
方式一
headers: {'X-CSRFtoken': $.cookie('csrftoken')},
例如:
$('#btn1').click(function () {
$.ajax({
url: '/login/',
type:"GET",
data: {'user': 'root', 'pwd': '123'},
headers: {'X-CSRFtoken': $.cookie('csrftoken')},
success:function(arg){
}
})
});
方式二
$.ajaxSetup({
beforeSend: function(xhr,settings){
xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'));
}
});
该函数会在ajax请求之前执行,没用每个ajax添加header,因是全局配置
本质是调用
obj = XMLHttpRequest()
obj.open()
obj.send()
补充1
CsrfViewMiddleware类的process_view方法的CSRF_HEADER_NAME
from django.middleware.csrf import CsrfViewMiddleware
from django.conf import settings
print(settings.CSRF_HEADER_NAME) #HTTP_X_CSRFTOKEN 是Django处理过的请求头
补充2
html
headers:{'zzzzzzzz': 123},
views.py
for connect in request.META:
if re.search('zzz', connect, re.IGNORECASE):
print(connect)
打印信息:
HTTP_ZZZZZZZZ #可以看出HTTP_是Django默认添加上的