SQL 注入簡介:
??????? SQL注入是最常見的攻擊方式之一,它不是利用操作系統(tǒng)或其它系統(tǒng)的漏洞來實現(xiàn)攻擊的,而是程序員因為沒有做好判斷,被不法
用戶鉆了SQL的空子,下面我們先來看下什么是SQL注入:
??????? 比如在一個登陸界面,要求用戶輸入用戶名和密碼:
??????? 用戶名:???? ' or 1=1 --??
??????? 密???? 碼:??
??????? 點登陸,如若沒有做特殊處理,而只是一條帶條件的查詢語句如:
??????? String sql="select * from users where username='"+userName+"' and password='"+password+"' "
??????? 那么這個非法用戶就很得意的登陸進去了.(當然現(xiàn)在的有些語言的數(shù)據(jù)庫API已經(jīng)處理了這些問題)
??????? 這是為什么呢?我們來看看這條語句,將用戶輸入的數(shù)據(jù)替換后得到這樣一條語句:
??????? select * from users where username='' or 1=1 --' and password=''
??????? 為了更明白些,可以將其復制到SQL分析器中,將會發(fā)現(xiàn),這條語句會將數(shù)據(jù)庫的數(shù)據(jù)全部讀出來,為什么呢?
??????? 很簡單,看到條件后面 username='' or 1=1 用戶名等于 '' 或 1=1 那么這個條件一定會成功,然后后面加兩個-,這意味著
什么?沒錯,注釋,它將后面的語句注釋,讓他們不起作用,這樣就可以順利的把數(shù)據(jù)庫中的數(shù)據(jù)讀取出來了。
??????? 這還是比較溫柔的,如果是執(zhí)行
??????? select * from users where username='' ;DROP Database??? (DB Name) --' and password=''
??????? .......其他的您可以自己想象。。。
那么我們怎么來處理這種情況呢?下面我以java為列給大家兩種簡單的方法:
??????? 第一種采用預編譯語句集,它內(nèi)置了處理SQL注入的能力,只要使用它的setString方法傳值即可:
第二種是采用正則表達式將包含有 單引號('),分號(;) 和 注釋符號(--)的語句給替換掉來防止SQL注入
轉(zhuǎn)載地址:http://my.oschina.net/liangtee/blog/82159
??????? SQL注入是最常見的攻擊方式之一,它不是利用操作系統(tǒng)或其它系統(tǒng)的漏洞來實現(xiàn)攻擊的,而是程序員因為沒有做好判斷,被不法
用戶鉆了SQL的空子,下面我們先來看下什么是SQL注入:
??????? 比如在一個登陸界面,要求用戶輸入用戶名和密碼:
??????? 用戶名:???? ' or 1=1 --??
??????? 密???? 碼:??
??????? 點登陸,如若沒有做特殊處理,而只是一條帶條件的查詢語句如:
??????? String sql="select * from users where username='"+userName+"' and password='"+password+"' "
??????? 那么這個非法用戶就很得意的登陸進去了.(當然現(xiàn)在的有些語言的數(shù)據(jù)庫API已經(jīng)處理了這些問題)
??????? 這是為什么呢?我們來看看這條語句,將用戶輸入的數(shù)據(jù)替換后得到這樣一條語句:
??????? select * from users where username='' or 1=1 --' and password=''
??????? 為了更明白些,可以將其復制到SQL分析器中,將會發(fā)現(xiàn),這條語句會將數(shù)據(jù)庫的數(shù)據(jù)全部讀出來,為什么呢?

??????? 很簡單,看到條件后面 username='' or 1=1 用戶名等于 '' 或 1=1 那么這個條件一定會成功,然后后面加兩個-,這意味著
什么?沒錯,注釋,它將后面的語句注釋,讓他們不起作用,這樣就可以順利的把數(shù)據(jù)庫中的數(shù)據(jù)讀取出來了。
??????? 這還是比較溫柔的,如果是執(zhí)行
??????? select * from users where username='' ;DROP Database??? (DB Name) --' and password=''
??????? .......其他的您可以自己想象。。。
那么我們怎么來處理這種情況呢?下面我以java為列給大家兩種簡單的方法:
??????? 第一種采用預編譯語句集,它內(nèi)置了處理SQL注入的能力,只要使用它的setString方法傳值即可:
String sql= "select * from users where username=? and password=?; PreparedStatement preState = conn.prepareStatement(sql); preState.setString(1, userName); preState.setString(2, password); ResultSet rs = preState.executeQuery();
第二種是采用正則表達式將包含有 單引號('),分號(;) 和 注釋符號(--)的語句給替換掉來防止SQL注入
public static String TransactSQLInjection(String str) { return str.replaceAll(".*([';]+|(--)+).*", " "); // 我認為 應該是return str.replaceAll("([';])+|(--)+",""); } userName=TransactSQLInjection(userName); password=TransactSQLInjection(password); String sql="select * from users where username='"+userName+"' and password='"+password+"' " Statement sta = conn.createStatement(); ResultSet rs = sta.executeQuery(sql);
轉(zhuǎn)載地址:http://my.oschina.net/liangtee/blog/82159
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
