如果您通過網頁獲取用戶輸入的數據并將其插入一個MySQL數據庫,那么就有可能發生SQL注入安全的問題。
所謂SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
我們永遠不要信任用戶的輸入,我們必須認定用戶輸入的數據都是不安全的,我們都需要對用戶輸入的數據進行過濾處理。
很多時候我們采用動態拼裝sql,而這樣的方式很容易通過拼接sql字符串進行注入。
**例如**
~~~
$sql = "select * from user where uid=$uid";
~~~
以上SQL如果有字符串處理,是根本不會這么寫的,但有些時間沒有字符串時你可能也習慣這么寫,如果真這么寫那么問題就來了
假如訪問提交的是http://localhost/index.php?uid=1 or 1=1
SQL會變成:
~~~
select * from user where uid=1 or 1=1
~~~
通過上頁我們知道,加引號是多么重要的事情,加上引號看看效果會有什 么變化,SQL變為如下形式
SQL會變成:
~~~
select * from user where uid='1 or 1=1'
~~~
但是如果你加了引號之后,如果用戶再訪問提交 http://localhost/index.php?uid=1' or 1=1%23
SQL會變成:
~~~
select * from user where uid='1' or 1=1#'
~~~
依然可以進行注入,在這種情況下,我們需要怎么做呢,我們嘗試著把數據交給mysql_real_escape_string()或者addslashes()來轉義特殊的輸入字符。
SQL會變成:
~~~
select * from user where uid='1\' or 1=1#'
~~~
注入方式絕大多數依賴 <>'"& 這幾個字符中的一個或幾個對內容進行注入攻擊。mysql_real_escape_string()并不能處理 <>,那這種情況下我們還應該怎么辦,咱們可以通過htmlspecialchars函數將這些字符轉換成無害的HTML 實體;目前TP的I方法就默認會對接收的數據通過這個函數進行過濾。
注入的場景有很多,在這里不一一列舉,大家感興趣,可以通過搜索引擎查找相關資料。
課外閱讀:http://blog.sina.com.cn/s/blog_51af865b01009xsx.html
**安全注意事項**
1. 永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和 雙"-"進行轉換等。
2. 不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
3. 應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝
4. 使用字符串查詢條件,使用預處理機制。
5. 對數據類型為整形的,可以強制轉換成整型。
6. 提高數據庫表和字段的命名技巧,對一些重要的字段根據程序的特點命名,取不易被猜到的。
- 序言
- 第一章:準備工作
- 寫在學習之前的話
- web應用開發結構
- 開發工具/環境
- 第二章:展現層面(HTML/CSS)
- HTML簡介
- HTML基礎
- HTML編碼
- HTML鏈接
- HTML圖像
- HTML列表
- HTML表單
- HTML表格(分水嶺)
- HTML 實體
- HTML框架
- CSS層疊樣式表
- CSS選擇器
- CSS文本/字體
- CSS繼承和疊加
- CSS框模型
- CSS浮動(分水嶺)
- CSS定位
- CSS背景
- CSS圖標字體
- CSS補充
- 開發技巧
- 第三章:展現層面(Javascript)
- JS簡介
- JS實現
- JS輸出交互
- JS變量
- JS數據類型
- JS運算符
- JS流程控制(分水嶺)
- JS函數
- JS數組
- JS對象(分水嶺)
- JS數組對象
- JS字符串對象
- JS數學對象
- JS日期對象
- JS BOM對象(分水嶺)
- JS DOM對象
- JS事件對象
- JS元素對象
- JS DOM節點
- 第四章:展現層面(Jquery)
- JQ簡介
- JQ使用
- JQ選擇器
- JQ篩選
- JQ屬性
- JQ-CSS
- JQ事件
- JQ文檔處理
- JQ效果
- JQ-ajax
- 第五章:邏輯/業務層面(PHP)
- PHP簡介
- PHP變量
- PHP數據類型
- PHP常量
- PHP運算符
- PHP流程控制
- PHP函數(分水嶺)
- PHP日期
- PHP數學
- PHP數組
- PHP字符串
- PHP正則表達式(分水嶺)
- PHP目錄操作
- PHP文件
- PHP上傳/下載
- PHP面向對象(分水嶺)
- PHP圖像處理
- PHP會話控制
- Ajax異步處理
- PHPMysql擴展
- PHPMysqli擴展
- PHPPdo擴展
- PHP接口
- PHP命名空間
- 第六章:邏輯/業務層面(框架設計)
- 第七章:存儲層面(mysql)
- Mysql基礎
- Mysql Sql簡介
- Mysql數據庫
- Mysql數據類型
- Mysql數據表
- Mysql操作記錄
- Mysql查詢
- Mysql修改表結構
- Mysql日期與時間
- Mysql分組統計
- Mysql多表查詢
- Mysql安全
- Mysql存儲引擎
- Mysql事務
- Mysql視圖
- Mysql觸發器
- Mysql存儲過程
- Mysql存儲函數
- Mysql優化
- 第八章:服務器(Linux)
- Linux介紹與安裝
- Shell
- 目錄與文件操作
- VIM編輯器使用
- 帳號管理
- SUDO
- 權限控制
- 壓縮與打包
- 軟件安裝
- 計劃任務
- 進程管理
- 寶塔Linux面板