日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php安全编程—sql注入攻击

發(fā)布時(shí)間:2025/4/5 php 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php安全编程—sql注入攻击 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
原文:php安全編程—sql注入攻擊

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

定義

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

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

  • 常用技術(shù)

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

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

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

    • 使用PDO訪問MySQL數(shù)據(jù)庫時(shí),真正的real prepared statements 默認(rèn)情況下是不使用的。為了解決這個(gè)問題,你必須禁用 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ī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í),查詢語句已經(jīng)發(fā)送給了數(shù)據(jù)庫服務(wù)器,此時(shí)只有占位符 ? 發(fā)送過去,沒有用戶提交的數(shù)據(jù);當(dāng)調(diào)用到 execute()時(shí),用戶提交過來的值才會(huì)傳送給數(shù)據(jù)庫,它們是分開傳送的,兩者獨(dú)立的,SQL攻擊者沒有一點(diǎn)機(jī)會(huì)。
  • 如下幾種情況,pdo prepared statements 將不能起到防范的作用

    • PDO::ATTR_EMULATE_PREPARES 啟用或禁用預(yù)處理語句的模擬。 有些驅(qū)動(dòng)不支持或有限度地支持本地預(yù)處理。使用此設(shè)置強(qiáng)制PDO總是模擬預(yù)處理語句(如果為 TRUE ),或試著使用本地預(yù)處理語句(如果為 FALSE)。如果驅(qū)動(dòng)不能成功預(yù)處理當(dāng)前查詢,它將總是回到模擬預(yù)處理語句上。
    • 不能讓占位符 ? 代替一組值,這樣只會(huì)獲取到這組數(shù)據(jù)的第一個(gè)值,
      select * from table where userid in ( ? );
      如果要用in來查找,可以改用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語法,如:
      select extract( ? from addtime) as mytime from table;
  • 總結(jié)

    以上是生活随笔為你收集整理的php安全编程—sql注入攻击的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。