关于python-flask的request.remote_addr有什么缺陷吗?或者它是否可靠(没有反向代理)

时间:2017-11-11 02:18:13

标签: python security flask

Gooday to All,我写下了一个非常敏感的Web应用程序,其功能类似于文件浏览器,而不是使用sftp / ftp或ssh。它纯粹使用http / https。我使用request.remote_addr来确定客户端的IP地址。如果ip不在列表中,则拒绝。

good_ips = ['127.0.0.1','192.168.1.10','192.168.1.1']
if request.remote_addr in good_ips:
   pass
else:
   sys.exit()

它工作正常,但我想问一下这是多么可靠和安全:)。

如果ip不在列表中,这将是结果。另外,该网站运行良好:D。

谢谢你,美好的一天! Result if ip is not in the list

2 个答案:

答案 0 :(得分:0)

不,这不足以建立一个敏感的"在您使用它时提供服务。

请参阅https://en.wikipedia.org/wiki/IP_address_spoofing,了解可能出现的问题。

您应该使用身份验证,例如使用公钥(SSH支持)或密码。 Kerberos也是一种可能性。

答案 1 :(得分:0)

源IP过滤是否适合您,取决于您的确切方案,威胁模型。 @JohnZwinck是正确的,它本身通常是不够的,但对于某些应用程序,它可以是。

虽然在单个IP数据包中伪造源IP很容易,但http会超过tcp,并且tcp的现代实现可以防止地址欺骗。较旧的TCP实现(在较旧的操作系统中)易受攻击。因此,如果您的服务器具有最新的操作系统,则欺骗源IP并不是一件容易的事。使用允许列表中的地址来破坏客户端可能更容易。

另一个可能出错的事情是网络地址转换(nat)。假设您将应用程序中的访问限制为内部IP地址(192.168.0.0/24)。一切正常,但您的安全部门决定需要为所有Web应用程序提供反向代理。部署代理,一切正常。但是,现在您的应用程序收到来自代理wuth内部地址的所有请求,因此应用程序中的限制不再具有太大意义。客户端也可能发生类似事情,在某些情况下,客户端可能会落后于nat,这意味着它们都将具有相同的明显客户端IP地址 - 这可能是好事还是坏事。

最佳做法当然是进行适当的身份验证(通过密码,客户端证书或多因素等,无论您希望它是多么安全),IP限制是额外的层提供更多安全性。