亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

php安全編程—sql注入攻擊

系統(tǒng) 2116 0
原文: php安全編程—sql注入攻擊

php安全編程——sql注入攻擊

定義

  1. SQL注入攻擊指的是通過(guò)構(gòu)建特殊的輸入作為參數(shù)傳入Web應(yīng)用程序,而這些輸入大都是SQL語(yǔ)法里的一些組合,通過(guò)執(zhí)行SQL語(yǔ)句進(jìn)而執(zhí)行攻擊者所要的操作,其主要原因是程序沒(méi)有細(xì)致地過(guò)濾用戶輸入的數(shù)據(jù),致使非法數(shù)據(jù)侵入系統(tǒng)。
  2. 根據(jù)相關(guān)技術(shù)原理,SQL注入可以分為平臺(tái)層注入和代碼層注入。前者由不安全的數(shù)據(jù)庫(kù)配置或數(shù)據(jù)庫(kù)平臺(tái)的漏洞所致;后者主要是由于程序員對(duì)輸入未進(jìn)行細(xì)致地過(guò)濾,從而執(zhí)行了非法的數(shù)據(jù)查詢。基于此,SQL注入的產(chǎn)生原因通常表現(xiàn)在以下幾方面:

    • 不當(dāng)?shù)念愋吞幚恚?
    • 不安全的數(shù)據(jù)庫(kù)配置;
    • 不合理的查詢集處理;
    • 不當(dāng)?shù)腻e(cuò)誤處理;
    • 轉(zhuǎn)義字符處理不合適;
    • 多個(gè)提交處理不當(dāng)。
  3. 在某些表單中,用戶輸入的內(nèi)容直接用來(lái)構(gòu)造動(dòng)態(tài)sql命令,或者作為存儲(chǔ)過(guò)程的輸入?yún)?shù),這些表單特別容易受到sql注入的攻擊。而許多網(wǎng)站程序在編寫時(shí),沒(méi)有對(duì)用戶輸入的合法性進(jìn)行判斷或者程序中本身的變量處理不當(dāng),使應(yīng)用程序存在安全隱患。這樣,用戶就可以提交一段數(shù)據(jù)庫(kù)查詢的代碼,根據(jù)程序返回的結(jié)果,獲得一些敏感的信息或者控制整個(gè)服務(wù)器,于是sql注入就發(fā)生了

