Django之XSS和CSRF

一、XSS

XSS:跨站脚本攻击(也称为XSS)指利用网站漏洞从用户那里恶意盗取信息。

1.工作流程图

2.实例

 1 pinglu = []     # 评论列表
 2
 3 #提交表单
 4 def commit(request):
 5     if request.method == ‘GET‘:
 6         return render(request, ‘commit.html‘)
 7     else:
 8         com = request.POST.get(‘commit‘)
 9         pinglu.append(com)
10         return redirect(‘/index.html/‘)
11
12
13 #查看评论页面
14 def index(request):
15     return render(request, ‘index.html‘, {‘commit‘: pinglu})
16
17 view.py

view.py

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <h1>评论</h1>
 9 <form action="/commit.html/" method="post">
10     <input type="text" name="commit">
11     <input type="submit" value="sumbit"> {{ error }}
12 </form>
13 </body>
14 </html>
15
16 commit.html

commit.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 <h1>评论</h1>
 9 {% for item in commit %}
10     <div>{{ item|safe }}</div>
11 {#    item后加safe,默认数据安全,django不会做特殊处理#}
12 {% endfor %}
13 </body>
14 </html>
15
16 index.html

index.html

当攻击者在commit.html页面内容输入如下代码即可达成攻击效果

1 <script> alert(‘恶意脚本‘) </script>

3.预防措施

  • 无法控制输入内容的界面内,不使用safe
{#    <div>{{ item|safe }}</div>#}
    <div>{{ item }}</div>
  • 也可以在views文件中进行过滤,把一些含有特殊字符的数据过滤掉

例如:alter等

  • 使用mark_safe标记为安全

1 def make_safe(request):
2      from django.utils.safestring import mark_safe
3      temp = "<a href=‘http://www.baidu.com‘>百度</a>"
4      #temp = mark_safe(temp)
5      return render(request, ‘make_safe.html‘, {‘temp‘: temp})

二、CSRF

1.CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

2.防止方式

全局

  • 中间件 django.middleware.csrf.CsrfViewMiddleware

局部

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

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

3.应用方法

  • form表单中添加{% csrf_token %}
  • 全站禁用
    # ‘django.middleware.csrf.CsrfViewMiddleware‘,
  • 局部禁用

     1 ‘django.middleware.csrf.CsrfViewMiddleware‘,
     2
     3     from django.views.decorators.csrf import csrf_exempt
     4
     5     @csrf_exempt
     6     def csrf1(request):
     7
     8     if request.method == ‘GET‘:
     9         return render(request,‘csrf1.html‘)
    10     else:
    11         return HttpResponse(‘ok‘)
  • 局部使用

     1 # ‘django.middleware.csrf.CsrfViewMiddleware‘,
     2
     3 from django.views.decorators.csrf import csrf_exempt,csrf_protect
     4
     5 @csrf_protect
     6 def csrf1(request):
     7
     8     if request.method == ‘GET‘:
     9     return render(request,‘csrf1.html‘)
    10     else:
    11     return HttpResponse(‘ok‘)
  • 特殊CBV

     1 from django.views import View
     2 from django.utils.decorators import method_decorator
     3
     4 @method_decorator(csrf_protect,name=‘dispatch‘)
     5 class Foo(View):
     6
     7     def get(self,request):
     8     pass
     9
    10     def post(self,request):
    11     pass
  • Ajax提交数据时候,携带CSRF

  a.放置在data中携带

  •  1 <form method="POST" action="/csrf1.html">
     2     {% csrf_token %}
     3     <input id="user" type="text" name="user" />
     4     <input type="submit" value="提交"/>
     5     <a onclick="submitForm();">Ajax提交</a>
     6 </form>
     7 <script src="/static/jquery-1.12.4.js"></script>
     8 <script>
     9     function submitForm(){
    10         var csrf = $(‘input[name="csrfmiddlewaretoken"]‘).val();
    11         var user = $(‘#user‘).val();
    12         $.ajax({
    13             url: ‘/csrf1.html‘,
    14                 type: ‘POST‘,
    15             data: { "user":user,‘csrfmiddlewaretoken‘: csrf},
    16             success:function(arg){
    17                 console.log(arg);
    18             }
    19         })
    20     }
    21
    22 </script>

  b.放在请求头中

 1 <form method="POST" action="/csrf1.html">
 2     {% csrf_token %}
 3     <input id="user" type="text" name="user" />
 4     <input type="submit" value="提交"/>
 5     <a onclick="submitForm();">Ajax提交</a>
 6 </form>
 7 <script src="/static/jquery-1.12.4.js"></script>
 8 <script src="/static/jquery.cookie.js"></script>
 9
10 <script>
11     function submitForm(){
12         var token = $.cookie(‘csrftoken‘);
13         var user = $(‘#user‘).val();
14         $.ajax({
15             url: ‘/csrf1.html‘,
16             type: ‘POST‘,
17             headers:{‘X-CSRFToken‘: token},
18             data: { "user":user},
19             success:function(arg){
20                 console.log(arg);
21             }
22         })
23     }
24 </script>
25             
时间: 2024-11-10 17:47:35

Django之XSS和CSRF的相关文章

总结 XSS 与 CSRF 两种跨站攻击

在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式.在这个年代, 参数化查询 [1] 已经成了普遍用法,我们已经离 SQL 注入很远了.但是,历史同样悠久的 XSS 和 CSRF 却没有远离我们.由于之前已经对 XSS 很熟悉了,所以我对用户输入的数据一直非常小心.如果输入的时候没有经过 Tidy 之类的过滤,我一定会在模板输出时候全部转义.所以个人感觉,要避免 XSS 也是很容易的,重点是要“小心”.但最近又听说了另一种跨站攻击 CS

XSS与CSRF两种跨站攻击总结

在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式.在这个年代, 参数化查询 [1] 已经成了普遍用法,我们已经离 SQL 注入很远了.但是,历史同样悠久的 XSS 和 CSRF 却没有远离我们.由于之前已经对 XSS 很熟悉了,所以我对用户输入的数据一直非常小心.如果输入的时候没有经过 Tidy 之类的过滤,我一定会在模板输出时候全部转义.所以个人感觉,要避免 XSS 也是很容易的,重点是要“小心”.但最近又听说了另一种跨站攻击 CS

漏洞科普:对于XSS和CSRF你究竟了解多少

转自:http://www.freebuf.com/articles/web/39234.html 随着Web2.0.社交网络.微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在Web平台上,Web业务的迅速发展也引起黑客们的强烈关注,接踵而至的就是Web安全威胁的凸显. 黑客利用网站操作系统的漏洞和Web服务程序的SQL注入漏洞等得到Web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使

web安全之XSS和CSRF

XSS 跨站脚本攻击(cross site script),本来缩写CSS单位了和层叠样式(Cascading Style Sheet,CSS)有所区别,所以在安全领域叫做“XSS”. XSS攻击,通常上指黑客通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击.一开始这种攻击是跨域的,但是由于今天JavaScript的强大功能以及网站前端应用的复杂化,是否跨域已经不再重要.  XSS通过代码注入,获取目标网站的的Cookie,从而发起“Cookie劫

Django学习系列之CSRF

Django CSRF 什么是CSRF CSRF, Cross Site Request Forgery, 跨站点伪造请求.举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果 某个用户已经登录到你的网站上了,那么当这个用户点击这个恶意网站上的那个链接时,就会向你的网站发来一个请求, 你的网站会以为这个请求是用户自己发来的,其实呢,这个请求是那个恶意网站伪造的 Django提供的CSRF防护机制 django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 t

一次解决存储型xss和csrf漏洞的简单方法

目前我知道的,存储型xss解决方法:过滤转义用户输入的脚本.标签,csrf漏洞解决方法:校验referer.加token.加验证码 而referer校验是针对存在referer的情况,因为某些请求的head里没有referer,这时不能判断请求是非法的:加token,保存在哪是个问题,如果保存在session中,当集群部署时,session不同步会导致客户端的token与处理请求的服务器的token不一致:加验证码同样的道理,而且对用户体验非常不好. 由于xss和csrf都是改变用户请求参数来达

Xss和Csrf介绍

Xss和Csrf介绍 Xss Xss(跨站脚本攻击),全称Cross Site Scripting,恶意攻击者向web页面中植入恶意js代码,当用户浏览到该页时,植入的代码被执行,达到恶意攻击用户的目的. Xss攻击的危害 盗取各类用户账号 窃取有商业价值的资料 非法转账操作 强制发送电子邮件 控制受害者机器向其它网站发起攻击 等等... 原因分析 原因:没有对客户端提交的数据进行校验分析,导致恶意代码被植入. 根本解决:不要相信任何客户端提交的任何数据!!! Xss攻击的分类 反射型Xss攻击

浅谈CDN、SEO、XSS、CSRF

CDN 什么是CDN 初学Web开发的时候,多多少少都会听过这个名词->CDN. CDN在我没接触之前,它给我的印象是用来优化网络请求的,我第一次用到CDN的时候是在找JS文件时.当时找不到相对应的JS文件下载地址(之前一般我都是把JS下载下来,然后在项目中引用的.PS:当然了,我觉得大部分初学者都一样) 找着找着发现了这个网站:http://www.bootcdn.cn/,发现它这个搜索引擎收录了很多的JS文件,直接在项目中引入它的地址就行了! 后来,在购买服务器的时候也发现了广告:CDN加速

浅说 XSS 和 CSRF

在 Web 安全领域中,XSS 和 CSRF 是最常见的攻击方式. XSS XSS,即 Cross Site Script,中译是跨站脚本攻击:其原本缩写是 CSS,但为了和层叠样式表(Cascading Style Sheet)有所区分,因而在安全领域叫做 XSS. XSS 攻击是指攻击者在网站上注入恶意的客户端代码,通过恶意脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一种攻击方式. 攻击者对客户端网页注入的恶意脚本一般包括 JavaScript,