针对 SQL Inejection 受保护的 DataSet

protected DataSet against SQL Inejection

提问人:Naveh 提问时间:3/27/2021 更新时间:3/27/2021 访问量:40

问:

我想创建一个类,我可以获取构造函数参数中给定的特定表的数据表。

但是,我怎样才能做到这一点而不容易受到SQL注入的影响呢?

我会做这样的事情:(但你不能那样使用这些语句)

public class SqlClass
{

    DataTable dt;

    string table;

    public SqlClass(String table)
    {
        this.table = table;
        SqlConnection c = new SqlConnection();
        c.conOpen();
        MySqlCommand msc = new MySqlCommand("SELECT * FROM @tableName", c.Con); //Cant do that
        msc.Parameters.AddWithValue("@tableName", table);
        DataSet ds = c.getDataSet(msc, table);
        this.dt = ds.Tables[table];
        c.conClose();
    }

    public DataTable Dt { get => dt; set { dt = value; } }

}

还有其他不会伤害我的工作替代方案吗?谢谢。

C# asp.net DataTable 数据集 SQL 注入

评论

0赞 Mitch Wheat 3/27/2021
我怀疑你真的不想那样做。您要解决的实际问题是什么?
0赞 Naveh 3/27/2021
@MitchWheat我想找到一种受保护的方法来获取所有表数据,通过作为参数给出的表名,
0赞 Franz Gleichmann 3/27/2021
您可以通过将输入与输出进行比较来检查输入是否为有效的表名SHOW TABLES;
1赞 Serge 3/27/2021
我看不出有什么用。只有当 appl 的用户可以在输入字段中键入表的名称时,这才有意义。但我从未见过这种应用。
1赞 Serge 3/27/2021
当用户有可能在输入字段中输入一些额外的代码时,这称为 Sql 注入。这就是为什么在发送到数据库之前,您总是在服务器端验证用户输入的原因。但是,由于您的查询位于服务器端,因此用户无法注入额外的内容。或者更准确地说,如果有人会找到更改查询字符串的方法,他永远不会使用参数。因此,在这种情况下,参数将毫无用处。

答: 暂无答案