我的MVC 5 Webb应用程序中有一个表单,这是一个非常简单的表单,用于"联系我们":
-Name
-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命令实例)。
这个问题有解决方法吗?
感谢。
答案 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