2

我有一个关于SecureStringMySql-Connector 的 as 连接字符串的一般性问题。如果我理解正确,SecureStrings这是在我的程序中存储字符串的“安全”方式。现在我有两个问题:

  1. 我必须在安装时读入密码(TextBox这是string不安全的)
  2. 我必须为 MySQL-Connector 建立一个连接字符串string(再次不安全)

例子:

MySqlConnection con = new MySqlConnection();
MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder();
builder.Add("SERVER", "loaclhost");
builder.Add("PORT", "3306");
builder.Add("DATABASE", "test_db");
builder.Add("UID", "root");
builder.Add("PASSWORD", "11235813"); //not the real password ;)
con.ConnectionString = builder.ConnectionString;
con.Open();

这让我想到了下一个问题:MySQL-Connector API 是“不安全的”,因为所有值都存储为 plaintext string

最后一个问题:有没有使用感SecureString

在我看来,我可以string在我的程序中到处使用。如果涉及到 MySQL,所有类型的加密(在我的程序中)都将毫无用处。

我的观点正确吗?还有其他方法吗?

最好的问候亚历克斯

4

1 回答 1

1

还有其他方法可以做到这一点。这取决于您认为在您的连接字符串之后会出现谁以及他们将拥有什么类型的访问权限和技能级别。无论您如何尝试隐藏它,连接字符串都在那里,某处。

知道连接字符串可能被黑客入侵,我总是假设它会被黑客入侵并在另一端采取预防措施。

我们在数据库服务器端做了几件事,以确保即使连接字符串被压缩,数据仍然是安全的。

  • 与连接字符串相关的用户在服务器上的权限几乎为零。他们拥有的唯一权限是对包含存储过程的 SCHEMA 的 EXECUTE 和 CONTROL。
  • 前端拥有的唯一访问权限是通过存储过程。我们从不允许前端发送 SQL 字符串。
  • 数据保存在与可执行文件不同的模式中,在 DATA 模式中,与连接字符串关联的用户具有零权限,他们无法查看、闻到或触摸它。
  • 存储过程将权限委派给有足够权限执行过程的非登录用户。(以“无登录用户”身份执行)

这就是我们所能做的。我们还没有找到一种方法来防止连接字符串以某种方式暴露在某个地方。

回答亚历克斯在下面提出的问题。(评论太长了)

笔记。以下是针对 MS SQL Server 的,它可能适用于其他 DBMS 系统,但我不能保证任何其他系统。

一个Database包含Schema,Schema包含Database Objects,例如表、视图、存储过程。schmea 允许您隔离数据库对象,例如,如果您有一组任何人都可以查看的表,那么他们可以进入一个 COMMON 模式,如果您有需要保护的工资单信息,您可以放入将其转换为 PAYROLL 模式。然后,您可以根据其中的对象类型在 SCHEMA 上设置不同的安全措施。从图形上看,它们看起来像硬盘驱动器上的文件夹,在它们下面是它们包含的所有数据库对象。当您启动服务器时,会自动创建几个模式。您最熟悉的是 DBO schmea。如果您的管理员已将其设置为您的默认架构,您可能不会意识到这一点。

我们所做的是将所有数据放入 DATA schmea,这意味着只允许使用表。因此,如果我们有一个工资单数据库,那么数据表将进入一个名为 dataPayroll 的模式。

存储过程是数据库服务器在调用时可以运行的一个或多个 SQL 代码块。它可以返回数据表或单个值。将其视为 C# 中的一种方法。

存储过程具有 SQL 代码中使用的输入和返回参数。参数化存储过程是对 SQL 注入攻击的强大防御。

我们的协议说存储过程和视图都存储在一个以“prog”开头的模式中。因此,在工资单数据库的情况下,所有不是数据的对象都在 progPayroll 模式中。

由连接字符串定义的用户仅对“prog”架构具有控制和执行权限。这允许他们调用存储过程。连接字符串定义的用户被拒绝所有其他权限。该用户在其他任何地方也被拒绝所有权限。在存储过程中,访问数据的权限被委派给 NO LOGIN 用户,该用户有权使用 EXECUTE AS 命令从“数据”模式中检索数据。

前端没有sql。所有前端程序员都知道存储过程的名称、参数以及返回类型和值。

这样,即使攻击者设法从您的程序中挑出连接字符串,他们仍然需要做很多工作才能对您的数据库执行任何操作,因为他们拥有的用户只能执行存储过程。

如果您不知道这些东西是什么,那么您真的需要让数据库程序员为您设置系统。

于 2013-08-09T15:51:41.780 回答