【问题标题】:MySqlParameter as TableNameMySqlParameter 作为 TableName
【发布时间】:2011-08-27 20:13:57
【问题描述】:

我想使用MySqlParameter 将 tableName 传递给查询(以防止 slq 注入)

MySqlCommand cmd = new MySqlCommand("select * from @table"), cn)
cmd.Parameters.AddWithValue("@table",TableName);

但这不起作用。如何将 tableName 作为参数传递

附:我试图将 @ 更改为 ? - 不工作

【问题讨论】:

    标签: c# mysql mysql-connector mysql-parameter


    【解决方案1】:

    您不能将表名作为参数传递。 您必须使用动态 SQL 来执行此操作,因此您必须字符串集中来执行此操作,例如

      MySqlCommand cmd = new MySqlCommand(String.Format("select * from {0}",tableName), cn)
    

    但是因为用户输入了tableName,所以SQL注入是可能的。您可以使用此 SQL 来确定该表是否存在,然后再从中查询任何内容:

    SELECT table_name
    FROM information_schema.tables
    WHERE table_schema = 'databasename'
    AND table_name = 'tablename';
    

    (您可以完美地对这个查询进行参数化,这样就可以消除SQL注入)

    一般来说,要小心 SQL 注入。但是如果你使用这个内部(不暴露给用户),那么 SQL 注入应该没有问题。

    更好的是,你可以构造一个存储过程来处理这个问题,就像我的另一个答案:

    Unified SQL getter with LINQ

    【讨论】:

    • -1。这是使用纯字符串的不好方法,因为我可以通过 tableName = "users ; DROP TABLE users;" ,这将删除表
    • 用户将输入表名。我不喜欢使用存储过程,在客户端需要一些解决方案
    • 感谢您的帮助。我将正则表达式验证放在客户端输入上
    • 为什么不使用用户可以选择的所有可用/合格表填充下拉列表,从而消除整个注入。
    猜你喜欢
    • 2019-11-14
    • 1970-01-01
    • 2011-01-27
    • 2010-11-22
    • 2013-04-10
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多