我已经在这里问了一个关于IP身份验证的问题:TastyPie Authentication from the same server
但是,我需要更多的东西!IP地址很容易被欺骗。在
场景:我的API(Tastype)和客户端应用程序(javascript)在同一个服务器/站点/域上。我的用户无法登录。我想在javascript客户端使用我的API。在
问题:如何确保(身份验证)AJAX请求来自同一个服务器?在
我用的是Tatypie。我需要验证来自客户端的请求是在同一个服务器/域上发出的。我不能使用“登录会话”,因为我的用户没有登录。
我已经研究过私钥和生成签名,但它们可以在javascript中查看,使该方法不安全。如果我这样做是为了从服务器请求签名(在某些python代码中隐藏私钥),那么任何人都可以对get_signature
发出与我的javascript相同的http请求,从而使这一点落空。在
我还尝试让Django视图将签名放在视图中,从而消除了进行get_signature调用的需要。这是安全的,但这意味着我现在必须刷新页面,以获得新的签名。从用户的角度来看,只有对API的第一次调用才有效,之后他们需要刷新,这也是毫无意义的。在
我不敢相信我是唯一有这个要求的人。我相信这是一种常见的情况。请帮助:)我们也欢迎在Tastype中使用自定义身份验证的示例。在
谢谢
添加:
如果它是完全相同的服务器,您可以根据127.0.0.1或localhost验证请求。在
否则,解决方案可能是在网络级别,有一个单独的专用子网,您可以检查。如果攻击者不在您的子网中,就很难欺骗您的子网。在
我想你有点糊涂了(或者我是,请纠正我)。JS代码与API发布在同一服务器上并不意味着AJAX请求将来自服务器。客户机从您的服务器下载JS并执行它,这会导致从客户机而不是从同一个服务器向您的API发送请求。在
现在,如果上面的场景正确地描述了您的情况,那么您可能要做的是保护您的API不受{a1}的影响。最简单的保护是CAPTCHA,你可以在Wiki页面上找到更多的想法。在
如果您担心其他站点可能会调用您的API来复制您的站点功能,那么您不应该这样做——AJAX请求只能作为JS正在运行的页面发送to the same server,除非它是JSONP。在
根据您的基础设施,@dragonx的答案可能会让您最感兴趣。在
我的2c
你想确保只有当客户访问你的网站时才能使用api?嗯,机器人,机器人,爬虫和客户端属于同一类吗?还是我错了?这很容易被利用,如果你真的想保护它。在
也许不是,但正如您所见,您的API容易受到几次攻击,这可能是有人不共享您的设计并使auth的安全性更严格的原因。在
编辑
既然我们讨论的是AJAX请求,那么IP部分与此有什么关系?IP将始终是客户的IP!所以,你可能需要一个公共API。。。在
我将使用令牌/会话/cookie部分。
我将使用一个生成的令牌,该令牌可以持续一段时间,并使用下面描述的流。
每隔一段时间我会用限制器,like Github does。例如每个ip每小时请求60个或更多个请求registered users
为了克服刷新令牌的问题,我只需执行以下操作:
客户访问现场
->服务器生成API令牌初始化
->客户端获取API令牌INIT,该令牌仅对启动1个请求有效。
客户端向API发出AJAX请求
->客户端使用API令牌初始化
->服务器检查API令牌初始化和限制
->服务器接受请求
->服务器传回API令牌
->客户端使用响应数据并存储API令牌以供进一步使用(将通过JS存储在浏览器内存中)
客户机在有限的时间或请求量内启动与API的通信。请注意,您还知道init token日期,因此您可以使用它来检查页面上的第一次访问。
当客户端访问时,第一个令牌通过服务器生成。 然后,客户机使用该令牌来获得一个真正的令牌,该令牌将持续一段时间或其他限制。 也许有人可以限制这个网页的访问量
这样你就不需要提神了。在
当然,上面的场景可以简化为只有一个令牌和上面提到的时间限制。在
当然,由于您没有身份验证,所以上面的场景很容易使用高级爬虫程序等。在
当然,聪明的攻击者可以从服务器上获取令牌并重复这些步骤,但是,从一开始就已经存在这个问题。在
一些额外的分数
仅供参考,GAE云存储使用signed_urls来达到相同的目的。在
希望有帮助。在
关于IP欺骗和防范欺骗攻击,维基百科称不会将数据包返回给攻击者:
相关问题 更多 >
编程相关推荐