admin

在查询中参数化WHERE子句

sql

环境:

  • C#
  • Visual Studio 2012
  • .NET Framework 3.5

你好

我可以在SQL Server中参数where子句吗?

在我的场景中,一旦输入WHERE子句字符串,应用程序会将其连接到查询的其他部分并在SQL Server中执行,然后返回结果。

例如,

  • 用户输入“ [CookingTime] <30和[Cost] <20”
  • 应用程序创建查询“从[食谱]中选择[食谱ID],其中[烹饪时间] <30且[成本] <20”,并在SQL Server中执行。
  • 应用程序将结果返回给用户。

出于安全原因,我想将整个WHERE CLAUSE用作参数。但是我不知道如何实现。

提前致谢。


阅读 216

收藏
2021-06-07

共1个答案

admin

整个WHERE子句作为参数将以任何方式成为sql注入的受害者。为避免这种情况,您最好:

设置适当的权限。因此,即使在注入sql的情况下,用户也无法访问未授予的任何内容。在这种情况下,@
Dhaval的示例更好,因为封装在存储过程中的动态sql生成需要较少的执行权限。

检查语句以进行sql注入。最简单的方法是检查分号,以避免在批处理中出现其他语句。更复杂,更精确的方法是使用t-sql DOM解析器。例如:

using Microsoft.SqlServer.TransactSql.ScriptDom;

TSql110Parser parser = new TSql110Parser(true);
IList<ParseError> errors = null;
var condition = "a > 100; delete from [Recipes]";
var script = parser.Parse(new StringReader("select [RecipeID] from [Recipes] where " + condition), out errors) as TSqlScript;

if (errors.Count > 0)
{
    throw new Exception(errors[0].Message);
}

foreach (var batch in script.Batches)
{
    if (batch.Statements.Count == 1)
    {
        var select = batch.Statements[0] as SelectStatement;
        if (select != null)
        {
            QuerySpecification query = select.QueryExpression as QuerySpecification;
            if (query.WhereClause is BooleanBinaryExpression)
            {
                ...
            }
        }
        else
        {
            throw new Exception("Select statement only allowed");
        }
    }
    else
    {
        throw new Exception("More than one statement detected");
    }
}
2021-06-07