如何识别SQL注入的位置?

How to identify where SQL injection is?

我一直面临减少 SQL 注入其他人代码的任务,但是我用来扫描我的代码的工具没有给出注入位置的解释,因为它只是指出了方法。以下面的代码为例

public static CommandStatus<int> CreateTable(SqlConnection connection, String tableName, SQLColumn[] columns)
{
    string colSQL = columns.Select(f => f.ToString()).Aggregate((f1, f2) => f1 + ",\n" + f2);


    if(columns.FirstOrDefault(e => e.IsPK()) != null){
        string constraint = GenerateTableConstraint(tableName, columns.FirstOrDefault(e => e.IsPK()).ColumnName());
        colSQL += constraint;
    }

    string sql = "CREATE TABLE " + ParseTableName(tableName) + " (" + colSQL + ") ON [PRIMARY]";

    SqlCommand cmd = new SqlCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = sql;
    cmd.Connection = connection;
    cmd.CommandTimeout = GetTimeout();

    try
    {
        int result = cmd.ExecuteNonQuery();

        return new CommandStatus<int>(result);
    }
    catch (Exception e)
    {
        return new CommandStatus<int>("Failed to create tableName " + tableName + " [SQL: " + sql + "]:" + e.Message, e);
    }
}

colSQL 的输出是

"[RecordID] [NVARCHAR](255) NULL,\n[Address1] [NVARCHAR](255) NULL,\n[Address2] [NVARCHAR](255) NULL,\n[Address3] [NVARCHAR](255) NULL,\n[Address4] [NVARCHAR](255) NULL,\n[Address5] [NVARCHAR](255) NULL,\n[MongoId] [NVARCHAR](100) NOT NULL"

SQLColumns[]列只是下面的数组

Record
nvarchar(255)
null

我对注入的理解是用“[]”包围一个字符串是安全的。如果不是这种情况,我将如何使这种方法 SQL 自由注入。

如果您正在使用 Visual Studio,那么您可以 运行 对解决方案进行源代码分析,它会在检测到故障点时引发 CA3001 警告。

CA3001:检查 SQL 注入漏洞的代码

https://docs.microsoft.com/en-us/visualstudio/code-quality/ca3001

https://docs.microsoft.com/en-us/visualstudio/code-quality/code-analysis-for-managed-code-overview