【问题标题】:Make socket accept requests only from specific clients使套接字仅接受来自特定客户端的请求
【发布时间】:2020-07-18 20:35:06
【问题描述】:

我有一个服务器来处理从客户端到 sql 数据库的请求。服务器接受请求并以 json 格式给出响应。我已经为服务器和客户端编写了代码,一切正常。虽然这仅适用于内部工具,但我担心有些人可能会尝试绕过客户端并将自己的 json 消息发送到服务器,以潜在地操纵 sql 数据库上的数据。

我不是安全专家,所以这是我的问题。确保服务器只接受来自我编写的客户端的请求的正确方法是什么,而不管它运行的机器或 IP 是什么?

我最初的想法是我应该加密服务器和客户端之间的消息,因此如果有人试图欺骗与未经授权的客户端的连接,他们将无法进行适当的加密。我也意识到我应该在服务器端进行身份验证,但这意味着传递凭据,因此无论如何都应该对消息进行加密。如果有更可接受的方式来做到这一点,我很想知道。如果没有,将不胜感激教程的链接。

正如标签所述,这是在 c++ 中的 linux 上。虽然我确信那里可能有一些开源库可以完全满足我的所有需求,但我对于我可以实际使用的库非常有限。

谢谢!

【问题讨论】:

  • 如果您担心安全问题并且无法使用安全库,最好的办法是获得安全领域的硕士学位或找到具有同等学历的人。除此之外,Boost.Asio 内置了 SSL。
  • 你的服务器是公开的?还是仅在您的本地网络中使用?
  • @Landstalker 服务器仅用于本地网络
  • 您应该限制人们可以做什么,而不是他们如何做。前者可以提供真正的安全性,后者真的不能。只要服务器/客户端协议不允许用户做任何他们不应该做的事情,你为什么要关心他们使用什么客户端呢?在服务器中实现安全性。

标签: c++ linux sockets encryption


【解决方案1】:

保护网络通信的事实标准是TLS(传输层安全)。它对 TCP 流进行加密和签名,而无需在网络上实际交换私钥。这可以防止 MITM 和重放攻击,并可以通过检查服务器和/或客户端的证书是否由受信任方 (CA) 签名或简单地预先存储其哈希值(指纹)来验证服务器和/或客户端的真实性。或者,TLS 只能用于加密流量,使用纯密码对客户端进行身份验证。

有实现 TLS 的 many 开源库。一种流行的是OpenSSL

【讨论】:

  • 我对用于服务器身份验证的 TLS 有点熟悉,但听起来它也可以用于客户端身份验证?那听起来确实像我想要的。我正在阅读它,但没有看到提到的那一点。我会更深入地研究它。
【解决方案2】:

我向您介绍一些较低级别的过滤和保护措施,这些措施将补充其他软件措施(TLS、SSL、...)
由于服务器是本地的,因此只能由本地客户端访问。这允许您通过以下方式应用过滤:

  • IP 地址
    当客户端连接时(在您的服务器的accept() 功能上),您有一个结构表明您的客户端的IP address。如果 IP 地址不在授权 IP 地址列表中,您可以拒绝

  • 主机名
    如果激活了 DHCP,您可以使用nslookup 命令获取主机名(机器名称)。您可以拒绝来自不属于您的受信任列表的主机名的连接。

nslookup xxx.yyy.zzz.www  // Give you the hosname of adresse  

  • Mac 地址
    使用arp,可以获得客户端网卡的MAC地址(物理)。如果它的 MAC 地址不属于您的信任列表,您可以拒绝它。
arp -a  

备注

  • 这需要您明确管理以下信任列表:IP 地址、MAC、主机名...
  • 我提醒一下,这些措施只能在本地网络上应用,并且可以作为其他软件安全协议的补充应用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2014-03-02
    • 2017-11-05
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多