2013-07-23 259 views
-2

我正在寻找一些提示来防止SQL注入。我在一个论坛上被告知我的代码不安全,并且正在寻找一个能够帮助我解决问题的人。防止插入SQL注入

我有一个webform,并提交到aspx.cs页面,并将数据插入ms sql数据库。

protected void Submit_Click(object sender, EventArgs e) 
    { 
     string FullStartTime = StartTimeHourList.SelectedValue + ":" + StartTimeMinuteList.SelectedValue + " " + StartTimeAMList.SelectedValue; 
     string FullEndTime = EndTimeHourList.SelectedValue + ":" + EndTimeMinuteList.SelectedValue + " " + EndTimeAMList.SelectedValue; 

     OleDbConnection conn; 
     OleDbCommand cmd; 
     conn = new System.Data.OleDb.OleDbConnection(""); 
     cmd = new System.Data.OleDb.OleDbCommand(); 
     conn.Open(); 
     cmd.Connection = conn; 
     var sql = String.Format(@"INSERT INTO FormTable1 (Nonprofit, Contact, Phone, Email, Event, StartDate, EndDate, StartTime, EndTime, Place, Comments, SubmitDate) values 
                  ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}')", 
                  NonprofitTxtBox.Text, ContactTxtBox.Text, PhoneTxtBox.Text, EmailTxtBox.Text, EventTxtBox.Text, 
                  StartDateTxtBox.Text, EndDateTxtBox.Text, FullStartTime, FullEndTime, PlaceTxtBox.Text, CommentsTxtBox.Text, DateTime.Now); 
     cmd.CommandText = sql; 
     cmd.ExecuteNonQuery(); 
     conn.Close(); 
} 
+2

您直接将外部数据嵌入到查询中。您需要使用占位符预准备语句:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.prepare%28v=vs.71%29.aspx –

+6

如果您不能找到任何有关防止Internet上的C#SQL注入的信息,你需要一个新的职业。 –

+3

@BradM我什么时候说这是一个专业? – techora

回答

3

最简单的解决方法是通过连接字符串连接在一起,而是使用PARAMS根本不构建 SQL。如果您使用的是SqlCommand,则可以执行以下操作,否则请按照@MarcB的建议操作

SqlCommand cmd = new SqlCommand("INSERT dbo.Table (field1, field2, field3) VALUES (@f1, @f2, @f3)", conn); 

cmd.Paramters.Add("@f1", SqlDbType.VarChar, 50).Value = "abc"; 
cmd.Paramters.Add("@f2", SqlDbType.Int).Value = 2; 
cmd.Paramters.Add("@f3", SqlDbType.VarChar, 50).Value = "some other value"; 
+0

谢谢贾森。很有帮助。 – techora

+2

@kcray我不认为OleDBCommand支持命名您的参数。如果遇到麻烦,尝试用问号替换插入语句中的参数:INSERT INTO table(field1,field2)values(?,?),并在parameters.Add中省略名称。更好的是,如果你真的不需要OleDb,可以切换到System.Data.SqlClient中的SqlConnection和SqlCommand(仅适用于ms sql数据库),然后你可以像上面的Jason那样使用命名参数。 – JMarsch

+0

@JMarsch良好的捕获,太糟糕了,它不支持它,我已经更新了答案,以澄清任何混淆,这应该是为SQL命令 – Jason