如何解决截断表的SQL注入问题

Sar*_*pta 1 c# sql sql-injection secure-coding

下面是我截断表记录的代码行。表值来自前端。在我的 Veracode 扫描中,它显示了 SQL 注入。我怎样才能避免这种情况?我无法创建存储过程,因为连接字符串是动态的,我需要截断此表。还有另一种方法吗?

SqlCommand cmd = connection.CreateCommand();
cmd.Transaction = transaction;
cmd.CommandText = "TRUNCATE TABLE " + tablename;
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

Joe*_*orn 5

你需要动态sql:

string sql = @"
    DECLARE @SQL nvarchar(150); 
    SELECT @SQL = 'truncate table ' + quotename(table_name) + ';'
        FROM information_schema.tables 
        WHERE table_name = @table;
    EXEC(@SQL);";

using (var connection = new SqlConnection("connection string here"))
using (var cmd = new SqlCommand(sql, connection))
{
    cmd.Transaction = transaction;
    cmd.Parameters.Add("@table", SqlDbType.NVarChar, 128).Value = tablename;
    connection.Open();
    cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)

这是动态 SQL 使事情变得更安全而不是安全的极少数情况之一。更好的是,如果您还在此数据库中维护一个特殊的表,其中列出了允许用户截断的其他表,并使用它而不是 information_schema 来验证名称。让用户截断任何东西的想法有点可怕。