一:
這個話題太老生常談了.
在PHP.INI中將magic_quotes_gpc = On
確實能防得住一些注入式攻擊,但這是不是萬能的?
我們現在是將POST或者GET收到的變量,將其中的空格轉換掉,標點符號,特殊字符全部轉換為HTML編碼.
演示的時候再將他還原.請問大家是如何做的?交流一下代碼啊.
不過還是沒有用的.防不了union語句,當你的SQL寫得不規范的時候.
比如select * from news where id=$Id,這個變量$Id沒有用小引號括起來,而且又沒有判斷這個$Id是不是數字字符串的時候,就肯定會被注入,就算magic_quotes_gpc = On也一樣.
徹底的防注入的方法只有在SQL語句內將變量用小引號括起來,然後
magic_quotes_gpc = On,然後將空格轉換掉,標點符號,特殊字符全部轉換為HTML編碼.
這樣我認為就一勞永逸了,不知道有無漏網之魚,請高手指教,我們現在開發的系統杜絕了注入的話,我才能睡上好覺.哈哈.
一般我是直接在每個頁面用函數將_get,_post,_session等數據初步過濾
在具體寫入數據庫時候強制檢查數據類型~
基本這些對一般的注入效果還是不錯的
1\ SQL語句最好通過sprintf格式化,再query
2\ 登陸檢測之類的時候,最好通過一個值取出另一個值,然後進行比對
舉例說明:
哈哈,那是我舉的一個例子啊。我仔細的總結了一下,不被注入很容易。
總結如下:
magic_quotes_gpc = On這個打開,然後變量用小引號括住,別人想注入的話,得突破引號,所以他得在變量內加入小引號,加入小引號又會被magic_quotes_gpc = On給轉義掉了,突破小引號失敗。就干不了壞事。
還有一點就是在MYSQL中有兩個注釋標記,#和/*,通過這個能將後面的SQL語名注釋掉,將這倆字符給轉成ASC碼或者HTML碼。
然後就是注入攻擊的爸媽是空格。
如select * from news where id=1 union select * from admin,如果我將空格給刪除或者轉換掉。
就成了select * from news where id=1unionselect*fromadmin,這是偷竊數據的下場。
select * from news where id=1; drop table news這裡將空格弄掉.
select * from news where id=1; droptablenews無法執行。
所以說注入式攻擊的爸媽是空格。空格被替換掉之後。真的是能安心睡覺了