qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 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注入尤為常見。這種攻擊所造成的后果往往很大,一般整個(gè)數(shù)據(jù)庫的信息都能被讀取或篡改,通過SQL注入,攻擊者甚至能夠獲得更多的包括管理員的權(quán)限。
            先來說說sql注入漏洞是怎么產(chǎn)生的,或者說對于一個(gè)程序開發(fā)人員應(yīng)該怎么防范SQL注入的吧。
            SQL注入往往是在編寫包含用戶輸入的動態(tài)數(shù)據(jù)庫查詢時(shí)產(chǎn)生的,但其實(shí)防范SQL注入的方法非常簡單。程序員只不再寫動態(tài)查詢,或防止用戶輸入包含能夠破壞查詢邏輯的惡意SQL語句,就能夠防范SQL注入。當(dāng)然,我作為一個(gè)測試人員說起來很容易,做起來就難了。
            我本人只會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做驗(yàn)證,customerName的值可以直接附在query語句的后面?zhèn)魉偷綌?shù)據(jù)庫執(zhí)行,那么攻擊者可以將任意的sql語句注入。
            上邊說到怎么產(chǎn)生的,我們接著說怎么樣才能讓sql注入的漏洞避免。本來計(jì)劃把這一段放在如何測試之后再介紹,但是貌似先介紹出來更方便理解。
            防范方法一 :參數(shù)化查詢
            參數(shù)化查詢是所有開發(fā)人員在做數(shù)據(jù)庫查詢時(shí)首先需要學(xué)習(xí)的,參數(shù)化查詢迫使所有開發(fā)者首先要定義好所有的SQL代碼,然后再將每個(gè)參數(shù)逐個(gè)傳入,這種編碼風(fēng)格就能夠讓數(shù)據(jù)庫辨明代碼和數(shù)據(jù)。
            參數(shù)化查詢能夠確保攻擊者無法改變查詢的內(nèi)容,在下面修正過的例子中,如果攻擊者輸入了UsrID是“’or ‘1 ‘=’1”,參數(shù)化查詢會去查找一個(gè)完全滿足名字為‘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 閱讀(329) 評論(0)  編輯  收藏 所屬分類: 安全性測試

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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 卢龙县| 泌阳县| 胶州市| 房山区| 舒兰市| 三河市| 南川市| 临澧县| 疏附县| 望奎县| 荆门市| 巫溪县| 右玉县| 锦州市| 邛崃市| 龙山县| 洛宁县| 香格里拉县| 吉安县| 诸暨市| 塔河县| 平陆县| 吉木萨尔县| 晋中市| 灵台县| 革吉县| 胶州市| 巴东县| 玉田县| 河西区| 甘孜| 桓仁| 治县。| 城步| 衢州市| 镇平县| 汝州市| 北流市| 新源县| 曲阳县| 廊坊市|