我通常在查询时使用sql参数,但在这种情况下,我需要动态创建的不仅仅是参数。
有人能在任何一个变量上使用注入吗?除了存储过程之外,是否有一种通过代码防止注入的简单方法?
string whereClause = "WHERE " + filter.ToString() + " > " + nextStartPoint;
string orderBy = "ORDER BY " + filter.ToString() + " DESC"; ex
string sql = "SELECT TOP(" + numItemsToGet + ") * " +
"FROM Items " +
whereClause + " " +
orderBy;更新
filter.ToString()是实际的列名
我很惊讶接下来的工作(部分前任).我还认为您必须引用带有sql参数的列名。
cmd.Parameters.AddWithValue("Count", 10);
string sql = "SELECT TOP(@Count) * " +发布于 2012-01-14 00:42:25
是的这绝对是要注射的。如果用户控制filter参数,那么他们很容易将糟糕的SQL注入到语句中。
防止注入攻击的最简单方法是使用SqlCommand构建命令。它旨在帮助防止此类攻击,并将采取适当步骤保护您的输入
发布于 2012-01-14 00:47:25
如果您只有有限的一组可能的过滤器,您可以使用这样的方法,但这是一种有点复杂的方法。我建议使用其他工具,如OR映射器。
SET ROWCOUNT @numItemsToGet
select *
from Items
where
(
@ColumnANextStartPoint is null
or ColumnA > @ColumnANextStartPoint
) and (
@ColumnBNextStartPoint is null
or ColumnB > @ColumnBNextStartPoint
) and (
@ColumnCNextStartPoint is null
or ColumnC > @ColumnCNextStartPoint
)
order by
case @ColumnANextStartPoint when null then null else ColumnA end DESC,
case @ColumnBNextStartPoint when null then null else ColumnB end DESC,
case @ColumnCNextStartPoint when null then null else ColumnC end DESC*对不起,这段代码是未经测试的。
发布于 2012-01-14 00:51:41
防止SQL注入的简单方法是使用参数化查询,如下例所示:
SqlConnection someConnection = new SqlConnection(connection);
SqlCommand someCommand = new SqlCommand();
someCommand.Connection = someConnection;
someCommand.Parameters.Add(
"@username", SqlDbType.NChar).Value = name;
someCommand.Parameters.Add(
"@password", SqlDbType.NChar).Value = password;
someCommand.CommandText = "SELECT AccountNumber FROM Users " +
"WHERE Username=@username AND Password=@password";
someConnection.Open();
object accountNumber = someCommand.ExecuteScalar();
someConnection.Close();https://stackoverflow.com/questions/8859088
复制相似问题