好久沒有研究一個“深層次”的問題了。
首先來看我們為什么要討論這個問題~
首先這是一個正常的數據庫查詢,我們可以看到在ruizhi數據庫里的chouka表內,所有數據如圖。
現在,我們運行查詢:
select * from chouka where "qq=915620310";
select * from chouka where "1qq=915620310";
我們來看看結果:
可以看到,第一句結果為空,第二句結果為全查。兩句的差別在於,第二句的“”內,在第一句“”內的內容前加了一個1.
為什么會出現這種情況呢?
mysql在把字符串強轉成數字有三種方式:
方法一:SELECT CAST('123' AS SIGNED);
方法二:SELECT CONVERT('123',SIGNED);
方法三:SELECT '123'+0;
where后的條件,最終是以數字的形式進行比較,換言之where后的條件,最終生成的結果都是數字,所以要發生字符串向數字的轉換,轉換規則如上。
換句話說,如果字符串無法直接轉換成數字,則字符串會進行前置數字正則匹配,成為最終的結果。我們來看看演示:
好了,現在你應該明白如果where后跟的是字符串,那么判定條件究竟會發生如何的變化。
我們為什么要探究這個問題呢?這是因為,在一些開發框架中,為了防止參數惡意注入,會對所有注入的參數“轉化成字符串”,這時候,應該尤其注意這個規則,以避免出現全查/空集的情況。