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)
你需要动态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 来验证名称。让用户截断任何东西的想法有点可怕。
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |