我将构建2个Web API项目,这些项目将用于我们公司的其他Web /移动站点项目。
Web API调用将在首页的高流量网站上使用[例如。填写主页上的下拉列表]
所以我想要某种机制来限制仅针对我们公司项目的Web API调用,或者至少禁止某人使用我的公共Web API来创建他们的网站或任何类型的攻击[如重播]。
以下是我想到的几种方式
我想和5一起去。请告诉我你的建议。 提前谢谢。
修改 我们的网站不是https,只有ReadOnly请求。 我主要担心的是表现。我不希望复杂的安全步骤减慢我们的公共WebAPI,因为这将由我们公司内的许多Web项目调用。
答案 0 :(得分:2)
免责声明 - 做自己的研究(可能还要等待几个答案),我不是安全专家,这就是我在几分钟内想到的。
计划开放api
老实说,保存这些东西很难,你可以尽力而为,但实际上你正在谈论让任何人通过javascript访问api,你没有太多机会完全保护它。您在制作此api时做出的每个决定都应基于任何人都可以访问它的想法,除非您实施真正的身份验证方案(例如,不是自定义身份验证方案),否则不要发送任何私有数据。
如果您的数据不是那么重要,那么如果它没有得到很好的保护则无关紧要。
下一个为此工作的人可能会找到完成功能的最简单方法,当您不完全理解原始计划时,会通过更新系统来解决许多安全漏洞。
基于令牌的身份验证
允许您使用api的每个站点都会将唯一ID(guid)插入到具有源站点,客户端IP和到期日期的数据库中。根据页面的生命周期,这可能会很快到期,但会更昂贵。
当javascript访问你的api时,他们会传递这个令牌,你只需检查令牌与数据库中的ip,并确保它没有过期。
如果您可以使用某种标准形式的auth,可能会使用像ASP.NET这样的加密cookie,这样会更好。如果你是跨域的,我不相信这是可能的。
检查IP应该有助于防止中间人攻击中另一个站点试图允许用户使用你的api,这不会阻止他们自己直接使用它并用信息做任何他们喜欢的事情。
您可以尝试对您的API进行速率限制,以防止使用它的其他网站向其用户提供信息。这可以通过简单地限制您发出令牌的频率以及每个令牌允许的请求数来完成。
<强> CORS 强>
http://en.wikipedia.org/wiki/Cross-origin_resource_sharing
因为您可能正在使用跨域ajax调用,所以您可能需要查看名为CORS的内容。这将允许兼容的浏览器发出跨域请求,对于那些不支持它的人,您可能需要回退到jsonp。这还应该有助于消除支持它的浏览器中的跨站点脚本攻击。 AFAIK这是一种浏览器技术,而不是服务器技术(除了http标头),所以这也不会阻止任何不符合此规则的客户端,但它可以帮助保护您的用户。
防范CSRF
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
如果您允许更新任何数据,那么我强烈建议您考虑使用跨站点请求防伪机制。也许像MVC这样的令牌提供,你在cookie中给出一个唯一的值(来自api),并且还要求他们在他们对api发布的任何帖子中传递值。在服务器和客户端上实现都非常简单,服务器不需要在会话中存储任何内容来执行此操作,这意味着只要cookie处于活动状态就可以正常工作。这使得恶意方很难让其他人向您的api发出请求。如果您使用表单而不是ajax进行任何回发,则需要确保将令牌添加到回发值中。请记住,这不是一种身份验证方法,而是一种尝试阻止CSRF的方法。
您可以将此功能与身份验证令牌结合使用,但同样因为它依赖于发送Cookie,这可能是不可能的。
DOS攻击
另外请确保api方法不贵,以帮助停止使用大量cpu时间的DOS攻击。当然,如果有人真的想要删除你的网站,他们可能仍然会这样做,你的工作就是试图限制他们的途径。
答案 1 :(得分:0)
如果你还在寻找,你需要的是一种轻量级的消息认证方法,它将验证消息的真实性。在相当轻量级但仍然安全的算法(如SHA-1
)中使用散列键,您可以为每个请求计算哈希值,在请求之前,您将始终在服务器端进行身份验证。避免使用服务器或主机名等常量数据进行MAC-ing。相反,使用正在发送的数据的组件,以便在传输过程中进行修改时,验证将失败。有关详细步骤,请参阅this answer
5号是一个好的解决方案,但我始终强烈反对解决方案,这些解决方案取决于Web客户端对您的应用程序/ api的良好和仁慈。那里的大多数人只是想伤害你的应用程序,并且会以最小的努力伪造任何东西,包括主机/ referer http标头。