常用技術(shù)

  1. 強(qiáng)制產(chǎn)生錯(cuò)誤
    對(duì)數(shù)據(jù)庫(kù)類型、版本等信息進(jìn)行識(shí)別是此類型攻擊的動(dòng)機(jī)所在。它的目的是收集數(shù)據(jù)庫(kù)的類型、結(jié)構(gòu)等信息為其他類型的攻擊做準(zhǔn)備,可謂是攻擊的一個(gè)預(yù)備步驟。利用應(yīng)用程序服務(wù)器返回的默認(rèn)錯(cuò)誤信息而取得漏洞信息。
  2. 采用非主流通道技術(shù)
    除HTTP響應(yīng)外,能通過(guò)通道獲取數(shù)據(jù),然而,通道大都依賴與數(shù)據(jù)庫(kù)支持的功能而存在,所以這項(xiàng)技術(shù)不完全適用于所有的數(shù)據(jù)庫(kù)平臺(tái)。SQL注入的非主流通道主要有E-mail、DNS以及數(shù)據(jù)庫(kù)連接,基本思想為:先對(duì)SQL查詢打包,然后借助非主流通道將信息反饋至攻擊者。
  3. 使用特殊的字符
    不同的SQL數(shù)據(jù)庫(kù)有許多不同是特殊字符和變量,通過(guò)某些配置不安全或過(guò)濾不細(xì)致的應(yīng)用系統(tǒng)能夠取得某些有用的信息,從而對(duì)進(jìn)一步攻擊提供方向。
  4. 使用條件語(yǔ)句
    此方式具體可分為基于內(nèi)容、基于時(shí)間、基于錯(cuò)誤三種形式。一般在經(jīng)過(guò)常規(guī)訪問(wèn)后加上條件語(yǔ)句,根據(jù)信息反饋來(lái)判定被攻擊的目標(biāo)
  5. 利用存儲(chǔ)過(guò)程
    通過(guò)某些標(biāo)準(zhǔn)存儲(chǔ)過(guò)程,數(shù)據(jù)庫(kù)廠商對(duì)數(shù)據(jù)庫(kù)的功能進(jìn)行擴(kuò)展的同時(shí),系統(tǒng)也可與進(jìn)行交互。部分存儲(chǔ)過(guò)程可以讓用戶自行定義。通過(guò)其他類型的攻擊收集到數(shù)據(jù)庫(kù)的類型、結(jié)構(gòu)等信息后,便能夠建構(gòu)執(zhí)行存儲(chǔ)過(guò)程的命令。這種攻擊類型往往能達(dá)到遠(yuǎn)程命令執(zhí)行、特權(quán)擴(kuò)張、拒絕服務(wù)的目的。
  6. 避開輸入過(guò)濾技術(shù)
    雖然對(duì)于通常的編碼都可利用某些過(guò)濾技術(shù)進(jìn)行SQL注入防范,但是鑒于此種情況下也有許多方法避開過(guò)濾,一般可達(dá)到此目的的技術(shù)手段包括SQL注釋和動(dòng)態(tài)查詢的使用,利用截?cái)啵琔RL編碼與空字節(jié)的使用,大小寫變種的使用以及嵌套剝離后的表達(dá)式等等。借助于此些手段,輸入構(gòu)思后的查詢可以避開輸入過(guò)濾,從而攻擊者能獲得想要的查詢結(jié)果。
  7. 推斷技術(shù)
    能夠明確數(shù)據(jù)庫(kù)模式、提取數(shù)據(jù)以及識(shí)別可注入?yún)?shù)。此種方式的攻擊通過(guò)網(wǎng)站對(duì)用戶輸入的反饋信息,對(duì)可注入?yún)?shù)、數(shù)據(jù)庫(kù)模式推斷,這種攻擊構(gòu)造的查詢執(zhí)行后獲得的答案只有真、假兩種。基于推斷的注入方式主要分為時(shí)間測(cè)定注入與盲注入兩種。前者是在注入語(yǔ)句里加入語(yǔ)句諸如“waitfor 100”,按照此查詢結(jié)果出現(xiàn)的時(shí)間對(duì)注入能否成功和數(shù)據(jù)值范圍的推導(dǎo)進(jìn)行判定;后者主要是“and l=l”、“and l=2”兩種經(jīng)典注入方法。這些方式均是對(duì)一些間接關(guān)聯(lián)且能取得回應(yīng)的問(wèn)題進(jìn)行提問(wèn),進(jìn)而通過(guò)響應(yīng)信息推斷出想要信息,然后進(jìn)行攻擊

