C# 参数的安全性如何?完全保护数据库的最佳方法是什么

C# 参数的安全性如何?完全保护数据库的最佳方法是什么,c#,mysql,sql-injection,C#,Mysql,Sql Injection,首先,我发现了几个相似的话题,但并没有完全回答我所有的问题 如果我使用这样的代码,我的第一个问题是: MySqlCommand cmd = new MySqlCommand("SELECT `productnummer`, `NAAM`, `TYPE` `OMSCHRIJVING`, `Product-ID`, `Barcode` FROM `orders`.`producten` where (`productnummer` like(@variable) or `naam` like @va

首先,我发现了几个相似的话题,但并没有完全回答我所有的问题

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

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 + '%'));
如果我可以用%来定义我的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#中与数据库通信最安全的方式是什么?

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


至于散列密码,不,你的代码所做的是不安全的。它对脱机攻击开放,因为您的散列不是咸的。但这是一个错误。

你做得对。带有参数的准备语句阻止任何类型的SQL注入。如果您有两个问题,请发布两个问题。