如何在Python中保护mysqldb连接?
我正在创建一个使用pygtk的应用程序,需要从远程数据库连接到mysql。
db = MySQLdb.connect("remotehost","username","password","databse", charset='utf8')
这个应用程序快完成了,准备发布了。但是问题是,如果有人反编译这个脚本,他们就能轻松看到上面的数据库连接信息,这样就会有安全隐患。那么,我该如何保护这段代码呢?或者有没有什么方法可以让这个文件更安全地编译?
5 个回答
把程序的逻辑分开是非常重要的,正如芯片所说,用户的凭证(比如密码)不需要存放在用户的电脑上。
建立一个数据库和应用程序之间的接口。只有这个接口可以真正访问数据库。
给应用程序提供访问这个接口的权限,而不是直接访问数据库,然后让这个接口去和数据库进行交互。这样做可以增加一层安全性,帮助保护数据库的完整性。
将来开发时,从一开始就要分开逻辑。应用程序不需要直接访问数据库,而是需要从数据库获取数据。
另外,作为数据库安全的一条原则,尽量避免在客户端存放访问权限。如果你有 n 个应用程序,那么这 n 个应用程序都能访问你的数据库,而控制这些访问点是数据库逻辑的重要部分。
没有什么特别好的方法来保护你的代码,但你可以在使用 connect
时,利用 read_default_file
选项。这样,连接所需的参数就会从你指定的文件中读取,文件是通过 read_default_file
来指定的。
注意:这并不能真正保护你的用户名和密码,因为任何能访问这个配置文件的人都能获取到这些信息。
没有办法保护你的代码(无论是编译过的还是没编译的)不被运行它的机器的拥有者访问。
在这种情况下,机器的拥有者实际上会拥有和你应用程序的SQL用户一样的访问权限。
数据库连接通常是在可信的计算机和可信的网络之间建立的,原因有很多:
- 正如你所看到的,客户端需要存储访问数据库的凭证。
- 大多数情况下,这种连接没有传输安全性(也就是没有加密),所以任何窃听者都可以看到并篡改请求和响应。
- 到数据库的延迟通常是个问题,因此你希望尽量减少延迟,所以客户端应该靠近数据库。
如果违反了这个常规做法,你就得面对这些问题。
很常见的做法是使用中间服务,通过其他协议(比如HTTP/REST)来提供一个API,这个API是间接修改数据库的。你把这个服务放在你的可信计算基础上,只有那一台主机可以访问数据库。在这种架构下,你可以(也应该)在中间服务中进行身份验证和强制访问控制。同时,为每个访问该服务的客户端设置不同的凭证会帮助保持安全。
如果此时你无法重写你的应用程序,你应该遵循patriciasz的建议,尽量保持最小权限。你可能还会对一些技术感兴趣,这些技术可以让获取凭证变得更困难(但不是不可能)