我正在编写一个使用MySQL数据库的Python脚本,该数据库是本地托管的.该程序将作为源代码提供.因此,裸眼可以看到MySQL密码.有保护这个的好方法吗?
这个想法是为了防止一些顽皮的人查看源代码,直接访问MySQL,做一些事情......好吧,顽皮.
exh*_*uma 14
你不能.
如果密码存储在发送给最终用户的工件中,则必须考虑将其泄露!即使工件是编译的二进制文件,也总是(或多或少)复杂的方法来获取密码.
保护资源的唯一方法是仅向最终用户公开有限的API.构建程序化API(REST,WS + SOAP,RMI,JavaEE + Servlets,...)或仅通过SPROC公开数据库中的某些功能(见下文).
这里的问题不应该是如何隐藏密码,而是如何保护数据库.请记住,密码通常只是一种非常弱的保护,不应被视为保护数据库的唯一机制.你在使用SSL吗?没有?好吧,那么即使当你设法隐藏在应用程序代码的密码,它仍然很容易嗅出它在网络上!
你有多种选择.所有都具有不同程度的安全性:
为应用程序创建一个数据库用户.为此角色申请授权.一个非常常见的设置是仅允许CRUD操作.
DROP查询(f.ex.在SQL注入?)UPDATE和DELETE查询(即:一次删除/更新整个表).为每个应用程序/最终用户创建一个数据库用户.这允许您甚至在每列的基础上定义原子访问权限.例如:用户X只能选择远离表foo的列和baz.没有别的.但是用户Y可以进行SELECT所有操作,但无需更新,而用户Z具有完整的CRUD(选择,插入,更新,删除)访问权限.
某些数据库允许您重用操作系统级凭据.这使得对用户的身份验证透明(只需要登录到工作站,然后将该身份转发到数据库).这在完整的MS堆栈(OS = Windows,Auth = ActiveDirectory,DB = MSSQL)中最容易实现,但据我所知 - 也可以在其他DB中实现.
UPDATE和DELETE权限的用户仍然可以在没有条件的情况下意外(或故意?)删除/更新.您可能会丢失表中的所有数据.在您的应用程序中不写入SQL查询.通过SPROC 运行一切.然后为每个用户创建db-accounts,并仅为 SPROC分配权限.
DELETE和UPDATE)您永远不应该允许应用程序的数据库管理任务.在大多数情况下,唯一的操作的应用需求SELECT,INSERT,DELETE和UPDATE.如果您遵循此指南,用户几乎不会发现密码.除了上面提到的要点.
无论如何,请保持备份.我假设您希望为数据库预测意外删除或更新.但事故发生了......记住这一点;)
在这种情况下,我在.my.cnf中创建了一个新的部分,就像
[files]
host=127.0.0.1
port=3307
database=files
default-character-set=utf8
password=foobar
Run Code Online (Sandbox Code Playgroud)
并在数据库初始化时使用它
d=MySQLdb.connect(
read_default_group='files',
port=0, # read from .my.cnf
db='files',
cursorclass=cursors.DictCursor,
# amongst other stuff
)
Run Code Online (Sandbox Code Playgroud)