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查询,但这就是我现在所处的位置。

所有建议都是经过重视的,提前感谢。

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;
}