繁体   English   中英

SQL注入-以下内容容易受到攻击吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM