英文:
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"
SQLColumn[] columns 只是以下数组的一部分:
Record
nvarchar(255)
null
我对注入的理解是,用 "[]" 包围字符串会使其安全。如果这不是情况,我该如何使这个方法免受SQL注入攻击?
如您所说,用 "[]" 包围列名是一种常见的方式来防止SQL注入。但是,这个方法仍然存在一些潜在的SQL注入风险,主要是因为它在生成SQL语句时使用了字符串拼接,而没有充分验证和转义输入数据。为了使这个方法更安全,您可以采取以下步骤:
-
使用参数化查询:不要直接将输入数据插入SQL语句中,而是使用参数化查询来传递参数。这将确保输入数据被正确地转义和验证,从而防止SQL注入攻击。
-
验证输入数据:在使用输入数据之前,确保对其进行验证,以防止恶意输入。在这种情况下,您可以验证列名和表名,以确保它们只包含有效的字符。
-
避免使用动态SQL:尽量避免使用动态生成的SQL语句。如果必须使用动态SQL,请确保正确地验证和转义所有输入数据,以防止注入。
-
使用存储过程:如果可能的话,考虑使用存储过程而不是动态生成的SQL语句。存储过程可以提供更好的安全性,因为它们通常不受SQL注入的影响。
-
使用ORM框架:考虑使用对象关系映射(ORM)框架,如Entity Framework或Dapper,来处理数据库操作。这些框架通常会自动处理参数化查询和其他安全性问题。
通过采取上述步骤,您可以显著提高代码的安全性,从而减少SQL注入的风险。
英文:
I have been challenged with the task of reducing SQL injection in somebody elses code however the tool that im using to scan my code doesnt give an explanation on where the injections are, as it just points out the method. Take the following code as an example
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);
}
}
The ouput from colSQL is
"[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[] columns is just an array of the following
Record
nvarchar(255)
null
My understanding of the inject is that surrounding a string with "[]" makes it safe. IF this is not the case how would I go about making this method SQL inject free.
答案1
得分: 0
如果您使用Visual Studio,那么您可以在解决方案上运行源代码分析,当它检测到问题点时,它会引发CA3001警告。
CA3001:检查代码是否存在SQL注入漏洞。
https://learn.microsoft.com/en-us/visualstudio/code-quality/ca3001
https://learn.microsoft.com/en-us/visualstudio/code-quality/code-analysis-for-managed-code-overview
英文:
If you're using Visual Studio, then you can run source code analysis on the solution and it will raise a CA3001 warning when it detects troublespots.
CA3001: Review code for SQL injection vulnerabilities
https://learn.microsoft.com/en-us/visualstudio/code-quality/ca3001
https://learn.microsoft.com/en-us/visualstudio/code-quality/code-analysis-for-managed-code-overview
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论