zoukankan      html  css  js  c++  java
  • XSS跨站脚本攻击+CRSF/XSSF跨站伪造请求

      XSS攻击跨站脚本攻击

      跨站脚本攻击 黑客在网页里边插入js代码,造成网页紊乱不安全。

      不安全的表现:如果黑客在一个网页中插入拿到cookie的js代码,如果用户来访问这个网站,那么黑客就可以拿到用户的cookie信息,那么黑客就可以伪造用户的信息去了。

      前端有个safe和后端mark_safe

      使用safe要注意 如果用户能在页面上插入写js代码等等(修改代码),一定不要加safe如果实在要加,切记在后台做出过滤js代码等工作,如果是我们自己写的当然safe加上无妨

      使用mark_safe时候,得到用户的数据时候也要对其进行处理

      django默认给我们做了xss攻击这层防范

    例子:模拟用户在输入框输入js代码带来的影响

      在这里可以把csrf中间件在配置文件中注释掉

     1 """djangoxss URL Configuration
     2 
     3 The `urlpatterns` list routes URLs to views. For more information please see:
     4     https://docs.djangoproject.com/en/2.1/topics/http/urls/
     5 Examples:
     6 Function views
     7     1. Add an import:  from my_app import views
     8     2. Add a URL to urlpatterns:  path('', views.home, name='home')
     9 Class-based views
    10     1. Add an import:  from other_app.views import Home
    11     2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    12 Including another URLconf
    13     1. Import the include() function: from django.urls import include, path
    14     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    15 """
    16 from django.contrib import admin
    17 from django.urls import path
    18 from app01 import views
    19 
    20 urlpatterns = [
    21     path('admin/', admin.site.urls),
    22     path('index/', views.index),
    23     path('comment/', views.comment),
    24     path('test/', views.test),
    25 ]
    urls.py
     1 from django.shortcuts import render
     2 
     3 msg = []
     4 
     5 
     6 def comment(request):
     7     if request.method == 'GET':
     8         return render(request, 'comment.html')
     9     else:
    10         m = request.POST.get('content')
    11         if "script" in m:  # 当然这是简单的判断js代码多了去了
    12             return render(request, 'comment.html', {'error': '小逼崽子黑我'})
    13         else:
    14             msg.append(m)
    15             return render(request, 'comment.html')
    16 
    17 
    18 def index(request):
    19     return render(request, 'index.html', {'msg': msg})
    20 
    21 
    22 def test(request):
    23     from django.utils.safestring import mark_safe
    24     temp = "<a href='http://www.baidu.com'>baidu</a>"
    25     newtemp = mark_safe(temp)
    26     return render(request, 'test.html', {'temp': newtemp})
    views.py 
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
        <h3>评论信息</h3>
        {% for item in msg %}
            <div>{{ item | safe }}</div>
        {% endfor %}
    
    </body>
    </html> 
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>comment</title>
    </head>
    <body>
        <form action="/comment/" method="post">
            {% csrf_token %}
            <p><input type="text" name="content"></p>
            <input type="submit" value="提交">
        </form>
    </body>
    </html>  
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test</title>
    </head>
    <body>
        {{ temp }}
    </body>
    </html>
    

      CSRF跨站请求伪造 

     实例:

    <form action="http://www.cmbchina.com/">
        askjsakjskasdd
        <input type="text" value="18554523538356645" name="to" style="display: none">
        <input type="text" value="188888888888888" name="money" style="display: none">
        <a>美女点我</a>
    </form>
    
    <a href="http://www.cmbchina.com/?to=18554523538356645&money=188888888888888">美女点我</a>  

    csrf_token 服务端生成随机字符串对用户做认证,用户来访问服务端的时候,要带着它过来,否则用户就可以发伪造的一些请求了。


    不能完全把这个安全机制避免 所以后期什么各种验证码。

    措施:

    1 urlpatterns = [
    2     path('admin/', admin.site.urls),
    3     path('csrf1/', views.csrf1),
    4 ]
     1 from django.shortcuts import render, HttpResponse
     2 from django.views.decorators.csrf import csrf_exempt, csrf_protect
     3 
     4 
     5 # csrf_token 随机字符串,跨站请求伪造 不能完全把这个安全机制避免 所以后期什么各种验证码
     6 # @csrf_exempt # 局部禁用
     7 # @csrf_protect # 局部使用
     8 # FBV
     9 
    10 
    11 @csrf_protect
    12 def csrf1(request):
    13     if request.method == 'GET':
    14         return render(request, 'csrf1.html')
    15     else:
    16         return HttpResponse('1')
    17 
    18 
    19 # CBV
    20 from django.views import View
    21 from django.utils.decorators import method_decorator
    22 
    23 
    24 def wrapper(func):
    25     def inner(*args, **kwargs):
    26         return func(*args, **kwargs)
    27     return inner
    28 
    29 
    30 # 1.在类中函数属性上添加
    31 class Foo(View):
    32     def dispatch(self, request, *args, **kwargs):
    33         pass
    34 
    35     @method_decorator(wrapper)
    36     def get(self, request):
    37         pass
    38 
    39     def post(self, request):
    40         pass
    41 
    42 # 2.在类上加
    43 @method_decorator(wrapper, name='get')
    44 class Foo(View):
    45     def dispatch(self, request, *args, **kwargs):
    46         pass
    47 
    48     def get(self, request):
    49         pass
    50 
    51     def post(self, request):
    52         pass
    53 
    54 # 对于csrf必须这样子搞
    55 @method_decorator(csrf_protect, name='post')
    56 class Foo(View):
    57     def dispatch(self, request, *args, **kwargs):
    58         pass
    59 
    60     def get(self, request):
    61         pass
    62 
    63     def post(self, request):
    64         pass
     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title></title>
     6 </head>
     7 <body>
     8     <form action="/csrf1/" method="post">
     9         {% csrf_token %}
    10 {#        {{ csrf_token }} 生成input标签value字符串值#}
    11         <input id='money' type="text" name="money">
    12         <input type="submit" value="提交">
    13         <a onclick="submitForm1();">ajax提交1</a>
    14         <a onclick="submitForm2()">ajax提交2</a>
    15         <a onclick="submitForm3()">ajax提交3</a>
    16     </form>
    17     <script src="/static/jquery-3.3.1.js"></script>
    18     <script src="/static/jquery.cookie.js"></script>
    19     <script>
    20         function submitForm1() {
    21             var csrf = $('input[name="csrfmiddlewaretoken"]').val();
    22             var money = $('#money').val();
    23             $.ajax({
    24                 url: '/csrf1/',
    25                 type: 'POST',
    26                 data:{
    27                     "money":money,
    28                     "csrfmiddlewaretoken":csrf, 
                    //如果data是{'k':values}values不支持字典形式的 一定加上traditional:true 在后台取时用request.POST.getlist
    29 }, 30 success:function (arg) { 31 console.log(arg); 32 } 33 }) 34 } 35 function submitForm2() { 36 var token = $.cookie('csrftoken'); 37 /* $.cookie('abcd','111111ahadjshddghg');*/ 38 var money = $('#money').val(); 39 $.ajax({ 40 url: '/csrf1/', 41 type: 'POST', 42 headers:{ 43 'X-CSRFToken':token 44 }, 45 data:{ 46 "money":money 47 }, 48 success:function (arg) { 49 console.log(arg); 50 } 51 }) 52 } 53 function submitForm3() { 54 var money = $('#money').val(); 55 $.ajax({ 56 url: '/csrf1/', 57 type: 'POST', 58 data:{ 59 "money":money, 60 "csrfmiddlewaretoken":{{ csrf_token }} 61 }, 62 success:function (arg) { 63 console.log(arg); 64 } 65 }) 66 } 67 </script> 68 </body> 69 </html>

     

  • 相关阅读:
    JavaScript递归方法 生成 json tree 树形结构数据
    分布式系统唯一ID生成方案汇总
    Twitter-Snowflake,64位自增ID算法详解
    手机端页面自适应解决方案—rem布局
    vue.js之路由
    kafka数据迁移实践
    mysql查询时强制区分大小写
    js加密参数传给后台,后台解密base64
    Target runtime com.genuitec.runtime.generic.jee60 is not defined
    怎么在点击浏览器前进、后退键时刷新页面而不读取缓存
  • 原文地址:https://www.cnblogs.com/Alexephor/p/11260533.html
Copyright © 2011-2022 走看看