Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储过程SQL注入_C#_Sql_Asp.net_Stored Procedures_Webforms - Fatal编程技术网

C# 存储过程SQL注入

C# 存储过程SQL注入,c#,sql,asp.net,stored-procedures,webforms,C#,Sql,Asp.net,Stored Procedures,Webforms,我试图阻止存储过程中的SQL注入,并通过C#或ASP.NET Web表单获取值。这是代码开始的代码 public DataTable getDataTable(string sSQL, List<OleDbParameter> param, string sConnectionString) { return getOledbDataTable(sSQL, param, sConnectionString); } public DataTable getOledbDataTa

我试图阻止存储过程中的SQL注入,并通过C#或ASP.NET Web表单获取值。这是代码开始的代码

 public DataTable getDataTable(string sSQL, List<OleDbParameter> param, string sConnectionString)
 { return getOledbDataTable(sSQL, param, sConnectionString); }

 public DataTable getOledbDataTable(string sSQL, List<OleDbParameter> param ,string sConnectionString)
 {
    OleDbConnection cn = new OleDbConnection();
    OleDbCommand oCmd = new OleDbCommand();
    OleDbDataAdapter oDA = new OleDbDataAdapter();
    DataTable oDataTable = new DataTable();

    oCmd.CommandType = CommandType.StoredProcedure;

    cn.ConnectionString = sConnectionString;
    cn.Open();
    oCmd.CommandText = sSQL;
    oCmd.Parameters.AddRange(param.ToArray());
    oCmd.Connection = cn;
    oDA.SelectCommand = oCmd;
    oDA.Fill(oDataTable);
    cn.Close();

    return oDataTable;
 }
所以我的主要问题是,,如果我有三元运算符或这类代码。如何通过使用集合列表来实现这一点

 public DataTable AllCollateral(MySecurity oMySec, string sStatus)
 {
    return mda.getDataTable("[DBO].[upSelectAllCollateral]" + (string.IsNullOrEmpty(sStatus) ? string.Empty : " '" + sStatus + "', '" + oMySec.Userid + "' 1"), MyDataAccess.sCollateralMgrConnectionString);
 }
这是[DBO].[upSelectAllCollateral]下存储过程的代码段

 CREATE PROCEDURE [dbo].[upSelectAllCollateral]
   @Status varchar(255) = NULL,
   @USERID varchar(8)
 AS
   .....
对于SQL注入错误。我用Veracode运行我的应用程序

这是我尝试过的,没有任何东西能/无法获得我想要的数据

 public DataTable AllCollateral(MySecurity oMySec, string sStatus)
 {
     List<OleDbParameter> param = new List<OleDbParameter>();
     param.Add(new OleDbParameter("@USERID", oMySec.Userid));    
     param.Add(new OleDbParameter("@Status", sStatus));

     return mda.getDataTable("[DBO].[upSelectAllCollateral]"), param, MyDataAccess.sCollateralMgrConnectionString);
 }

 public DataTable AllCollateral(MySecurity oMySec, string sStatus)
 {
     List<OleDbParameter> param = new List<OleDbParameter>();
     param.Add(new OleDbParameter("@USERID", oMySec.Userid));    
     param.Add(new OleDbParameter("@Status", sStatus));

     return mda.getDataTable("[DBO].[upSelectAllCollateral] " + (string.IsNullOrEmpty("@USERID") ? string.Empty : " @Status, @USERID 1"), param, MyDataAccess.sCollateralMgrConnectionString);
 }
公共数据表AllCollateral(MySecurity mysec,string sStatus)
{
列表参数=新列表();
参数Add(新的OleDbParameter(“@USERID”,mySec.USERID));
参数添加(新的OLEDB参数(“@Status”,sStatus));
返回mda.getDataTable(“[DBO].[upSelectAllCollateral]”),param,MyDataAccess.sCollateralMgrConnectionString);
}
公共数据表AllCollateral(MySecurity mysec、字符串sStatus)
{
列表参数=新列表();
参数Add(新的OleDbParameter(“@USERID”,mySec.USERID));
参数添加(新的OLEDB参数(“@Status”,sStatus));
返回mda.getDataTable(“[DBO].[upSelectAllCollateral]”+(string.IsNullOrEmpty(@USERID”)?string.Empty:“@Status,@USERID 1”)、param、MyDataAccess.sCollateralMgrConnectionString);
}

您可以通过使用参数化查询来防止SQL注入(即使动态参数化查询做得正确,也会防止出现问题)。使用SPs通常是重用参数化查询的好方法,除非您只是在DB端构建字符串并调用
EXECUTE
。也就是说,传递一个列表,甚至一个数据集,并与之一起使用连接是一个很好的选择。但这取决于DBMS,例如在MS SQL Server中,有.net
SqlDbType.Structured
将表类型传递给SPS,mySec.Userid的值是多少?状态的sStatus?如果在数据库上运行SQL跟踪,将向其发送什么命令?为什么这两个参数按错误的顺序列出?
 CREATE PROCEDURE [dbo].[upSelectAllCollateral]
   @Status varchar(255) = NULL,
   @USERID varchar(8)
 AS
   .....
 public DataTable AllCollateral(MySecurity oMySec, string sStatus)
 {
     List<OleDbParameter> param = new List<OleDbParameter>();
     param.Add(new OleDbParameter("@USERID", oMySec.Userid));    
     param.Add(new OleDbParameter("@Status", sStatus));

     return mda.getDataTable("[DBO].[upSelectAllCollateral]"), param, MyDataAccess.sCollateralMgrConnectionString);
 }

 public DataTable AllCollateral(MySecurity oMySec, string sStatus)
 {
     List<OleDbParameter> param = new List<OleDbParameter>();
     param.Add(new OleDbParameter("@USERID", oMySec.Userid));    
     param.Add(new OleDbParameter("@Status", sStatus));

     return mda.getDataTable("[DBO].[upSelectAllCollateral] " + (string.IsNullOrEmpty("@USERID") ? string.Empty : " @Status, @USERID 1"), param, MyDataAccess.sCollateralMgrConnectionString);
 }