如何保护Yii应用程序的连接字符串?

6

我正在共享主机上托管一个Yii应用程序,与一些朋友共同使用,并将数据库保存在私人MySQL服务器中。正如您所知,另一个主机所有者(我的朋友和更多人)可以非常容易地在protected\config\main.php中找到数据库信息:

'db'=>array(
     'connectionString' => 'mysql:host=211.113.2.45;dbname=FamilyBook',
     'emulatePrepare' => true,
     'username' => root,
     'password' => 'xcute445',
     'charset' => 'utf8',
),

是否有方法可以隐藏连接信息,如MySQL服务器的IP、用户名和密码?

MySQL服务器是否提供RSA机制来保护数据库信息?

例如,任何人都可以看到以下内容,但无法理解或使用:

'db'=>array(
     'connectionString' => '57bf064b2166366a5ea61109006b8d5c',
     'emulatePrepare' => true,
     'username' => '63a9f0ea7bb98050796b649e85481845',
     'password' => 'e04ccf211208f8c97e4a36e584926e60',
     'charset' => 'utf8',
), // value by MD5 function, example only

2
如果“如何在我的 SQL 服务器上进行身份验证”的信息驻留在托管应用程序的服务器上,并且可以通过 Yii 访问,则拥有访问权限的每个人都可以找到该信息。无论是明文密码、哈希还是私钥,都一样。 - Pelle
1
你可以使用双向加密,类似于这样的方式。将该方法设置为静态,并将Encryption::decode(my_encoded_username)传递给 usernamepassword等参数。但是,我不确定Yii是否在配置文件中加载类。 - adamors
1
@Örs:那样做能实现什么?你需要从某个地方获取加密密钥。如果该密钥与源代码一起可访问,那么任何有源代码访问权限的人都可以解密密码。如果不行,只需将密码本身放在那里,无需涉及加密。 - Jon
2个回答

6
不,如果你使用本地MySql身份验证,那么你不能对拥有源代码访问权限的人隐藏凭据。这是因为你的代码需要将凭据以明文¹形式传递给服务器,所以在连接之前需要能够“解密”它们。拥有源代码访问权限的人也可以按照相同的过程来解密它们。
你可以通过依赖某种类型的PAM身份验证来保护你的系统,而不是依赖用户提供的凭据,但Yii不支持这样做。

¹注意:这并不是真的。客户端向服务器传递一个哈希值,但它需要访问原始密码才能进行哈希处理。这意味着对于本讨论而言,没有任何区别(对于监听网络的人来说会有区别)。


0

使用 Yii 1.x,我使用以下方法实现。

  1. 创建一个类 DbConnection,放在 protected/components 目录下,继承自 CDbConnection

    class DbConnection extends CDbConnection { public function createPdoInstance() { // Decrypt the password used in config file // e.g.: $this->password = mydecrypt($this->password); return parent::createPdoInstance(); } }
  2. 调整配置文件 (protected/config/main.php) 'db' => array( 'class' => 'DbConnection', // 使用上面的类名 'password' => 'encryptedpassword', ),


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接