一、XSS

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

1. 工作流程

a. 恶意用户,在一些公共区域(例如,建议提交表单或消息公共板的输入表单)输入一些文本,这些文本被其它用户看到,但这些文本不仅仅是他们要输入的文本,同时还包括一些可以在客户端执行的脚本。如:

  1. <script>
  2. this.document = "*********";
      alert('Not Safe');
  3. </script>

b. 恶意提交这个表单

c. 其他用户看到这个包括恶意脚本的页面并执行,获取用户的cookie等敏感信息。

2. 实例-未防范XSS攻击

  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. def index(request):
  14. return render(request, 'index.html', {'commit': pinglu})

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>

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>

index.html

以上实例中,若在commit.html页面输入以下内容并提交:

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

则会在index页面执行此行代码,弹出警告框(若包含恶意代码,则会执行)

3. 防范XSS攻击

  • 最直接的方法就是对于无法控制的输入在html页面内不要使用safe
  1. {# <div>{{ item|safe }}</div>#}
  2. <div>{{ item }}</div>
  • 也可以在views里进行过滤,防止特殊字符提交到数据库或网页内
  1. def commit(request):
  2. if request.method == 'GET':
  3. return render(request, 'commit.html')
  4. else:
  5. com = request.POST.get('commit')
  6. if '<script>' in com: # 过滤“<script>”关键字,防止恶意代码的提交
  7. return render(request, 'commit.html', {'error': '此条评论有毒,已被和谐'})
  8. else:
  9. pinglu.append(com)
  10. return redirect('/index.html/')

  • 对于信任的链接或用户输入,使用 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})

未使用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})

使用mark_safe标记的安全链接

二、CSRF

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

1. 工作流程

攻击通过在授权用户访问的页面中包含链接或者脚本的方式工作:

2. django中如何防范

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

全局:

  • 启用中间件 django.middleware.csrf.CsrfViewMiddleware

局部:

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

3. django中的具体应用方法

  • form表单中添加{csrf_token %}

若form表单中未添加{csrf_token %},则会报403错误。

  1. #settings.py中打开MIDDLEWARE设置
  2. 'django.middleware.csrf.CsrfViewMiddleware',
  1. from django.shortcuts import render, HttpResponse, redirect
  2.  
  3. def csrf_test(request):
  4. if request.method == 'GET':
  5. return render(request, 'csrf_test.html')
  6. else:
  7. return HttpResponse('ok')

views.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>csef_test</title>
  6. </head>
  7. <body>
  8. <form action="/csrf_test.html/" method="post">
  9. <input type="text" name="user" id="user">
  10. <input type="submit" value="submit">
  11. </form>
  12.  
  13. </body>
  14. </html>

csef_test.html

修改csef_test.html:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>csef_test</title>
  6. </head>
  7. <body>
  8. <form action="/csrf_test.html/" method="post">
  9. {% csrf_token %}
  10. <input type="text" name="user" id="user">
  11. <input type="submit" value="submit">
  12. </form>
  13.  
  14. </body>
  15. </html>

form表单中添加{% csrf_token %}

  • 全站禁用,即将settings.py中的 'django.middleware.csrf.CsrfViewMiddleware' 注释掉即可
  • 基于FBV视图的局部禁用和使用
  1. #settings.py
  2. #启用 'django.middleware.csrf.CsrfViewMiddleware',
  3.  
  4. from django.views.decorators.csrf import csrf_exempt
  5.  
  6. @csrf_exempt
  7. def csrf_test(request):
  8. if request.method == 'GET':
  9. return render(request, 'csrf_test.html')
  10. else:
  11. return HttpResponse('ok')

局部禁用

  1. #settings.py
  2. #禁用 #'django.middleware.csrf.CsrfViewMiddleware',
  3.  
  4. from django.views.decorators.csrf import csrf_protect
  5.  
  6. @csrf_protect
  7. def csrf_test(request):
  8. if request.method == 'GET':
  9. return render(request, 'csrf_test.html')
  10. else:
  11. return HttpResponse('ok')

