使用execute防止查询中的注入

时间:2017-09-05 12:10:28

标签: mysql vb.net sql-injection

我正在使用Visual Studio 2017开发一个报告网站。我所有的MYSQL查询都已参数化并且工作正常。问题出在一些具有EXECUTE命令的查询中。

例如:

而不是

SELECT * FROM tabla WHERE id=@id

我已经把

set @sentencia='SELECT * FROM tabla WHERE id=@id'
PREPARE stmt FROM @sentencia;
EXECUTE stmt using @id;
DEALLOCATE PREPARE stmt;

执行案例不会中断但不起作用,因为不返回任何数据。

我试过这个:

set @sentencia='SELECT * FROM tabla WHERE id=?'
PREPARE stmt FROM @sentencia;
EXECUTE stmt using @id;
DEALLOCATE PREPARE stmt;

但它不起作用。错误消息是:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   '16附近;         DEALLOCATE PREPARE stmt'在第1行

16对应于我在代码中给参数@id赋予的值。

       Dim myConnectionMYSQL As New MySql.Data.MySqlClient.MySqlConnection
        myConnectionMYSQL.ConnectionString = CadenaDeConexion()
        myConnectionMYSQL.Open()
        Dim myCommandMYSQL As New MySql.Data.MySqlClient.MySqlCommand(_Sentencia, myConnectionMYSQL)
        myCommandMYSQL.CommandTimeout = 9000
        myCommandMYSQL.Parameters.Add("@id", SqlDbType.Int, 100)
        myCommandMYSQL.Parameters("@id").Value = 16
        Dim daMYSQL As New MySql.Data.MySqlClient.MySqlDataAdapter(myCommandMYSQL)
        Dim dtMYSql As New DataTable
        daMYSQL.Fill(dtMYSql)

任何人都知道可能的解决方案? 非常感谢!

1 个答案:

答案 0 :(得分:1)

试一试......

PREPARE stmt FROM 'SELECT * FROM tabla WHERE id=?';     
SET @id= 'YOURID';
EXECUTE stmt USING @id;     
DEALLOCATE PREPARE stmt;

在您的示例中,您 设置id。应该是......

 SET @id = 'SOMEID';