XSS攻击 跨站请求伪造(CSRF)原理及作用 全局配置CSRF 局部配置CSRF用户数据提交方式

XSS攻击

XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。例如web页面可以运行评论中的js代码

XSS攻击的危害包括

  1. 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
  2. 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
  3. 盗窃企业重要的具有商业价值的资料
  4. 非法转账
  5. 强制发送电子邮件
  6. 网站挂马
  7. 控制受害者机器向其它网站发起攻击

跨站请求伪造(CSRF)原理及作用

作用:实现防止跨站请求伪造的功能

  • 原理

    1. 用户向服务器发出请求(例如,GET),服务器端返回用户请求,并将服务器端唯一解密的CSRF生成的随机字符串发送给用户。
    2. 用户向服务器提交数据时,需要带着服务端给用户的加密随机字符串;否则,不允许用户提交数据。
  • 检测原理

    1. 当用户从服务器端获取数据时,没有限制
    2. 当用户向服务器端提交数据时,首先验证加密随机字符串是否存在、正确,然后再进行业务处理。

全局配置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中设置了全局中间件。

以装饰器的形式添加到相应函数上,即可

用户数据提交方式

  1. form表单

     <form action="/login/" method="post">
         {% csrf_token %}
     </form>
    

    效果:表单和cookie中都存在了

  2. 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默认添加上的
posted @ 2018-04-10 22:37  12兵哥哥  阅读(201)  评论(0编辑  收藏  举报