【问题标题】:what is a good solution for cross domain access?什么是跨域访问的好解决方案?
【发布时间】:2016-10-10 18:52:26
【问题描述】:

提供跨域访问最安全的方式是什么? 有什么取舍?

我知道我们可以设置跨源访问标头,但这需要我的服务器事先知道服务器列表。

【问题讨论】:

  • 为什么投反对票?如果您要投反对票,请至少发表评论
  • 同意。至少让你回到零。您的问题可能非常广泛。回答它可以一直继续……
  • 这也是相当基于意见的。它还完成了大约 0 项研究。
  • 你在说什么意见?我要求取舍,这不是意见。这些都是事实。你对这些取舍所做的就是意见。只有几种不同的方法可以做到这一点——简单的谷歌搜索告诉我。此处无需赘述。

标签: cross-domain


【解决方案1】:

您不需要事先知道服务器列表,因为您可以设置Access-Control-Allow-Origin: *,但这并不安全,因为它允许其他站点使用您的服务。因此,请确保在构建标头时允许来自受限列表的 Access-Control-Allow-Origin。我只是使用正则表达式进行比较,因为我们允许来自多个。当我验证是否存在匹配时,我将请求来源返回到标头中。因此,如果我匹配web.*energydomain.com 之类的东西并且来源是webservices.energydomain.com,那么我会传回Access-Control-Allow-Origin: webservices.energydomain.com 这告诉调用服务(以及任何收听的人)我从这个来源接受并且只接受这个来源,即使我可能从 webstart.energydomain.com 接受。

所以我们使用 spring 创建了一个过滤器。

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CORSFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        response.setHeader("Access-Control-Allow-Credentials", "true")

        //If this is a pre-flight request, make sure that we are allowing them
        if ("OPTIONS" == request.method) {
            response.setHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS")
            response.setHeader("Access-Control-Max-Age", "604800")
            response.setHeader("Access-Control-Allow-Headers", "Authorization, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Allow-Origin, Vary, Cookie, Key")

            //Check to see that the referrer/origin matches the set of allowed origins in the application configuration
            String referrer = request.getHeader("Origin")
            if (referrer?.matches(ServerProperties.instance.accessControlAllowOriginRegEx)) {
                response.setHeader("Access-Control-Allow-Origin", referrer)
            }
        } else {
            //set other headers here and continue chain (we don't bother continuing chain on preflight)
            chain.doFilter(request, response)
        }
    }

您也可以在 htaccess 上执行此操作

<FilesMatch "\.(ttf|otf|eot|woff)$">
    <IfModule mod_headers.c>
        SetEnvIf Origin "http(s)?://(www\.)?(webservices.energydomain.com|webservicesmo.energydomain.com|webservicestest.energydomain.com)$" AccessControlAllowOrigin=$0
        Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
    </IfModule>
</FilesMatch>

我更喜欢尝试减少飞行前的交通噪音并一起避免它们。特别是,我使用 xdomain。如果使用 Angular 或 jQuery,我的设置非常简单。在您的应用服务器上,按照以下链接的帮助中的说明添加 proxy.html。在您的“客户端”和中提琴上添加一些引用 js 文件的标签,不再进行预检。这包含在 iframe 中以避免需要进行 cors 检查。如上所述,您仍然可以像使用 CORS 预检一样控制原点,它只是一起避免了它们。

https://github.com/jpillora/xdomain

【讨论】:

  • 感谢您花时间回答。如果我无法访问服务器,我有什么替代方案?
  • CORS 的目的是防止跨站点脚本攻击。因此,如果您没有访问服务器的想法,那是为了阻止(或允许)您访问这些服务。
  • 这个域在概念上和easyxdm相似吗?
  • easyxdm 似乎与 xdomain 类似。我没有使用过它,但惊讶地发现它已经存在漏洞(已修复)。似乎 easyxdm 的配置少了一些,特别是没有文件,服务器端需要配置。假设我的阅读是正确的,那也很好。
  • 如果我可以访问服务器,我可以在其中添加 CORS 标头,我是否需要像 xdomain 或 easyxdm 这样的解决方案?
猜你喜欢
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2018-04-02
  • 2020-08-09
  • 2022-06-28
相关资源
最近更新 更多