首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这对sql注入安全吗?

这对sql注入安全吗?
EN

Stack Overflow用户
提问于 2012-01-14 00:35:44
回答 4查看 154关注 0票数 1

我通常在查询时使用sql参数,但在这种情况下,我需要动态创建的不仅仅是参数。

有人能在任何一个变量上使用注入吗?除了存储过程之外,是否有一种通过代码防止注入的简单方法?

代码语言:javascript
复制
string whereClause = "WHERE " + filter.ToString() + " > " + nextStartPoint;
string orderBy = "ORDER BY " + filter.ToString() + " DESC";   

ex

代码语言:javascript
复制
string sql = "SELECT TOP(" + numItemsToGet + ") * " +
                                 "FROM Items " +
                                  whereClause + " " +
                                  orderBy;

更新

filter.ToString()是实际的列名

我很惊讶接下来的工作(部分前任).我还认为您必须引用带有sql参数的列名。

代码语言:javascript
复制
cmd.Parameters.AddWithValue("Count", 10);

                    string sql = "SELECT TOP(@Count) * " +
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-14 00:42:25

是的这绝对是要注射的。如果用户控制filter参数,那么他们很容易将糟糕的SQL注入到语句中。

防止注入攻击的最简单方法是使用SqlCommand构建命令。它旨在帮助防止此类攻击,并将采取适当步骤保护您的输入

票数 7
EN

Stack Overflow用户

发布于 2012-01-14 00:47:25

如果您只有有限的一组可能的过滤器,您可以使用这样的方法,但这是一种有点复杂的方法。我建议使用其他工具,如OR映射器。

代码语言:javascript
复制
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

*对不起,这段代码是未经测试的。

票数 2
EN

Stack Overflow用户

发布于 2012-01-14 00:51:41

防止SQL注入的简单方法是使用参数化查询,如下例所示:

代码语言:javascript
复制
 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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8859088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档