比如说朝搜索的里面填内容的时候填入'"+course+"的信息就会出现
System.Data.SqlClient.SqlException: 第 1 行: '+course+' 附近有语法错误。字符串 '' 之前有未闭合的引号。Source Error: 
Line 20:  con.Open();
Line 21:  DataSet DS=new DataSet();
Line 22:  myCommand.Fill(DS);
Line 23:  return DS;
Line 24:  }
 
等错误,我知道可以用存储过程解决,不过还有别的办法没有?

解决方案 »

  1.   

    大家存在5点误区: 
    1、sql注入比较难防,需要替换select,delete等一打字符 
    其实对于字符型替换再多都没有替换单引号为两个单引号来的好!对于数字型替换再多都没有用,一定要类型转换。 
    2、忽略DropDownList传来的东西 
    其实是不对的,一切客户端的东西都是不可信任的,select下拉框也是!因为可以自己做一个htm提交到服务器。 
    3、access比sqlserver不安全 
    安全不安全关键看怎么用,如果sqlserver还是像access一样用,一个sa帐户的话,很明显,sqlserver比access不安全,可以直接得到表名和字段名!access反而倒安全点了,因为只能通过逐位猜解得到。 
    4、网站没有显示出错信息就说明网站是安全的 
    当有记录的时候显示记录,没有记录的时候显示找不到任何记录,通过这两种状态就可以猜解字段名了,所以网页不出错不能说明是安全的 
    5、忽略post提交的信息 
    很多人对url上传递的东西过滤严格,对于post的东西不理不睬是不对的,post的东西更加容易被注入,因为一般字段比较多 在asp.net中强烈建议通过参数来实现sql而不是sql拼接,因为就算你每一个都过滤百密难有疏 
    比如: SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]); 
                SqlCommand comm=new SqlCommand("update tb1 set vName=@vName,iAge=@iAge where ID=@id",conn); 
                SqlParameter parm1=new SqlParameter("@vName",SqlDbType.NVarChar,50); 
                parm1.Value=((TextBox)e.Item.FindControl("name")).Text; 
                SqlParameter parm2=new SqlParameter("@iAge",SqlDbType.Int); 
                parm2.Value=((TextBox)e.Item.FindControl("age")).Text; 
                SqlParameter parm3=new SqlParameter("@id",SqlDbType.Int); 
                parm3.Value=this.DataGrid1.DataKeys[e.Item.ItemIndex]; 
                comm.Parameters.Add(parm1); 
                comm.Parameters.Add(parm2); 
                comm.Parameters.Add(parm3); 
                conn.Open(); 
                comm.ExecuteNonQuery(); 
                conn.Close(); 
    这样的代码看起来舒服而且又安全,何乐不为? 
      

  2.   

    对,支持LoveCherry说得好。这样就注入不进来了。至今还是没听什么ASP。NET注入动静。最好写程序时严密,要对自己的劳动成果负责
      

  3.   

    MSDN上介绍的方法是使用Sql存储过程来解决,我晕……