插入数据库前检查用户输入
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" }
}
);
我的 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" }
}
);