Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中开发时保护MySQL密码?_Python_Mysql - Fatal编程技术网

在Python中开发时保护MySQL密码?

在Python中开发时保护MySQL密码?,python,mysql,Python,Mysql,我正在编写一个Python脚本,它使用本地托管的MySQL数据库。该程序将作为源代码交付。因此,MySQL密码将对裸眼可见。有什么好办法来保护它吗 这个想法是为了防止一些淘气的人查看源代码,直接访问MySQL,然后做一些事情。。。好吧,淘气。要么使用简单的密码,比如root。要么不要使用密码。在这种情况下,我在my.my.cnf中创建了一个新的部分,比如 [files] host=127.0.0.1 port=3307 database=files default-character-set=u

我正在编写一个Python脚本,它使用本地托管的MySQL数据库。该程序将作为源代码交付。因此,MySQL密码将对裸眼可见。有什么好办法来保护它吗


这个想法是为了防止一些淘气的人查看源代码,直接访问MySQL,然后做一些事情。。。好吧,淘气。

要么使用简单的密码,比如
root
。要么不要使用密码。

在这种情况下,我在my.my.cnf中创建了一个新的部分,比如

[files]
host=127.0.0.1
port=3307
database=files
default-character-set=utf8
password=foobar
并在数据库初始化时使用它

d=MySQLdb.connect(
    read_default_group='files',
    port=0,  # read from .my.cnf
    db='files',
    cursorclass=cursors.DictCursor,
    # amongst other stuff
)
简短回答 你不能

如果密码存储在发送给最终用户的工件中,您必须考虑它被破坏了!即使工件是已编译的二进制文件,也总是有(或多或少复杂的)获取密码的方法

保护资源的唯一方法是只向最终用户公开有限的API。构建一个编程API(REST、WS+SOAP、RMI、JavaEE+Servlets等),或者通过存储过程仅公开数据库中的某些功能(见下文)

有些事情先。。。 这里的问题不应该是如何隐藏密码,而是如何保护数据库。请记住,仅密码通常是非常弱的保护,不应将其视为保护数据库的唯一机制。您正在使用SSL吗?不那么,即使您设法在应用程序代码中隐藏密码,在网络上嗅探它仍然很容易

你有多种选择。所有这些都具有不同程度的安全性:

“应用程序角色” 为应用程序创建一个数据库用户。为此角色应用授权。一个非常常见的设置是只允许CRUD操作

赞成的意见
  • 非常容易设置
  • 防止
    删除
    查询(例如,在SQL注入中?)
欺骗
  • 每个看到密码的人都可以访问数据库中的所有数据。即使该数据通常隐藏在应用程序中
  • 如果密码被泄露,用户可以无条件地运行
    UPDATE
    DELETE
    查询(即:一次删除/更新整个表)
原子认证&auth 为每个应用程序/最终用户创建一个数据库用户。这允许您甚至在每列的基础上定义原子访问权限。例如:用户X只能从表foo中选择far和baz列。没有别的了。但是用户Y可以
选择所有内容,但不进行更新,而用户Z拥有完整的CRUD(选择、插入、更新、删除)访问权限

某些数据库允许您重用操作系统级凭据。这使得对用户的身份验证变得透明(只需要登录到工作站,然后该身份就被转发到数据库)。这在完整的MS堆栈(OS=Windows,Auth=ActiveDirectory,DB=MSSQL)中最容易实现,但据我所知,在其他DBs中也可以实现

赞成的意见
  • 设置起来相当容易
  • 非常原子的授权方案
欺骗
  • 在数据库中设置所有访问权限可能会很繁琐
  • 拥有
    UPDATE
    DELETE
    权限的用户仍然可以意外地(或有意地)删除/更新而无需任何条件。您可能会丢失表中的所有数据
具有原子身份验证的存储过程&auth 在应用程序中不写SQL查询。通过存储过程运行所有内容。然后为每个用户创建db帐户,并仅为存储过程分配权限

赞成的意见
  • 最有效的保护机制
  • 存储过程可以强制用户向每个查询传递条件(包括
    DELETE
    UPDATE
欺骗
  • 不确定这是否适用于MySQL(我在这方面的知识很薄弱)
  • 复杂的开发周期:您想做的一切,必须首先在存储过程中定义
最后的想法 决不允许将数据库管理任务添加到应用程序中。大多数情况下,应用程序需要的唯一操作是
SELECT
INSERT
DELETE
UPDATE
。如果遵循此指导原则,用户发现密码几乎不会有风险。除了上面提到的几点


在任何情况下,都要保留备份。我假设您希望针对意外删除或更新对数据库进行投影。但是意外发生了。。。记住这一点;)

这里有一个类似的未回答的问题:python DBAPI()没有接口,无法使用加密/哈希密码(而不是明文密码)连接到数据库

虽然这项功能在其他语言中是令人欣慰的,但它并没有提供任何真正的额外安全性:密码的散列和密码一样好。作为exhuma,您仍然必须控制对数据库资源的访问

MySQL本身不提供任何附加选项,无论是否使用python绑定。您可以在MySQL用户手册一节中阅读他们的指南,其中介绍了保护密码访问的建议选项,即将密码存储在选项文件中并保护该文件,如GLGL所述

从该页:

运行客户端时可用于指定密码的方法 此处列出了项目以及风险评估 每种方法。简言之,最安全的方法是让客户 程序提示输入密码或在 正确保护选项文件


在中心位置进行定义并在发货前进行编辑?这将连接到您的数据库还是买方的数据库?如果没有密码,我如何防止用户更改数据库?对于特定数据库,创建一个没有密码的用户,对于其他数据库,创建一个不同的用户和密码,这是正确的,但它并没有与源代码一起分发。但可能是我误解了询问者最初的动机——我认为他想防止意外地分发其中包含的密码