移动应用程序避免或保护 CORS?
Posted
技术标签:
【中文标题】移动应用程序避免或保护 CORS?【英文标题】:Mobile App Avoiding or Securing CORS? 【发布时间】:2015-10-10 00:31:03 【问题描述】:我想知道是否有行业标准可以更好地保护移动设备上的 ajax 调用。
我的移动应用程序包含我网站的 html、js 和 css 文件,但为了提高性能,它们会在本地安装在移动设备上。移动设备的本地 index.html 然后调用我的网络服务器获取数据(在本例中为 Tomcat)。
我发现这个工作的唯一方法是在我的 servlet 中启用 CORS:
response.setContentType("text/html");
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "GET, PUT, POST, OPTIONS, DELETE");
response.addHeader("Access-Control-Allow-Headers", "Content-Type");
response.addHeader("Access-Control-Max-Age", "86400");
但老实说,出于各种原因,我不喜欢这样,但主要是 -- 现在任何东西都可以从 任何域 查询我的网络服务器并得到响应...
如何使用 CORS 从移动设备对我的网络服务器进行相同的 ajax 调用 - 但以更安全的方式仅允许我的应用访问?
** 或 ** 在这种移动情况下,CORS 是否完全不正确,是否有更标准/更理想的解决方案?
【问题讨论】:
"现在任何东西都可以在本地查询我的网络服务器并获得响应。"为什么这是一件坏事? @KevinWorkman 因为它变成了某种公共 API,所以不仅仅是我的网站可以调用它。我看错了吗? 老实说,我不知道。我不是网民。你得到了我的支持,因为我认为这是一个有趣的问题,并且想自己知道答案。话虽如此,听起来您有两个相互竞争的目标——您想要一个为自己提供的公共 API,而不是为其他人。你怕人家做什么?有没有办法解决这个问题?可能需要登录? API 密钥?限制?同样,我不知道我在说什么,但这就是为什么我问拥有公共 API 到底有什么不好。听起来您所描述的问题首先是您的全部目标,哈哈。 感谢您抽出宝贵时间,我真的很感激...是的,我想这就是我的问题 - 我可以拨打 CORS 类型的电话并保持私密。我阅读您的评论越多,我认为 API 密钥/oauth 可能是唯一的途径.. 据我所知,只有浏览器(Firefox、Chrome、IE...)在发出跨域请求之前会检查 CORS。在您的服务器上禁用 CORS 可能会阻止我在其他网站上为您的 API 创建 Web 客户端,但不会阻止我使用curl
、wget
或任何带有 http 客户端的编程语言调用它。
【参考方案1】:
CORS 是一种标准,用于指导浏览器在来自另一个域的页面尝试访问您的域时执行什么操作。
这里的关键词是浏览器。任何人都可以构造一个请求(伪造他们喜欢的任何标头,包括Origin
)来访问您的服务器。同源策略和 CORS 所依赖的是协作浏览器,它限制了外部脚本的功能。
所以这个消息是好的。由于您的代码在应用程序的私有 Web 视图中运行,因此您可能不会面临外国网站在您的视图中运行代码的风险。 (与浏览器相反,许多域在同一个浏览器中运行代码。)
因此,只要您的代码仅在应用程序上运行,CORS 就不会使您的网站比其他情况更容易受到攻击。
【讨论】:
【参考方案2】:而 OAuth 是企业/长期解决方案。 对于周末项目,
您能否考虑将方法限制为仅 GET 或少数需要的方法,并且仅提供对特定资源的访问权限?
这是我使用的一种解决方法。
我在 tomcat 上的 angular js 应用程序与一个安静的后端应用程序交互时遇到了类似的问题。
我创建了一个 java 应用程序并托管在托管 angular 的同一个 tomcat 上。这个 java 应用程序调用了后端。 后来我用 grunt 和 nodejs 替换了 tomcat/java 应用程序。效果很好。
nodejs,中继请求是 4 行代码 :-)
【讨论】:
以上是关于移动应用程序避免或保护 CORS?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SiteMinder 受保护的环境中处理 CORS 预检请求?