隨筆-31  評論-14  文章-0  trackbacks-0

          Sql注入.


          簡介.


          我們很容易從網上查找到sql注入的定義: 就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令,很容易遭到SQL注入式攻擊.

          用戶可以提交一段數據庫的查代碼,根據程序返回結果,獲得一些敏感的信息或是控制整個服務器.sql注入就發生了.

          當然我們要魔高一尺,道高一丈.


          防止sql注入:


            永遠不要信任用戶的輸入,對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和雙 - - (在數據庫中認為是數據庫語句的連接)進行轉換等.

            永遠不要動態拼接sql,可以使用參數化的sql或者直接使用存儲過程來進行數據查詢存取.

             永遠不要使用管理員權限的數據庫的連接,為每個應用使用單獨的權限書庫連接.

            不要把機密的信息直接存放,加密.

            應用的異常信息應該處僅少量的提示,最好使用自定義的錯誤信息對原始的錯誤進行封裝.

            采用軟件和有效的網站平臺來檢測sql注入.

           


          實例.(用參數化的sql進行插入來防止Sql注入)

          向數據庫的新聞類別表(category)通過字符串拼接的方法插入一條語句。


          插入函數的代碼.

          1. <span style="font-size:16px;">public bool Insert(string caName)  
          2.         {  
          3.             //標記位,并且賦初值.  
          4.             bool flag = false;  
          5.             string sql = "insert into category(name) values('" + caName + "')";  
          6.             flag = sqlhelper.ExecuteNonQuery(sql);  
          7.    
          8.             return flag;  
          9.         }</span>  


          我們的界面:



          我們在調試中可以看到傳入數據庫中的sql語句。


          Ctrl+F5我們不調試直接執行,或是我們把此sql語句復制在查詢分析器中執行。界面中我們可以看到。

          在增加一行的基礎同時我們id3的記錄消失了,被刪除了。


          讓我們對插入數據庫的插入代碼修改,用參數傳遞來代替數據庫字符串的拼接。

          SQLHelper加上個ExecuteQuery(string sql ,sqlParam[] paras)的重載.

          1. <span style="font-size: 14pt; ">    </span><span style="font-size:16px;">    /// <summary>  
          2.         ///該方法是通過參數傳遞來執行相應的sql語句.  
          3.         /// </summary>  
          4.         /// <param name="sql"></param>  
          5.         /// <param name="paras"></param>  
          6.         /// <returns></returns>  
          7.         public bool ExecuteNonquery(string sql, SqlParameter[] paras)  
          8.         {  
          9.             bool flag=false ;  
          10.             using (cmd = new SqlCommand(sql, GetConn()))  
          11.             {  
          12.                 //添加參數.  
          13.                 cmd.Parameters .Add (paras );  
          14.                 if (cmd.ExecuteNonQuery()>0)  
          15.                    {  
          16.                        flag =true;  
          17.                    }  
          18.             }  
          19.    
          20.             return flag;  
          21.         }</span><span style="font-size: 14pt;">  
          22. </span>  

          1. <span style="font-size:16px;">/// <summary>  
          2.         /// 增加新聞類別功能方法.  
          3.         /// </summary>  
          4.         /// <param name="caName">新聞類別字符串測試一下</param>  
          5.         /// <returns></returns>  
          6.         public bool Insert(string caName)  
          7.         {  
          8.             //標記位,并且賦初值.  
          9.             bool flag = false;  
          10.             string sql = "insert into category(name) values(@caName)";  
          11.             SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@caName", caName) };  
          12.             flag = sqlhelper.ExecuteNonQuery(sql);  
          13.    
          14.             return flag;  
          15.         }</span><span style="font-size: 14pt;">  
          16. </span>  
          這次我們再進行插入,結果如下.



          posted on 2012-07-09 23:13 zhanghu198901 閱讀(785) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 贡觉县| 民和| 新化县| 西乌珠穆沁旗| 永川市| 汕尾市| 手游| 宁安市| 红河县| 精河县| 长子县| 大同市| 青冈县| 建德市| 卓尼县| 梓潼县| 珠海市| 郁南县| 东源县| 渑池县| 嵊州市| 前郭尔| 山丹县| 灵川县| 根河市| 西乡县| 荣成市| 宁河县| 东兴市| 平乡县| 黄龙县| 洛宁县| 图木舒克市| 咸阳市| 肇源县| 滁州市| 崇阳县| 桂林市| 砚山县| 伊宁市| 武山县|