有人可以告诉我此代码的优缺点吗?我知道我可以改用存储过程,但是考虑到我有一个文本框,管理员可以在其中输入注释ID,因此SQL注入此代码会很容易吗?
string commentId = a.Text;
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ForumDatabaseConnectionString"].ConnectionString);
con.Open();
string sql = "DELETE FROM Comment WHERE Comment.commentId = @commentid";
SqlCommand cmd = new SqlCommand(sql, con);
cmd.Parameters.AddWithValue("@commentid", commentId);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
答案 0 :(得分:2)
是的,看起来不错,因为您正在使用参数化的sql。但是,您尚未为表指定别名,因此我认为您的sql应该是
DELETE FROM Comment WHERE commentId = @commentid
除了保护您免受sql注入攻击之外,Sql Server还将知道可以使用不同的参数再次调用此sql,因此可以为其缓存有效的执行计划。
顺便说一句,您应该在使用连接后始终对其进行处置。
string commentId = a.Text;
using (SqlConnection con = new SqlConnection(ConfigurationManager
.ConnectionStrings["ForumDatabaseConnectionString"].ConnectionString))
{
con.Open();
string sql = "DELETE FROM Comment WHERE Comment.commentId = @commentid";
using(SqlCommand cmd = new SqlCommand(sql, con))
{
cmd.Parameters.AddWithValue("@commentid", commentId);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
}
如您所见,如此简单的操作有很多代码。您可能希望看看dapper,它将消除许多此类问题。有很多库可以为您提供帮助,但这里没有主题,但是它是一种轻量级的,流行的库。
答案 1 :(得分:0)
优点:
缺点:
在DataAccessLayer中使用以下代码。
public void DeleteComment(int commentId)
{
using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ForumDatabaseConnectionString"].ConnectionString))
{
con.Open();
string sql = "DELETE FROM Comment WHERE Comment.commentId = @commentid";
using (SqlCommand cmd = new SqlCommand(sql, con))
{
cmd.Parameters.AddWithValue("@commentid", commentId);
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
}
}
您也可以在单独的函数中编写连接打开代码。
查看本文以获取更多详细信息:
https://www.codeproject.com/Articles/813965/Preventing-SQL-Injection-Attack-ASP-NET-Part-I