Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用execute防止查询中的注入_Mysql_Vb.net_Sql Injection - Fatal编程技术网

Mysql 使用execute防止查询中的注入

Mysql 使用execute防止查询中的注入,mysql,vb.net,sql-injection,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; e

我正在用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;
execute案例不会中断,但不会工作,因为它不返回任何数据

我试过这个:

set @sentencia='SELECT * FROM tabla WHERE id=?'
PREPARE stmt FROM @sentencia;
EXECUTE stmt using @id;
DEALLOCATE PREPARE stmt;
但它不起作用。错误消息是:

您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 16年左右,; 在第1行取消分配“准备stmt”

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)
有人知道可能的解决办法吗? 非常感谢

试试看

PREPARE stmt FROM 'SELECT * FROM tabla WHERE id=?';     
SET @id= 'YOURID';
EXECUTE stmt USING @id;     
DEALLOCATE PREPARE stmt;
在您的示例中,您未设置
id
。应该是

 SET @id = 'SOMEID';

你在哪里设置了@id?你在设置的末尾忘了一个“;”吗?对不起,我忘了写。在我的代码中有;jejeI在我的.net代码中设置@id。我已经改变了,但是我的查询是动态的。根据用户选择的过滤器,@id是不同的。如果我只是替换SET@id=[MYID];;中的文本;,我不知道这是否会阻止SQL注入。