首页 > 解决方案 > 存储过程 SQL 注入

问题描述

我试图用我的存储过程防止 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;
 }

然后,当我想查询/保存数据时,这是函数调用和这种方法起作用并防止 SQL 注入的地方:注意(这只是验证用户是否是管理员的示例 1 代码片段)

 public DataTable User(string sUser)
 {
    List<OleDbParameter> param = new List<OleDbParameter>();
    param.Add(new OleDbParameter("@USER", sUser));

    return mda.getDataTable("[SECURITY].upSelectUser", param, MyDataAccess.sCollateralMgrConnectionString);
 }

这是我实现上述代码之前的旧代码:

 public DataTable User(string sUser)
 {
     return mda.getDataTable("[SECURITY].upSelectUser '" + sUser + "'", MyDataAccess.sCollateralMgrConnectionString);
 }

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

 public DataTable AllCollateral(MySecurity oMySec, string sStatus)
 {
    return mda.getDataTable("[DBO].[upSelectAllCollateral]" + (string.IsNullOrEmpty(sStatus) ? string.Empty : " '" + sStatus + "', '" + oMySec.Userid + "' 1"), MyDataAccess.sCollateralMgrConnectionString);
 }

这是 [DBO].[upSelectAllCollat​​eral] 下存储过程的片段

 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);
 }

标签: c#sqlasp.netstored-procedureswebforms

解决方案


推荐阅读