[英]Possible SQL-Injection with user defined functions and entity framework?
我的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注入的攻击,以及应如何防范它们。
从输入中删除*和“是否可以保存?
从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注入预防 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.