防范方法

  1. 強(qiáng)制字符格式(類型)

    • 對(duì)于整形變量, 運(yùn)用 intval函數(shù)將數(shù)據(jù)轉(zhuǎn)換成整數(shù)
    • 浮點(diǎn)型參數(shù):運(yùn)用 floatval或doubleval函數(shù)分別轉(zhuǎn)換單精度和雙精度浮點(diǎn)型參數(shù)
    • 字符型參數(shù):運(yùn)用 addslashes函數(shù)來(lái)將單引號(hào)“’”轉(zhuǎn)換成“\’”,雙引號(hào)“"”轉(zhuǎn)換成“"”,反斜杠“\”轉(zhuǎn)換成“\”,NULL字符加上反斜杠“\”如果是字符型,先判斷magic_quotes_gpc是否為On,當(dāng)不為On的時(shí)候運(yùn)用 addslashes轉(zhuǎn)義特殊字符
  2. 生產(chǎn)環(huán)境關(guān)閉數(shù)據(jù)庫(kù)錯(cuò)誤提示,以避免攻擊者得到數(shù)據(jù)庫(kù)的相關(guān)信息。
  3. SQL語(yǔ)句中包含變量加引號(hào)
    SELECT * FROM article WHERE articleid='$id'
    沒(méi)有把變量放進(jìn)單引號(hào)中,那我們所提交的一切,只要包含空格,那空格后的變量都會(huì)作為SQL語(yǔ)句執(zhí)行,給了攻擊者構(gòu)造特殊sql語(yǔ)句的可能。因此,我們要養(yǎng)成給SQL語(yǔ)句中變量加引號(hào)的習(xí)慣
  4. 使用pdo 使用 prepared statements ( 預(yù)處理語(yǔ)句 )和參數(shù)化的查詢。這些SQL語(yǔ)句被發(fā)送到數(shù)據(jù)庫(kù)服務(wù)器,它的參數(shù)全都會(huì)被單獨(dú)解析。使用這種方式,攻擊者想注入惡意的SQL是不可能的

    • 使用PDO訪問(wèn)MySQL數(shù)據(jù)庫(kù)時(shí),真正的real prepared statements 默認(rèn)情況下是不使用的。為了解決這個(gè)問(wèn)題,你必須禁用 prepared statements的仿真效果。下面是使用PDO創(chuàng)建鏈接的例子:

                  
                    <?php  
      
      $dbh = new PDO('mysql:dbname=mydb;host=127.0.0.1;charset=utf8', 'root', 'pass');  
      
      $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);  
      
      ?>  
                  
                

      這可以確保SQL語(yǔ)句和相應(yīng)的值在傳遞到mysql服務(wù)器之前是不會(huì)被PHP解析的(禁止了所有可能的惡意SQL注入攻擊)

    完整示例代碼:

            
                  <?php  
    
        $dbh = new PDO("mysql:host=localhost; dbname=mydb", "root", "pass");  
    
        $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的仿真效果  
    
        $dbh->exec("set names 'utf8'");   
    
        $sql="select * from table where username = ? and password = ?";  
    
        $query = $dbh->prepare($sql);   
    
        $exeres = $query->execute(array($username, $pass));   
    
        if ($exeres) {   
    
            while ($row = $query->fetch(PDO::FETCH_ASSOC)) {  
    
                print_r($row);  
    
            }  
    
        }  
    
        $dbh = null;  
    
        ?>  
            
          
    當(dāng)調(diào)用 prepare() 時(shí),查詢語(yǔ)句已經(jīng)發(fā)送給了數(shù)據(jù)庫(kù)服務(wù)器,此時(shí)只有占位符 ? 發(fā)送過(guò)去,沒(méi)有用戶提交的數(shù)據(jù);當(dāng)調(diào)用到 execute()時(shí),用戶提交過(guò)來(lái)的值才會(huì)傳送給數(shù)據(jù)庫(kù),它們是分開傳送的,兩者獨(dú)立的,SQL攻擊者沒(méi)有一點(diǎn)機(jī)會(huì)。
  5. 如下幾種情況,pdo prepared statements 將不能起到防范的作用

    • PDO::ATTR_EMULATE_PREPARES 啟用或禁用預(yù)處理語(yǔ)句的模擬。 有些驅(qū)動(dòng)不支持或有限度地支持本地預(yù)處理。使用此設(shè)置強(qiáng)制PDO總是模擬預(yù)處理語(yǔ)句(如果為 TRUE ),或試著使用本地預(yù)處理語(yǔ)句(如果為 FALSE)。如果驅(qū)動(dòng)不能成功預(yù)處理當(dāng)前查詢,它將總是回到模擬預(yù)處理語(yǔ)句上。
    • 不能讓占位符 ? 代替一組值,這樣只會(huì)獲取到這組數(shù)據(jù)的第一個(gè)值,
      select * from table where userid in ( ? );
      如果要用in來(lái)查找,可以改用find_in_set()實(shí)現(xiàn):
      $ids = '1,2,3,4,5,6'; select * from table where find_in_set(userid, ?);
    • 不能讓占位符代替數(shù)據(jù)表名或列名,如:
      select * from table order by ?;
    • 不能讓占位符 ? 代替任何其他SQL語(yǔ)法,如:
      select extract( ? from addtime) as mytime from table;

php安全編程—sql注入攻擊


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 一本到在线观看视频不卡 | 深夜福利免费观看 | 淫视频网站 | 色射色 | 奇米影视777中文久久爱 | 午夜久久久久久 | 亚洲欧洲精品成人久久曰 | 色视频在线免费观看 | 欧美爱爱片 | 热热色视频 | 日本不卡在线 | 久草中文网 | 婷婷色中文字幕 | 青草草在线观看 | 农村三级孕妇视频在线 | 福利姬在线视频国产观看 | 99精品热女视频专线 | 日韩欧美综合视频 | 免费一级黄色毛片 | 国内精品久久久久影院6 | 国产欧美亚洲精品综合在线 | 久久做 | 精品欧美一区二区精品久久 | 亚洲国产欧美日韩一区二区 | 久久久久久久九九九九 | 久久99精品一区二区三区 | 桃花综合| 波多野结衣一区二区在线 | 日韩精品一区二区三区 在线观看 | 亚洲高清视频在线 | 欧美jizzhd欧美巨大 | 欧美体内she精视频毛片 | 中文字幕在线不卡精品视频99 | 四虎影院免费在线播放 | 国产亚洲第一 | 伊人精品视频一区二区三区 | 色噜噜狠狠色综合久 | 色综合中文字幕 | 亚洲视频精品在线观看 | 最新日本免费一区二区三区中文 | 97热在线 |