SQL 注入 - 以下是否容易受到攻击
本文关键字:易受 攻击 是否 注入 SQL | 更新日期: 2023-09-27 18:37:22
我最近开始在一家对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 年,站点的数据库受到两步 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;
}