zoukankan      html  css  js  c++  java
  • django添加跨域头

    一、简介

    一、什么是跨域

    浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域

    二、浏览器的同源策略

    同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制

    三、同源的定义

    如果两个页面的协议,端口(如果有指定)和主机都相同,则两个页面具有相同的。我们也可以把它称为“协议/主机/端口 tuple”,或简单地叫做“tuple". ("tuple" ,“元”,是指一些事物组合在一起形成一个整体,比如(1,2)叫二元,(1,2,3)叫三元)

     下表给出了相对http://store.company.com/dir/page.html同源检测的示例:

    URL结果原因
    http://store.company.com/dir2/other.html 成功  只有路径不同
    http://store.company.com/dir/inner/another.html 成功  只有路径不同
    https://store.company.com/secure.html 失败 不同协议 ( https和http )
    http://store.company.com:81/dir/etc.html 失败 不同端口 ( http:// 80是默认的)
    http://news.company.com/dir/other.html 失败 不同域名 ( news和store )

    四、如何允许跨源访问

    使用 CORS 允许跨源访问 

    五、如何阻止跨源访问

    • 阻止跨域写操作,只要检测请求中的一个不可测的标记(CSRF token)即可,这个标记被称为Cross-Site Request Forgery (CSRF) 标记。必须使用这个标记来阻止页面的跨站读操作。
    • 阻止资源的跨站读取,需要保证该资源是不可嵌入的。阻止嵌入行为是必须的,因为嵌入资源通常向其暴露信息。
    • 阻止跨站嵌入,需要确保你的资源不能是以上列出的可嵌入资源格式。多数情况下浏览器都不会遵守 Conten-Type 消息头。例如,如果您在HTML文档中指定 <script> 标记,则浏览器将尝试将HTML解析为JavaScript。 当您的资源不是您网站的入口点时,您还可以使用CSRF令牌来防止嵌入。

    二、使用

    一、通过django中间件进行添加跨域头

    创建中间件文件core.py

    from django.middleware.common import CommonMiddleware
    
    class MiddlewareMixin:
        def __init__(self, get_response=None):
            self.get_response = get_response
            super().__init__()
    
        def __call__(self, request):
            response = None
            if hasattr(self, 'process_request'):
                response = self.process_request(request)
            response = response or self.get_response(request)
            if hasattr(self, 'process_response'):
                response = self.process_response(request, response)
            return response
    
    
    class CORSMiddleware(MiddlewareMixin):
    
        def process_response(self, request, response):
            # 添加响应头
            response["Access-Control-Allow-Origin"] = "*"
    
            # 允许携带Content-Type请求头
            # response["Access-Control-Allow-Headers"] = "Content-Type"
    
            # 允许请求的方法
            # response["Access-Control-Allow-Methods"] = "DELETE,PUT,POST"
    
            return response

    settings.py添加中间件

    MIDDLEWARE = [
        .......
        "app_name.cors.CORSMiddleware",
    ]

    通过添加中间件,当前端通过ajax发送请求时(GET、POST),前端即可收到api返回的数据。

    本文参考https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy

  • 相关阅读:
    中国大概能用的NTPserver地址
    在asp.net mvc中使用PartialView返回部分HTML段
    我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
    素数推断算法(高效率)
    No matching code signing identity found
    Android Bundle类
    D3D 练习小框架
    Python标准库:内置函数dict(iterable, **kwarg)
    微凉大大,教你一步一步在linux中正确的安装Xcache加速php。
    背景图片定位
  • 原文地址:https://www.cnblogs.com/ttyypjt/p/10999449.html
Copyright © 2011-2022 走看看