局部使用

  •  基于CBV视图的(只能局部使用或禁用类,不能在类方法里局部使用或禁用
  1. #settings.py
  2. #禁用 'django.middleware.csrf.CsrfViewMiddleware',
  3.  
  4. from django.views import View
  5. from django.views.decorators.csrf import csrf_protect
  6. from django.utils.decorators import method_decorator
  7.  
  8. @method_decorator(csrf_protect, name='dispatch')
  9. class Foo(View):
  10. def get(self, request):
  11. pass
  12.  
  13. def post(self, request):
  14. pass

局部使用

  1. #settings.py
  2. #启用 'django.middleware.csrf.CsrfViewMiddleware',
  3.  
  4. from django.views import View
  5. from django.views.decorators.csrf import csrf_exempt
  6. from django.utils.decorators import method_decorator
  7.  
  8. @method_decorator(csrf_exempt, name='dispatch')
  9. class Foo(View):
  10. def get(self, request):
  11. pass
  12.  
  13. def post(self, request):
  14. pass

局部禁用

  • Ajax提交数据时,携带CSRF
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>csef_test</title>
  6. </head>
  7. <body>
  8. <form action="/csrf_test.html/" method="post">
  9. {% csrf_token %}
  10. <input type="text" name="user" id="user">
  11. {# <input type="submit" value="submit">#}
  12. <a onclick="submitForm();">Ajax提交表单</a>
  13. </form>
  14.  
  15. <script src="/static/jquery-3.2.1.js"></script>
  16. <script>
  17. function submitForm() {
  18. var csrf = $("input[name='csrfmiddlewaretoken']").val()
  19. var user = $("#user").val()
  20. $.ajax({
  21. url: '/csrf_test.html/',
  22. type: 'POST',
  23. data: {"user": user, "csrfmiddlewaretoken": csrf},
  24. success: function (arg) {
  25. console.log(arg);
  26. }
  27. })
  28. }
  29. </script>
  30. </body>
  31. </html>

Ajax重写csrf_test,html,csrf数据存放于data中

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>csef_test</title>
  6. </head>
  7. <body>
  8. <form action="/csrf_test.html/" method="post">
  9. {% csrf_token %}
  10. <input type="text" name="user" id="user">
  11. {# <input type="submit" value="submit">#}
  12. <a onclick="submitForm();">Ajax提交表单</a>
  13. </form>
  14.  
  15. <script src="/static/jquery-3.2.1.js"></script>
  16. {#专门处理cookie的插件,提取cookie字符串#}
  17. <script src="/static/jquery.cookie.js"></script>
  18.  
  19. {#csrf数据放于data中#}
  20. {#<script>#}
  21. {# function submitForm() {#}
  22. {# var csrf = $("input[name='csrfmiddlewaretoken']").val();#}
  23. {# var user = $("#user").val();#}
  24. {# $.ajax({#}
  25. {# url: '/csrf_test.html/',#}
  26. {# type: 'POST',#}
  27. {# data: {"user": user, "csrfmiddlewaretoken": csrf},#}
  28. {# success: function (arg) {#}
  29. {# console.log(arg);#}
  30. {# }#}
  31. {# })#}
  32. {# }#}
  33. {#</script>#}
  34.  
  35. {#csrf数据放于请求头中#}
  36. <script>
  37. function submitForm() {
  38. var csrf = $.cookie('csrftoken');
  39. var user = $("#user").val();
  40. $.ajax({
  41. url: '/csrf_test.html/',
  42. type: 'POST',
  43. headers: {'X-CSRFToken': csrf},
  44. data: {"user": user},
  45. success: function (arg) {
  46. console.log(arg);
  47. }
  48. })
  49. }
  50. </script>
  51.  
  52. </body>
  53. </html>

Ajax重写csrf_test.html,csrf数据存放于headers中

注意:{csrf_token %}和cookie中的csrftoken值不一样。

form表单中的隐藏csrf_token

cookie中

参考资料:

1. http://www.cnblogs.com/wupeiqi/articles/5246483.html

2. http://baike.baidu.com/link?url=zgAGPI1IKiAXCgFLNPVNhmZJI5SP4omb3zHchzPLuivW7QDRDxmAUDt7ZA8aqNlr-YuKKgp4GRmIvXucHHsPkq

3. http://baike.baidu.com/link?url=TN7axYhM1xYyXqfjjxDglcNEVBKhuEKs-axcWfV8MnDC0om8slvw_V3Cw4RQJyrnJ9yEQvyAu8Ndf8yKzbj0YK

Django—XSS及CSRF的更多相关文章

  1. [oldboy-django][2深入django]xss攻击 + csrf

    1 xss攻击 xss攻击(跨站脚本攻击,用户页面提交数据来盗取cookie) - 慎用safe, 和mark_safe -- 如果要用,必须要过滤 - 定义: 用户提交内容,在页面展示用html显示 ...

  2. 第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击

    第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击 sql注入攻击 也就是黑客通过表单提交的地方,在表单里输入了sql语句,就是通过SQL语 ...

  3. Django是如何防止注入攻击-XSS攻击-CSRF攻击

    注入攻击-XSS攻击-CSRF攻击介绍请访问:https://www.cnblogs.com/hwnzy/p/11219475.html Django防止注入攻击 Django提供一个抽象的模型层来组 ...

  4. XSS攻击&CSRF攻击 ----Django解决方案

    XSS攻击: XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执 ...

  5. XSS与CSRF两种跨站攻击比较

    XSS:跨站脚本(Cross-site scripting) CSRF:跨站请求伪造(Cross-site request forgery) 在那个年代,大家一般用拼接字符串的方式来构造动态SQL 语 ...

  6. 【实习记】2014-08-23网络安全XSS与CSRF总结

        XSS:脚本中的不速之客XSS:跨站脚本(Cross-site scripting)CSRF:冒充用户之手CSRF:跨站请求伪造(Cross-site request forgery) 谷歌搜 ...

  7. 总结 XSS 与 CSRF 两种跨站攻击

    前言 在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式.在这个年代, 参数化查询 [1] 已经成了普遍用法,我们已经离 SQL 注入很远了 ...

  8. 总结XSS与CSRF两种跨站攻击

    XSS:跨站脚本(Cross-site scripting),实际应是"CSS",但由于和层叠样式表CSS名称冲突,故改为"XSS" CSRF:跨站请求伪造(C ...

  9. XSS与CSRF两种跨站攻击总结

    在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式.在这个年代, 参数化查询 [1] 已经成了普遍用法,我们已经离 SQL 注入很远了.但是 ...

随机推荐

  1. Hibernate 初识

    第一步: 导包:(这是我根据其他网站的介绍导入的包,可能不完善,但开发没什么问题,遇到问题再说) 当然还有mysql的jar包 第二步:进行hibernate环境配置 在classpath目录下建立h ...

  2. [蓝桥杯][2015年第六届真题]机器人塔(dfs)

    题目描述 X星球的机器人表演拉拉队有两种服装,A和B. 他们这次表演的是搭机器人塔. 类似:      A     B B    A B A   A A B B  B B B A B A B A B ...

  3. git 换行符替换

    https://help.github.com/en/articles/dealing-with-line-endings rm .git/index git reset https://github ...

  4. java多线程-线程间协作

    大纲: wait.notify.notifyAll Condition 生产消费者 一.wait.notify.notifyAll wait.notify.notifyAll是Object的本地fin ...

  5. 实现Map按key或按value排序

    原理思路:用List实现排序,然后将List中的值遍历存入到LinkedHashMap 实现方式: //这里将map.entrySet()转换成list List<Map.Entry<St ...

  6. 自学springboot

    参考资料 https://www.renren.io/guide/

  7. DataAdapter对象

    DataAdapter对象在物理数据库表和内存数据表(结果集)之间起着桥梁的作用.它通常与DataTable对象或DataSet对象配合来实现对数据库的操作. DataAdapter对象是一个双向通道 ...

  8. (转)最新版 nginx内置变量 大全

    原文:http://www.cnphp.info/nginx-embedded-variables-lasted-version.html 在配置基于nginx服务器的网站时,必然会用到 nginx内 ...

  9. 给你的移动网站加点料:推荐下载App,如果本地安装则直接打开本地App(Android/IOS)

    纵观现在每家移动网站,打开首页的时候,都有各种各样的形式来提示你下载自身的移动App(Android/IOS),这是做移动客户端产品的一个很好地引流的手段.当然各家引流下载的交互和视觉各不相同,有的是 ...

  10. Cookie跳转登录验证码

    对于web应用来说,大部分的系统在用户登录时都要求用户输入验证码,验证码的类型的很多,有字母数字的,有汉字的,甚至还要用户输入一条算术题的答案的, 对于系统来说使用验证码可以有效果的防止采用机器猜测方 ...