警告:SQL 次注入攻击

Warning: SQL injection attacks

我一直在尝试使我的代码适应 FxCop 规则,但我发现了这个警告:CA2100 检查在 'WavesShaperNew.Parse(string, int)' 中传递给 'OleDbDataAdapter.OleDbDataAdapter(string, OleDbConnection)' 的查询字符串是否存在可能的 SQL 注入攻击。如果字符串是使用任何用户输入组成的,请考虑使用存储过程或参数化 SQL 查询,而不是使用字符串连接构建查询。

我在Microsoft Official Site和类似的问题中搜索过,但仍然不明白这个警告是什么意思以及如何解决它。

ComboBox sheets = new ComboBox();
TextBox startRange = new TextBox();
TextBox endRange = new TextBox();

string query = string.Format("SELECT * FROM[" + sheets.SelectedItem + startRange.Text + ":" + endRange.Text + "]");
query = query.Replace("'", "");

OleDbDataAdapter adapter = new OleDbDataAdapter(query, con);

您通常应该参数化所有 SQL 查询以避免 SQL injection 攻击,而不是使用字符串连接/插值。

但是,table 个名称无法参数化。

为避免 SQL 注入,您可以将有效的 table 名称列入白名单:

var queryableTables = new HashSet<string>
{
    "table1",
    "table2",
    // etc.
};

string tableName = sheets.SelectedItem + startRange.Text;

if (!queryableTables.Contains(tableName))
{
    throw new InvalidOperationException($"{tableName} is not queryable");
}

string query = $"SELECT * FROM [{tableName}]");