我们如何限制对特定客户端计算机的Web服务访问?

我们有一个Web应用程序(Apache / PHP),目前使用用户名/密码authentication,目前可以从任何地方访问。 它启用了服务器端SSL。

我们的客户端程序是我们修改和更名的FireFox版本。 这个修改后的Firefox客户端仅用于连接到我们的Web应用程序服务器。 用户必须使用此客户端程序连接到Web服务。

除了用户身份validation之外,我们还希望在服务器级别阻止任何不使用我们的客户端程序*的人访问。 因此,如果用户使用普通浏览器inputURI,他们将被彻底拒绝。

要做到这一点,客户端程序需要向服务器标识自己,以便服务器知道我们的客户端程序正在使用,而不是Web浏览器或机器人。

*真正的目标是在能够尝试login之前确保他们是我们公司的授权员工,将这个“就业certificate”embedded到客户端程序中似乎是最简单的方法,因为应用程序是只有给需要使用它的人

到目前为止,我已经对如何实现这一点有了一些想法。

1.)在客户端进行login(login由chrome / XUL接口处理)时,将tolkenembedded到发送的客户端应用程序中。 这不会在服务器级别阻塞,只是在应用程序级别。 密钥可以像密码一样容易地被窃取,但是不会像蛮力那样容易地被猜出,因为它可能是任何长度或复杂性。

在所有请求中,在客户端浏览器标题中添加一个特殊的tolken参数。 这更像是安全通过默默无闻,但肯定会减慢攻击者试图暴力强制密码,如果login总是失败(即使使用正确的密码),当魔术string从请求中丢失..

2.)将客户端SSL证书embedded到客户端程序中。 这看起来可能是一个很好的解决scheme,但是cleint端的SSL文档几乎不存在。 我们不希望为每个用户签署一个证书,也不希望用户必须创build一个证书,或者根本不用担心安全对话。 私钥必须embedded到浏览器中,并且将成为所有客户端程序共享的一个密钥,并在我们的自定义浏览器中分发。

3.)检查用户代理string。 我认为Apache可以基于此来限制。 但这似乎是一个弱项措施。 除了其他措施,我可能会这样做。

我希望更好的想法如何做到这一点?

使用修改的浏览器包括客户端SSL证书将是最简单的,可能更安全。

如果你使用相同的密钥给每个人,你就会失去很多客户端证书的优点,但是比检查useragent更好。 而且我假设你仍然需要用户名和密码login。

你有没有想过VPN? 这听起来像你真正想要的。