官方的說法為:所謂sql注入,就是通過把sql命令插入到web表單提交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令。即把惡意的 sql 語句插入到輸入引數中,然後通過在後台 sql 伺服器上解析-執行進行的攻擊,它目前黑客對資料庫進行攻擊的最常用手段之一。
通俗點說,一般我們提交的表單資料(未經過濾的情況下)都會拼接到 sql 查詢語句中的,就例如:
/*
*使用者資料表
*/drop table if exists table_user;
create table table_user
( user_pk bigint not null auto_increment,
user_accountnumber varchar(30),
user_password varchar(30),
primary key (user_pk)
);insert into table_user(user_accountnumber,user_password) value("root","1234556");
select user_accountnumber,user_password from table_user where user_accountnumber='root';
其中 name 引數 root 就是從表單中傳過來的資料,如果傳的引數不是 root,而是一條 sql 語句,那麼就可能騙過了 sql 資料庫,從而執行了一段惡意的**,達到了我們(程式設計師)意料之外的結果。
1.正確查詢-查詢賬號為root,密碼為123456的使用者資訊【傳入引數root,123456】
select user_accountnumber,user_password from table_user where user_accountnumber='root' and user_password='123456';
查詢結果如下:
2.錯誤查詢-查詢賬號為root』#,密碼為123456的使用者資訊【傳入引數root』#,123456】
select user_accountnumber,user_password from table_user where user_accountnumber='root'#' and user_password='123456';
查詢結果如下:
3.錯誤查詢-查詢賬號為root』#,密碼為123456的使用者資訊【傳入引數root』-- ,123456】,–後有空格
select user_accountnumber,user_password from table_user where user_accountnumber='root'-- ' and user_password='123456';
查詢結果如下:
從查詢2和3的結果來看,不符合我們預期的結果。這是因為 sql 語句中有兩種注釋,一種是: # ,另一種是:-- ,這兩條查詢語句正式利用了這個,導致 sql 認為後面的語句是注釋。從而,不管你輸入的密碼是否正確,都可以登入。
當然,sql 注入攻擊不止這些,上文只是列舉了列舉了兩種。更多的注入方式,可以自行到網路上搜尋。
把應用伺服器的資料庫許可權降至最低,盡可能地減少 sql 注入攻擊帶來的危害。
避免**列印出sql錯誤資訊,比如型別錯誤、欄位不匹配等,把**裡的sql語句暴露出來,以防止攻擊者利用這些錯誤資訊進行sql注入。
對進入資料庫的特殊字元(』"\尖括號&*;等)進行轉義處理,或編碼轉換。
所有的查詢語句建議使用資料庫提供的引數化查詢介面,引數化的語句使用引數而不是將使用者輸入變數嵌入到sql語句中,即不要直接拼接sql語句。
在測試階段,建議使用專門的 sql 注入檢測工具進行檢測。網上有很多這方面的開源工具,例如sqlmap、sqlninja等。
參考:
SQL注入語句
對於sql語句注入來說 最重要的是利用其系統已存在的乙個information.schema 其中schemata是用來查詢庫名稱 tables用來查詢表名稱 columns用來查詢列名稱 order by語句用來判斷當前庫的列數 select用來查詢庫中的資訊 關於sql注入的相關流程 1.首先判...
SQL語句分類簡述
sql是一種用於資料庫訪問的非過程化語言,使用者通過 sql 描述其目標,之後 sql 語言編譯器自動地生成執行過程,控制資料庫執行使用者所期望的操作。本文大致介紹oracle中涉及到的一些語句。資料操作語言 data manipulation language,dml 語句的作用是查詢或操作已有方...
Sql語句注入漏洞
sql語句作為國際標準的資料庫查詢語句,在各種程式設計環境中得到了廣泛的應用。作為乙個成熟 穩定的系統,使用者登陸和密碼驗證是必不可少的。筆者在平時的程式設計工作中發現,許多程式設計師在用sql語句進行使用者 密碼驗證時是通過乙個類似這樣的語句來實現的 sql select from 使用者表 wh...