c# - 存储过程 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].[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);
}
解决方案
推荐阅读
- laravel - 如何停止从 laravel 观察者执行控制器中的方法
- python - 通过 kubernetes python API 获取就绪探测状态
- istio - 如何从 istio 入口网关中删除或修改标头
- php - Elasticsearch 如何设置 top_hits 聚合结果的大小?
- ios - 与 WiFi 相比,为什么 Angular HTTP 请求在移动数据上的排队时间要长得多?
- apache-spark - 为什么单个 Broker 设置在单个主题分区而不是多个分区下表现更好
- talend - How to fix Java heap space error in Talend?
- javascript - 快照测试 react 功能组件 useSelctor hook
- json - 逻辑应用程序 - 将“YYYY-MM-DD HH:MM:SS”转换为自纪元以来的毫秒数
- azure - 在 Azure Blob 容器中创建三个文件时,如何在 Azure 数据工厂中创建事件触发器?