如何确保我的Python中的AJAX请求始源于同一服务器

2024-04-29 10:30:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经在这里问了一个关于IP身份验证的问题:TastyPie Authentication from the same server

但是,我需要更多的东西!IP地址很容易被欺骗。在

enter image description here

场景:我的API(Tastype)和客户端应用程序(javascript)在同一个服务器/站点/域上。我的用户无法登录。我想在javascript客户端使用我的API。在

问题:如何确保(身份验证)AJAX请求来自同一个服务器?在

我用的是Tatypie。我需要验证来自客户端的请求是在同一个服务器/域上发出的。我不能使用“登录会话”,因为我的用户没有登录。

我已经研究过私钥和生成签名,但它们可以在javascript中查看,使该方法不安全。如果我这样做是为了从服务器请求签名(在某些python代码中隐藏私钥),那么任何人都可以对get_signature发出与我的javascript相同的http请求,从而使这一点落空。在

example get signature

我还尝试让Django视图将签名放在视图中,从而消除了进行get_signature调用的需要。这是安全的,但这意味着我现在必须刷新页面,以获得新的签名。从用户的角度来看,只有对API的第一次调用才有效,之后他们需要刷新,这也是毫无意义的。在

using Django for the signature

我不敢相信我是唯一有这个要求的人。我相信这是一种常见的情况。请帮助:)我们也欢迎在Tastype中使用自定义身份验证的示例。在

谢谢

添加:


Tags: 用户fromip服务器身份验证视图api客户端
3条回答

如果它是完全相同的服务器,您可以根据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?嗯,机器人,机器人,爬虫和客户端属于同一类吗?还是我错了?这很容易被利用,如果你真的想保护它。在

I cannot believe I'm the only person with this requirement.

也许不是,但正如您所见,您的API容易受到几次攻击,这可能是有人不共享您的设计并使auth的安全性更严格的原因。在

编辑

既然我们讨论的是AJAX请求,那么IP部分与此有什么关系?IP将始终是客户的IP!所以,你可能需要一个公共API。。。在

  • 我将使用令牌/会话/cookie部分。

  • 我将使用一个生成的令牌,该令牌可以持续一段时间,并使用下面描述的流。

  • 每隔一段时间我会用限制器,like Github does。例如每个ip每小时请求60个或更多个请求registered users

为了克服刷新令牌的问题,我只需执行以下操作:

  1. 客户访问现场

    ->服务器生成API令牌初始化

    ->客户端获取API令牌INIT,该令牌仅对启动1个请求有效。

  2. 客户端向API发出AJAX请求

    ->客户端使用API令牌初始化

    ->服务器检查API令牌初始化和限制

    ->服务器接受请求

    ->服务器传回API令牌

    ->客户端使用响应数据并存储API令牌以供进一步使用(将通过JS存储在浏览器内存中)

  3. 客户机在有限的时间或请求量内启动与API的通信。请注意,您还知道init token日期,因此您可以使用它来检查页面上的第一次访问。

当客户端访问时,第一个令牌通过服务器生成。 然后,客户机使用该令牌来获得一个真正的令牌,该令牌将持续一段时间或其他限制。 也许有人可以限制这个网页的访问量

这样你就不需要提神了。在

当然,上面的场景可以简化为只有一个令牌和上面提到的时间限制。在

当然,由于您没有身份验证,所以上面的场景很容易使用高级爬虫程序等。在

当然,聪明的攻击者可以从服务器上获取令牌并重复这些步骤,但是,从一开始就已经存在这个问题。在

一些额外的分数

  • 根据提供的注释,请关闭对API的写入。如果您对自己的实现(如果不使用auth)或额外的安全性有疑问,您不希望成为DOS攻击的受害者
  • 如上所述的令牌场景也可能变得更加复杂,例如通过不断地交换令牌

仅供参考,GAE云存储使用signed_urls来达到相同的目的。在

希望有帮助。在

关于IP欺骗和防范欺骗攻击,维基百科称不会将数据包返回给攻击者:

Some upper layer protocols provide their own defense against IP spoofing attacks. For example, Transmission Control Protocol (TCP) uses sequence numbers negotiated with the remote machine to ensure that arriving packets are part of an established connection. Since the attacker normally can't see any reply packets, the sequence number must be guessed in order to hijack the connection. The poor implementation in many older operating systems and network devices, however, means that TCP sequence numbers can be predicted.

相关问题 更多 >