C# - 参数化查询

3

我正在开发一个使用DB2数据库的.NET网站,其中使用了Insert/Update和Select查询。我对SQL注入进行了研究,并相信我已经使用参数化查询来避免SQL注入。你能否检查我是否做得正确,以及有没有更好或更充分的方法?

strInsert = "INSERT INTO DATABASE.Table(NUMBER,SIGNATURE,MESSAGE,CDATE,CTIME) VALUES (?,?,?,?,?)";

DB2Command cmdInsertQuery = new DB2Command(strInsert, db2Connection1);

cmdInsertQuery.Parameters.Add("NUMBER", i);
cmdInsertQuery.Parameters.Add("SIGNATURE", strSignature.Trim());
cmdInsertQuery.Parameters.Add("MESSAGE", strMessage.Trim());
cmdInsertQuery.Parameters.Add("CDATE", DateTime.Now.ToShortDateString());
cmdInsertQuery.Parameters.Add("CTIME", DateTime.Now.ToShortTimeString());
cmdInsertQuery.ExecuteNonQuery();

查询正确地插入了数据并且运行良好。

4
我觉得很不错。很高兴看到你对SQL注入有所了解。Stack Overflow上有很多问题,显然有些人并不知道,这让我感到很尴尬。我经常想知道我每天使用的重要软件(例如在线银行软件等)有多少没有正确处理SQL注入风险。 - rory.ap
2
也许更适合放在 http://codereview.stackexchange.com/ 上。 - HoneyBadger
谢谢。使用?,?,?可以吗?还是使用values(@NUMBER等)更好/更安全?我看到有些人使用@,只看到少数人使用?,?,?等。 - user6097989
cdate和ctime部分看起来有问题。您正在为参数传递字符串。如果这些字段具有字符串数据类型,则代码是正确的,但是您的数据库设计不正确。 - Dan Bracuk
数据库的字段是字符类型,对我的需求存储得很好。谢谢 :) - user6097989
@user6097989 - 不,你有一个隐藏的问题,随时可能会出现。CDATECTIME(或它们的组合)代表什么?如果它是创建时间的日志(正如它所显示的那样),你应该在数据库端使用单个TIMESTAMP字段。你还应该将任何绝对时间存储为UTC - DB2(以及C#)对于处理时区的支持很差。此外,ToShortDateString与文化相关的,这意味着你可能会在该列中获得多种日期格式,包括模糊的日期格式 - 你绝对不想要那样的结果。 - Clockwork-Muse
3个回答

0

add已被弃用,请使用addwithvalue,它仍然几乎与add相同,但我的Visual Studio总是对此抱怨

示例

string insertStatement =
           "Insert Login VALUES(@username,@password,@publicKey,@privateKey,@salt)";
            SqlCommand insertCommand = new SqlCommand(insertStatement, connection);
            insertCommand.Parameters.AddWithValue("@username", username);

“Add”比“AddWithValue”更安全。请参见:https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ - Adam Calvet Bohl

0

是的,你做得很正确。很高兴知道你意识到了SQL注入问题,并尝试着消除它。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接