c# - 参数化查询

c# - Parametrized Query

提问人:user6097989 提问时间:4/12/2016 最后编辑:Mafiiuser6097989 更新时间:4/12/2016 访问量:263

问:

我正在开发一个 .net 网站,该网站使用使用 Insert/Update 和 Select Queries 的 DB2 数据库。我研究了 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();

查询正确插入数据并正常工作。

C# SQL DB2 SQL注入 参数化查询

评论

4赞 rory.ap 4/12/2016
对我来说看起来不错。很高兴看到您了解 SQL 注入。SO 充满了人们显然不是的问题,每次都让我畏缩。我经常在想,我每天使用的重要软件中,有多少是没有正确处理SQL注入风险的。
2赞 HoneyBadger 4/12/2016
也许放在 codereview.stackexchange.com 更好
0赞 user6097989 4/12/2016
谢谢。正在使用 ?,?,?很好还是使用值(@NUMBER等)更好/更安全?我看到有些人使用@,但只看到少数人使用?,?,?等
0赞 Dan Bracuk 4/12/2016
cdate 和 ctime 部分看起来很可疑。您正在为参数传递字符串。如果这些字段具有字符串数据类型,则代码正常,但数据库设计不正常。
0赞 user6097989 4/12/2016
数据库将字段作为字符,并根据需要存储它。谢谢:)

答:

0赞 Kunal 4/12/2016 #1

是的,你做对了。很高兴知道您知道 SQL 注入问题并尝试消除它的方法。

0赞 Francesco Ventura 4/12/2016 #2

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);

评论

0赞 Adam Calvet Bohl 8/1/2018
Add比 更安全。请参阅:blogs.msmvps.com/jcoehoorn/blog/2014/05/12/...AddWithValue
0赞 Ali 4/12/2016 #3

有没有更好或更充分的方法?

其中一个选项是使用 https://github.com/StackExchange/dapper-dot-net