csrf

csrf(cross-site request forgetery)即跨站请求伪造,最关键的一点原因:其他页面可以获取该浏览器上的所有cookie信息,然后它可以用cookie伪造真正的作者发起攻击

CSRF 攻击原理

复制代码
1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

       2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

       3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

       4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

       5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,
所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
复制代码

token防御的整体思路是

  • 第一步:后端随机产生一个token,把这个token保存在SESSION状态中;同时,后端把这个token交给前端页面;

  • 第二步:下次前端需要发起请求(比如发帖)的时候把这个token加入到请求数据或者头信息中,一起传给后端;

  • 第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;

一定要注意get不用设立CSRF,但是post请求需要

{%csrf_token%}的实质:是一个隐藏的input类型的标签 name="csrfmiddlewaretoken" value是浏览器给的字符串

submit的实质: 帮我们把input中的name和value拼成了字典

print(request.POST)

结果:

<QueryDict: {'csrfmiddlewaretoken': ['qfMnLpZ4kHUH0jD9vU4YRr24Uh7qsfFy4141X94tA1lVaeVPSpaPcMNu6pVE159a'], 

'user': ['为'], 'pwd': ['1212121']}>

http://www.thinkphp.cn/topic/54494.html

在django中

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

 

csrf要求发送post,put或delete请求的时候,是先以get方式发送请求,服务端响应时会分配一个随机字符串给客户端,
客户端第二次发送post,put或delete请求时携带上次分配的随机字符串到服务端进行校验

 

全局:

  中间件 django.middleware.csrf.CsrfViewMiddleware

  在中间件中的process_viewf方法中验证csrf,首先检查该函数是否设置了@csrf_exempt如果设置了,就免除验证,否则在这里进行csrf_token的验证

局部:

  • @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
  • @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

应用

1.在post的表单中加入

{% csrf_token %}

2.使用ajax技术时:

 用POST请求的情况下

模板页面中必须要有 {% csrf_token %}
复制代码
<script>
    $("#i3").on("click",function () {
        $.ajax({
            url:"/login_bbs/",
            type:"post",
            data:{"username":$("#i1").val(),"password":$("#i2").val(),"csrfmiddlewaretoken":$("[name='csrfmiddlewaretoken']").val()},
            success:function (data) {
                var data1=JSON.parse(data);
                if(data1.true_info==="正确"){
                    location.href="/index/"
                }else{
                    $("#btns").html("用户名或密码错误").css("color","red")
                }


            }

        })

    })
</script>
复制代码

解决方法:

不用cookie,因为cookie会被其他页面获取到,使用token,把token放在请求头中,每次请求都验证

注意:

CSRF的Token仅仅用于对抗CSRF攻击。当网站同时存在XSS漏洞时候,那这个方案也是空谈。

前后端分离的项目一般不用CSRF这个中间件,需要注释掉这个中间件

1. 在前后端分离的应用中,前端通常运行在一个不同的域或子域中,而CSRF保护基于同源策略,要求请求来源与目标站点相同。因此,如果你的API会被跨域请求调用,启用CSRF保护可能导致请求被拒绝。
Token-Based认证:

2. 在前后端分离的应用中,通常会使用基于Token的认证机制,而不是Django默认的基于Session的认证。在这种情况下,由于请求不携带Django生成的CSRF token,启用CSRF保护可能导致请求失败。
公共API:

3. 如果你的API是公共可用的,并且可能被其他网站或应用调用,启用CSRF保护可能会对合法的请求造成问题。在这种情况下,可能需要在特定的API视图中免除CSRF保护。

 

 

xss攻击

XSS是什么?它的全名是:Cross-site scripting,为了和CSS层叠样式表区分所以取名XSS。是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。

恶意攻击者往Web页面里插入恶意script代码,当用户浏览该页之时,嵌入其中Web里面的script代码会被执行,从而达到恶意攻击用户的目的。

防御措施:

  • 当恶意代码值被作为某一标签的内容显示:在不需要html输入的地方对html 标签及一些特殊字符( ” < > & 等等 )做过滤,将其转化为不被浏览器解释执行的字符。django默认就是过滤HTML标签,

如何我们真的需要有个script显示到前端就用mark_safe

posted on 2019-03-20 15:37  程序员一学徒  阅读(580)  评论(0)    收藏  举报