[英]Sql Injection - Is the following open to attack?
我最近开始在一家对SQL注入攻击敞开大门的公司工作。 因为他们几乎根本没有卫生设施。
指出问题后,我已负责解决问题。
通常,这很容易,用SQLParamater对象替换裸变量。 但是我发现一些奇怪的代码用法让我感到奇怪。
看来我的前任一直在使用存储过程和一些驻留在代码中的SQL。 然而,他似乎在一处将两者结合在一起。
他正在使用一些裸变量动态构建SQL,然后将此生成的SQL作为参数传递给存储过程。
我想知道这样做的安全性,是否将实际的SQL作为参数传递给它进行清理还是还是必须重新设计存储过程?
这是他正在做的事情的片段(大大简化了):
DataSet ExecuteQuery(string unsanitizedInput)
{
string dynamicSQL = "WHERE column = " + unsanitizedInput;
MySqlParameter param = new MySqlParameter("param1", dynamicSQL);
string procname = "StoredProc_Name";
DataSet ds = new DataSet();
using (MySql.Data.MySqlClient.MySqlDataAdapter adapter = new MySql.Data.MySqlClient.MySqlDataAdapter(procname, DataUtils.ConnectionStrings["string"]))
{
adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
adapter.SelectCommand.Parameters.Add(param);
adapter.Fill(ds);
}
return(ds);
}
显然,带有许多参数的实际查询要复杂得多。 但是,这应该使您了解他在做什么。
我的问题是:以上安全吗? 即使要注入到存储过程中的更大的SQL语句的一部分,未清理的输入也会被清理吗?
我知道上面的做法很糟糕,几乎不可能找出SQL查询,但这就是我现在的位置。
所有建议均适用,并在此先感谢。
使用参数查询不能完全防止slq注入攻击,也不能提供存储过程。 我使用了两者,但是在2010年,站点的db被两步sql注入严重损害了。
MSDN强烈建议检查任何输入文本是否包含可疑元素。 请参阅更多如何:防止ASP.NET中的SQL注入 。
我使用以下简单代码来检测sql注入(使用一些我已经不记得的良好资源构建):
public static bool DetectSqlInjection(string Text)
{
string CleanText = Text.ToUpper().Replace("/**/", " ").Replace("+", " ").Replace(" ", " ");
string[] InjectionPatterns = {
"VARCHAR",
"EXEC",
"DECLARE",
"SELECT *",
"SELECT PASSWORD",
"SELECT USERNAME",
"$_GET",
"NULL OR",
"UNION ALL SELECT",
"WAITFOR DELAY",
"SELECT pg_sleep",
"SHOW TABLES FROM"
};
foreach (string Pattern in InjectionPatterns)
{
if (CleanText.Contains(Pattern))
return true;
}
return false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.