0

我的 ASP.NET MVC 4 应用程序使用 MS-SQL 用户定义函数进行全文搜索。我关注了这篇文章并创建了以下代码:

在模型类中:

if (suchstring.Trim() != "")
{
    //search for each piece separated by space:
    var such = suchstring.Split(' ');
    int index = 0;
    foreach (string teil in such)
    {
         index++;
         if (teil.Trim() != "")
         {
              res = res.Join(db.udf_FirmenSucheMultiple(string.Format("\"{0}*\"", teil), index), l => l.ID, s => s.KEY, (l, s) => l);
         }
    }
}

映射功能:

[EdmFunction("TQCRMEntities", "udf_AnsprechpartnerFirmaSuche")]
public virtual IQueryable<udf_AnsprechpartnerFirmaSuche_Result> udf_AnsprechpartnerFirmaSucheMultiple(string keywords, int index)
    {
        string param_name = String.Format("k_{0}", index);

        var keywordsParameter = keywords != null ?
            new ObjectParameter(param_name, keywords) :
            new ObjectParameter(param_name, typeof(string));

        return ((IObjectContextAdapter)this).
            ObjectContext.CreateQuery<udf_AnsprechpartnerFirmaSuche_Result>(
            String.Format("[TQCRMEntities].[udf_AnsprechpartnerFirmaSuche](@{0})", param_name), keywordsParameter);
    }

SQL 用户定义函数:

create function udf_AnsprechpartnerFirmaSuche
    (@keywords nvarchar(4000))
returns table
as
return (select [KEY], [rank] from containstable(AnsprechpartnerFirma, *, @keywords,     LANGUAGE 1031))

如果我尝试搜索“我会收到 500 服务器错误(来自 SQLServer 的语法错误)。

我的问题是我的应用程序是否容易受到 SQL 注入的影响,以及我应该如何防范它们。

从输入中删除 * 和 " 是否可以保存?

4

1 回答 1

1

来自http://msdn.microsoft.com/en-us/library/ms189760.aspx

CONTAINSTABLE 用在 Transact-SQL SELECT 语句的 FROM 子句中,被引用时就像它是常规表名一样。. 它对包含基于字符的数据类型的全文索引列执行 SQL Server 全文搜索。

如果您阅读Quassnoi关于在全文索引中搜索双引号的答案:

标点符号被忽略。因此,CONTAINS(testing, "computer failure") 匹配具有值“我的计算机在哪里?找不到它会很昂贵”的行。

文档可以在这里找到。

请参阅他的答案以了解使用 LIKE 运算符的替代方法。

要回答您的问题:

我的问题是我的应用程序是否容易受到 SQL 注入的影响,以及我应该如何防范它们。

您在 UDF 中正确使用了参数。它应该不受 SQL 注入的影响。

从输入中删除 * 和 " 是否可以保存?

不可以。切勿尝试将字符列入黑名单以防止 SQL 注入。你几乎肯定会失败。

有关详细信息,请参阅OWASP SQL 注入预防

于 2013-07-30T17:42:35.413 回答