qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          Web十大安全隱患之SQL注入

           注入往往是應(yīng)用程序缺少對輸入進(jìn)行安全性檢查所引起的,攻擊者把一些包含指令的數(shù)據(jù)發(fā)送給解釋器,解釋器會把收到的數(shù)據(jù)轉(zhuǎn)換成指令執(zhí)行。常見的注入包括SQL注入,OS Shell,LDAP,Xpath,Hibernate等等,而其中SQL注入尤為常見。這種攻擊所造成的后果往往很大,一般整個數(shù)據(jù)庫的信息都能被讀取或篡改,通過SQL注入,攻擊者甚至能夠獲得更多的包括管理員的權(quán)限。
            先來說說sql注入漏洞是怎么產(chǎn)生的,或者說對于一個程序開發(fā)人員應(yīng)該怎么防范SQL注入的吧。
            SQL注入往往是在編寫包含用戶輸入的動態(tài)數(shù)據(jù)庫查詢時產(chǎn)生的,但其實(shí)防范SQL注入的方法非常簡單。程序員只不再寫動態(tài)查詢,或防止用戶輸入包含能夠破壞查詢邏輯的惡意SQL語句,就能夠防范SQL注入。當(dāng)然,我作為一個測試人員說起來很容易,做起來就難了。
            我本人只會java,所以后邊我就用Java代碼作為示例:
          <font face="宋體" color="#000000">String query ="SELECT account_balance FROM  user_data WHERE user_name ="
          + request.getParameter("customerName");
          try {
          Statement statement =
          connection.createStatement( …);
          ResultSet results =
          Statement.executeQuery(query);
          }</font>
            在以上代碼中,我們可以看到并未對變量customerName做驗證,customerName的值可以直接附在query語句的后面?zhèn)魉偷綌?shù)據(jù)庫執(zhí)行,那么攻擊者可以將任意的sql語句注入。
            上邊說到怎么產(chǎn)生的,我們接著說怎么樣才能讓sql注入的漏洞避免。本來計劃把這一段放在如何測試之后再介紹,但是貌似先介紹出來更方便理解。
            防范方法一 :參數(shù)化查詢
            參數(shù)化查詢是所有開發(fā)人員在做數(shù)據(jù)庫查詢時首先需要學(xué)習(xí)的,參數(shù)化查詢迫使所有開發(fā)者首先要定義好所有的SQL代碼,然后再將每個參數(shù)逐個傳入,這種編碼風(fēng)格就能夠讓數(shù)據(jù)庫辨明代碼和數(shù)據(jù)。
            參數(shù)化查詢能夠確保攻擊者無法改變查詢的內(nèi)容,在下面修正過的例子中,如果攻擊者輸入了UsrID是“’or ‘1 ‘=’1”,參數(shù)化查詢會去查找一個完全滿足名字為‘or ‘1 ‘=’ 1的用戶。
            對于不同編程語言,有一些不同的建議:
            Java——使用帶綁定變量的PreparedStatement();
            其他的:。。。不好意思,真不會
            示例:
          <font face="宋體" color="#000000">String custname = request.getParameter("customerName");
          String query ="SELECT account_balance FROM user_data WHERE user_name= ?";
          PreparedStatement pstmt = connection.prepareStatement(query);
          Pstmt.setString1,custname();
          ResultSet results = pstmt.executeQuery();</font>
            防范方法二:存儲過程
            存儲過程和參數(shù)化查詢的作用是一樣的,唯一的不同在于存儲過程是預(yù)先定義并存放在數(shù)據(jù)庫中,從而被應(yīng)用程序調(diào)用的。
            Java存儲過程示例:
          String custname = request.getParameter("customerName");
          try {
          CallableStatement cs = connection.prepareCall("call sp_getAccountBalance(?)}");
          cs.setString(1,custname);
          Result results = cs.executeQuery();
          }catch(SQLException se){
          //error handling
          }

          posted on 2013-12-09 10:39 順其自然EVO 閱讀(331) 評論(0)  編輯  收藏 所屬分類: 安全性測試

          <2013年12月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 望江县| 五大连池市| 荃湾区| 文山县| 靖宇县| 常德市| 安泽县| 常山县| 崇文区| 商水县| 宜兰县| 彭泽县| 民勤县| 秀山| 馆陶县| 高碑店市| 华容县| 泰安市| 高青县| 南川市| 天水市| 景泰县| 瑞丽市| 吴川市| 施甸县| 宜春市| 萍乡市| 车致| 昔阳县| 筠连县| 株洲县| 讷河市| 板桥市| 巴东县| 五寨县| 桓台县| 湟源县| 全南县| 琼结县| 息烽县| 石门县|