您已经说过您使用 HTTPS 连接来加密客户端浏览器和 Web 服务器之间的流量,并且 Web 服务器和 MySQL 实例位于同一台计算机上。
Assmuning HTTPS 连接是安全的,这应该是保护公共网络上的数据所需的全部内容,并且为仅存在于本地计算机上的连接使用安全隧道只会增加不必要的复杂性。
考虑以下示例。
首先是在没有安全隧道的情况下连接的外观。
browser <--HTTPS--> [ webserver <--> mysql ]
所以在这种情况下,webserver 和 mysql 之间的连接是未加密的。有权访问机器的人(取决于权限)将能够观察网络服务器之间的所有流量和/或从磁盘本身读取物理数据库。
现在,有了一个安全的隧道
[ webserver <--> stunnel <--ENCRYPTED--> stunnel <--> mysql ]
我希望你能看到 webserver 和一个安全隧道端点之间的连接,以及 mysql 和另一个端点之间的连接都是未加密的。在这种情况下,与以前完全相同,有权访问机器的人可能会看到所有流量并从磁盘读取数据库。
没有实现额外的安全性。
最后
[ webserver <--> stunnel ] <--ENCRYPTED--> [ stunnel <--> mysql ]
当您使用两个单独的服务器时,本地流量仍然是未加密的,但是 stunnel 可以保护两台机器之间的流。对机器具有本地访问权限的人可能仍然能够观察流量和读取数据,但是观察服务器之间的网络流量的人则不能。
一个办法?
综上所述,如果您真的想加密 PHP 和 MySQL 之间的流量,即使在同一台机器上,也存在比使用 stunnel 更好的解决方案。
MySQL 原生支持 SSL,就像 PHP 在编译时都支持 SSL 一样。(您的安装可能已经以这种方式配置,由您来检查它们)
MySQL 手册详细介绍了如何使用 SSL 支持配置 MySQL 服务器, PHP 提供了该功能mysqli_ssl_set
使用这种组合,您可以本地加密 PHP 和 mysql 服务器之间的连接。
[ webserver <--ENCRYPTYED --> mysql ]
然而,有权访问机器的人可能仍然能够从磁盘读取未加密的数据库,并且可能能够观察正在运行的进程的内存。
你说的很对,互联网是一个危险的地方,适当的安全是必不可少的。如果您的服务器本身及其包含的数据不安全,那么无论您采取何种预防措施来保护数据进入和离开的方式,一切都会丢失。