zoukankan      html  css  js  c++  java
  • 158.Clickjacking点击劫持攻击实现和防御措施

    clickjacking攻击:

    clickjacking攻击又称为点击劫持攻击,是一种在网页中将恶意代码等隐藏在看似无害的内容(如按钮)之下,并诱使用户点击的手段。

    clickjacking攻击场景:

    用户进入到一个网页中,里面包含了一个按钮(查看照片),但是这个按钮上面加载了一个透明的iframe标签,这个iframe标签加载了另外一个网页,并且他将这个网页的某个按钮和网页中的按钮(查看照片)重合,所以你在点击按钮(查看照片的时候)实际上点的是通过iframe加载的另外一个网页的按钮,比如我现在有一个csdn的用户账号,现在想要用户点击关注。那么我们就可以准备以下页面:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Clickjacking</title>
        <style>
            iframe {
                 100%;
                height: 100%;
                display: block;
                position: absolute;  /*指定iframe和button为绝对定位*/
                z-index: 20;  /*指定在垂直方向上的高低*/
                opacity: 0.01;
                /*指定透明度*/
                <!--注意,iframe的透明度不能设置为0,如果设置为0的话,就不能接受任何的点击事件了-->
            }
            button {
                position: absolute;
                left: 40px;
                top: 65px;
                z-index: 10;
            }
        </style>
    </head>
    <body>
    <h2>哇塞,这张照片里怎么会有我!快来看看有没有你吧!</h2>
    <button>查看照片</button>
    <iframe src="https://blog.csdn.net/zjy123078_zjy/" frameborder="0"></iframe>
    </body>
    </html>
    
    clickjacking防御:我们可以设置我们的网页不允许使用iframe被加载到其他网页中就可以避免这种情况了,我们可以通过在响应头中设置X-Frame-Options来设置这种操作,X-Frame-Options可以设置以下三个值:
    (1)DEBY:不允许任何网页使用iframe加载我这个页面。
    (2)SAMEORIGIN:只允许在相同域名(也就是自己的网站)下使用iframe加载这个页面。
    (3)ALLOWED-FROM origin: 允许任何网页通过iframe加载我这个网页。
    在Django中,使用中间件django.middleware.clickjacking.XFrameOptionsMiddleware可以帮我们堵上这个漏洞,这个中间件设置了一个X-Frame-Option为DENY,也就是不允许任何网页使用iframe加载这个网页,这样就可以避免其他的别有用心的网页去通过iframe加载了。

    我们可以查看一下网页源代码,如下:

    class XFrameOptionsMiddleware(MiddlewareMixin):
        """
        Set the X-Frame-Options HTTP header in HTTP responses.
    
        Do not set the header if it's already set or if the response contains
        a xframe_options_exempt value set to True.
    
        By default, set the X-Frame-Options header to 'SAMEORIGIN', meaning the
        response can only be loaded on a frame within the same site. To prevent the
        response from being loaded in a frame in any site, set X_FRAME_OPTIONS in
        your project's Django settings to 'DENY'.
        """
        def process_response(self, request, response):
            # Don't set it if it's already in the response
            if response.get('X-Frame-Options') is not None:
                return response
    
            # Don't set it if they used @xframe_options_exempt
            if getattr(response, 'xframe_options_exempt', False):
                return response
    
            response['X-Frame-Options'] = self.get_xframe_options_value(request,
                                                                        response)
            return response
    
        def get_xframe_options_value(self, request, response):
            """
            Get the value to set for the X_FRAME_OPTIONS header. Use the value from
            the X_FRAME_OPTIONS setting, or 'DENY' if not set.
    
            This method can be overridden if needed, allowing it to vary based on
            the request or response.
            """
            return getattr(settings, 'X_FRAME_OPTIONS', 'DENY').upper()
    
    
    所以,在我们使用django创建项目的时候,默认的情况下,Django就会默认的帮我们定义一个处理“点击劫持攻击”的中间件,默认情况下就是开启的。
    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    senlin __init__() got an unexpected keyword argument 'additional_headers'
    Delphi 全局画点TCanvas.Pixels[X,Y]
    sql server 列修改null 变成not null
    Delphi记录record中的变体
    delphi无边框可拖动窗体
    bootstrap相关资料
    重装windows导致grub损坏
    RabbitMQ的安装(Docker安装)
    RabbitMQ的安装以及使用(Windows环境)
    如果安装rabittmq后,输入http://localhost:15672不出页面的
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12348070.html
Copyright © 2011-2022 走看看