这是Sql注入证明Asp.net代码吗?

时间:2019-02-22 10:02:01

标签: c# asp.net

有人可以告诉我此代码的优缺点吗?我知道我可以改用存储过程,但是考虑到我有一个文本框,管理员可以在其中输入注释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();

2 个答案:

答案 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)

优点:

  • 很好的是,您正在使用参数进行SQL注入安全的命令。

缺点:

  • 写得不好。
  • 不对CRUD使用功能。始终使用函数进行CRUD操作。
  • 不使用“使用”块。始终使用using块,因此您不需要处理连接和命令。您无需手动将其关闭。

在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