可能使用用户定义的函数和实体框架进行SQL注入
本文关键字:框架 实体 注入 SQL 函数 用户 定义 | 更新日期: 2023-09-27 18:25:34
我的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的Syntaxerror)
我的问题是,我的应用程序是否容易受到SQL注入的攻击,以及我应该如何防范它们。
是否保存为仅从输入中删除*和"?
来源http://msdn.microsoft.com/en-us/library/ms189760.aspx
CONTAINSTABLE在Transact-SQL SELECT语句的FROM子句中使用,并且被引用时将其视为常规表名。它对包含基于字符的数据类型的全文索引列执行SQL Server全文搜索。
如果你阅读了Quassnoi关于在全文索引中搜索双引号的回答:
标点符号被忽略。因此,CONTAINS(测试,"计算机故障")将一行与值匹配,"我的计算机在哪里?找不到它会很昂贵。"
文档可在此处找到。
有关使用LIKE运算符的替代方法,请参见他的答案。
回答您的问题:
我的问题是,我的应用程序是否容易受到SQL注入的攻击,以及我应该如何防范它们。
您在UDF中正确地使用了参数。它应该是安全的,不会被SQL注入。
是否保存为仅从输入中删除*和"?
没有。永远不要试图将字符列入黑名单以阻止SQL注入。你几乎肯定会失败。
有关详细信息,请参阅OWASP SQL注入预防。