如何识别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
我一直面临减少 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