3

首先,我发现了几个相似的主题,但并不能完全回答我的所有问题。

如果我使用这样的代码,我的第一个问题是:

MySqlCommand cmd = new MySqlCommand("SELECT `productnummer`, `NAAM`, `TYPE` `OMSCHRIJVING`, `Product-ID`, `Barcode` FROM `orders`.`producten` where (`productnummer` like(@variable) or `naam` like @variable or `type` like @variable or `omschrijving` like @variable or `product-id` like @variable or `barcode` like @variable) "and `uit assortiment` = 0");
cmd.Parameters.Add(new MySqlParameter("@variable", '%' + textBox1.Text + '%'));

如果我可以用 % which 定义我的 sql 变量(据我所知是一种 sql 语法),参数如何才能安全。这是否意味着如果用户输入 % 或 * 或他们自己的东西,它会起作用吗?

我的第二个问题:

MySqlCommand cmd = new MySqlCommand("SELECT `user-id` FROM `orders`.`werknemers` WHERE username = @username and `password` = @password");
            cmd.Parameters.Add(new MySqlParameter("@username", username));
            cmd.Parameters.Add(new MySqlParameter("@password", password));

如果我有一个包含用户名和密码(显然是密码哈希)的表的数据库。我的应用程序有一个文本框,用户可以在其中输入用户名和密码。密码将被散列,并且该数据将被发送到数据库,如上所示。如果数据库返回一个用户 ID,我知道该用户存在并且我可以使用该用户 ID 进行进一步通信,如果不是很明显,输入错误

这是一种安全的方法吗?还是有更好的方法?

一般来说,这一切都归结为:在 C# 中与数据库进行通信的最安全方式是什么?

4

1 回答 1

1

您需要查看查询安全的根本问题:非参数化查询存在威胁,因为最终用户以字符串形式插入其中的数据被重新解释为编程语言中的代码(即 SQL 中的代码)。参数化查询阻止了这种情况的发生:解释以查询参数的声明结束。任何作为值插入该参数的内容都被解释为普通的字符序列。它永远不会进入 SQL 解释器(除非您在使用 SQLexec工具时犯了一个严重错误,您永远不应该使用接近最终用户输入的任何数据的数据)。

就哈希密码而言,不,您的代码所做的事情并不安全。它对离线攻击开放,因为您的哈希没有加盐。但这是一个单独回答的主题

于 2013-10-11T13:14:09.140 回答