插入数据库之前的用户输入检查

时间:2015-01-11 17:00:08

标签: asp.net-mvc sql-injection

我的MVC 5 Webb应用程序中有一个表单,这是一个非常简单的表单,用于"联系我们":

-Name

-Email

-subject

- 消息(正文)

我必须检查用户输入的字符串。

如何在.NET中查看?


更新

正如Darin所建议的那样,参数化查询会解决这个问题,但是我的网页应用程序的架构设计实现了它的问题:

我有一个Ado Helper Class:

public class AdoHelper
{
    static string connectionString = ConfigurationManager.ConnectionStrings["SQL_DB"].ConnectionString;


    public static DataTable ExecuteDataTable(string query)
    {

        using (SqlConnection con = new SqlConnection(connectionString))
        {
            con.Open();
            SqlCommand command = new SqlCommand(query, con);
            SqlDataAdapter tableAdapter = new SqlDataAdapter(command);
            DataTable dt = new DataTable();
            tableAdapter.Fill(dt);
            return dt;
        }
    }

    public static void ExecuteNonQuery(string query)
    {

        using (SqlConnection con = new SqlConnection(connectionString))
        {
            con.Open();
            SqlCommand command = new SqlCommand(query, con);

            command.ExecuteNonQuery();
        }
    }

    public static object ExecuteScalar(string query)
    {

        using (SqlConnection con = new SqlConnection(connectionString))
        {
            con.Open();
            SqlCommand command = new SqlCommand(query, con);
            return command.ExecuteScalar();
        }

    }

}

我有数据查询类:(我这里只显示这个问题的相关功能)

     public class DataQueries
    {
        public static void InsertContactForm(ContactForm form)
        {
            try
            {
                string query = "INSERT INTO ContactForm (Name, Email, Subject, Message, Reply) VALUES ( '" + form.Name + "','" + form.Email + "','" + form.Subject + "','" + form.Message + "','" + form.Reply + "')";

                AdoHelper.ExecuteNonQuery(query);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
}

当我想将数据插入我的数据库时,我调用了一个与Ado Helper类通信的数据查询功能。

因此查询传递给Ado Helper函数为字符串格式良好且准备好了,这会产生问题,因为我无法使用Ado Helper类中的参数(我有SQL命令实例)。

这个问题有解决方法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

看起来您的AdoHelper类目前容易受到SQL注入攻击。为了避免您需要使用参数化查询。所以我首先重构这个AdoHelper类,以便更好地满足这些需求:

public class AdoHelper
{
    private static string connectionString = ConfigurationManager.ConnectionStrings["SQL_DB"].ConnectionString;

    public static int ExecuteNonQuery(string query, IDictionary<string, object> parameters)
    {
        using (var con = new SqlConnection(connectionString))
        using (var command = con.CreateCommand())
        {
            con.Open();
            command.CommandText = query;
            foreach (var p in parameters)
            {
                command.Parameters.AddWithValue(p.Key, p.Value);
            }

            return command.ExecuteNonQuery();
        }
    }
}

然后你可以调用这个方法来执行INSERT语句:

AdoHelper.ExecuteNonQuery(
    "INSERT INTO ContactForm (Name, Email, Subject, Message, Reply) VALUES (@Name, @Email, @Subject, @Message, @Reply)",
    new Dictionary<string, object>
    {
        { "@Name", "form.Name" },
        { "@Email", "form.Email" },
        { "@Subject", "form.Subject" },
        { "@Message", "form.Message" },
        { "@Reply", "form.Reply" }
    }
);

答案 1 :(得分:1)

您需要的是参数化查询。例如,在ADO.NET的cmd对象中,可以直接执行此操作:

using (var cmd = new SqlCommand())
{
    // Add the input parameter and set its properties.
    using (var parameter = new SqlParameter())
    {
        parameter.ParameterName = "@CategoryName";
        parameter.SqlDbType = SqlDbType.NVarChar;
        parameter.Direction = ParameterDirection.Input;
        parameter.Value = categoryName;
        // Add the parameter to the Parameters collection. 
        cmd.Parameters.Add(parameter);
        // Now you can execute query
    }
}

http://msdn.microsoft.com/en-us/library/yy6y35y8%28v=vs.110%29.aspx

相关问题