我有這種情況,例如:聲明變量在存儲過程和MySQL注射
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注入嗎?
我希望有一個警告或告訴我,輸入值不是一個整數和過程停止,而不是泄露表中不是數字的所有值。
這種情況幾乎與下面的語法不相同:「'abc'或1 = 1」,其中此語法總是計算爲true,結果將是表中的所有數據?在我的情況下,結果將是表格中除了數字之外的所有數據,並將信息提供給不必看到它們的人員。也許這不是注射,但在我看來是一個嚴重的安全問題。 – Catalin 2013-04-26 18:15:23
你是對的 - 它與注射相似,因爲它給用戶的應用比他們應該看到的要多。我有一個解決方案的想法;我會盡快將它添加到我的答案中。 – 2013-04-26 18:30:03
Tadman是對的。這個查詢(我測試它)給出了相同的結果:「select * from'test' where value' = 0;」我認爲解決方案將檢查變量「val」是否不同於0,如果是繼續sql查詢,否則停止。 – Catalin 2013-04-26 18:42:10