0

例如,我有这种情况:

id       value
 1       data_1
 2       20
 3       data_3
 4       15
 5       data_4
 6       data_6

和以下存储过程:

DELIMITER $$

CREATE PROCEDURE `test_2`.`test_procedure` (val int(9))
BEGIN

select * from `test` where `value` = val;

END

如果我这样调用程序

 call test_procedure(20);

我有以下结果:

id     value
 2     20

到目前为止一切都很好。

但我无法理解的是,当我这样调用程序时:

call test_procedure("abc");

我有以下结果:

id       value
 1       data_1
 3       data_3
 5       data_4
 6       data_6

这是 MySQL 数据库的正常行为吗?

如果我将变量“val”声明为整数,这不会阻止 MySQL 注入吗?

我希望有一个警告或一些东西告诉我输入值不是整数并且程序要停止,而不是显示表中不是数字的所有值。

4

2 回答 2

1

SQL 注入错误通常是通过允许将任意用户数据插入到查询字符串中来产生的。在这种情况下,val指的是一个值,而不是任意字符串。如果你CONCAT用来编写查询,你可能会遇到严重的麻烦。在这种情况下,看起来你没事。

正如您所写的那样,即使val以某种方式存在,'; DROP DATABASE db; --它也会以字符串为基础进行比较,而不是作为实际的内联字符串。这不会比在列中放置这种东西并对其进行比较更糟糕。

您所看到的可能是任意字符串到0内部的转换,因此您"abc"与其他任何计算结果为0.

于 2013-04-26T17:37:34.563 回答
0

至于奇怪的结果,可能是由于 MySQL 将val参数和value列强制转换为整数:

SELECT CAST("abc" AS SIGNED); -- returns 0
SELECT CAST("data_1" AS SIGNED); -- also returns 0

因此,如果您将“abc”和“data_1”视为 MySQL 中的整数,它们是相等的。只是一个理论,但它似乎适合。

如果零恰好是 的无效值,如果为零test.value,您可能会在过程中引发异常val。如果没有,您将需要其他一些解决方法。

顺便说一句,我同意塔德曼的观点,你在这里没有注射威胁。

于 2013-04-26T17:48:31.643 回答