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

User Input Check Before Insert to Database

我的 MVC 5 Webb 应用程序中有一个表单,一个非常简单的表单 "contact us":

-姓名

-邮箱

-主题

-消息(正文)

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

如何在 .NET 中检查它?


更新:

正如 Darin 所建议的那样,参数化查询将解决这个问题,但我在使用我的 Web 应用程序的架构设计实现它时遇到了问题:

我有一个 Ado 助手 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();
        }

    }

}

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

     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 通信的数据查询函数 Class。

所以查询传递给 Ado Helper 函数作为格式正确且准备就绪的字符串,这会产生一个问题,因为我不能在 Ado Helper class 中使用参数(我有 SQL 命令实例)。

这个问题有解决办法吗?

谢谢。

您需要的是参数化查询。例如,在 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

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

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