




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——php防止SQL注入的方法php防止SQL注入的方法
在php編程中,防范sql注入攻擊的簡樸方法,感興趣的摯友可以參考下,可能對日常的sql注入防范有確定的扶助。
sql注入產(chǎn)生的理由,一般如下:
一個(gè)是沒有對輸入的數(shù)據(jù)舉行過濾(過濾輸入),還有一個(gè)是沒有對發(fā)送到數(shù)據(jù)庫的數(shù)據(jù)舉行轉(zhuǎn)義(轉(zhuǎn)義輸出)。
這兩個(gè)重要的步驟缺一不成,需要同時(shí)加以更加關(guān)注以裁減程序錯(cuò)誤。
對于攻擊者來說,舉行SQL注入攻擊需要斟酌和試驗(yàn),對數(shù)據(jù)庫方案舉行有根有據(jù)的推理分外有必要(當(dāng)然假設(shè)攻擊者看不到你的源程序和數(shù)據(jù)庫方案)。
例子,一個(gè)簡樸的登錄表單:
復(fù)制代碼代碼例如:
formaction=/login.phpmethod=POST
pUsername:inputtype=textname=username//p
pPassword:inputtype=passwordname=password//p
pinputtype=submitvalue=LogIn//p
/form
攻擊者會(huì)從揣測驗(yàn)證用戶名和密碼的查詢語句開頭。通過查看源文件,他就能開頭推測你的習(xí)慣。
譬如命名習(xí)慣。通常會(huì)假設(shè)你表單中的字段名為與數(shù)據(jù)表中的字段名一致。當(dāng)然,確保它們不同未必是一個(gè)穩(wěn)當(dāng)?shù)陌埠么胧?/p>
第一次推測,一般會(huì)使用下面例子中的查詢:
復(fù)制代碼代碼例如:
?php
$password_hash=md5$_POST[password];
$sql=SELECTcount*
FROMusers
WHEREusername=$_POST[username]
ANDpassword=$password_hash;
?
使用用戶密碼的MD5值原來是一個(gè)通行的做法,但現(xiàn)在并不是更加安好了。
最近的研究說明MD5算法有缺陷,而且大量MD5數(shù)據(jù)庫降低了MD5反向破解的難度。
請?jiān)L問/查看演示。
最好的養(yǎng)護(hù)方法:
在密碼上附加一個(gè)自定義的字符串,例如:
復(fù)制代碼代碼例如:
?php
$salt=SHIFLETT;
$password_hash=md5$salt.md5$_POST[password].$salt;
?
當(dāng)然,攻擊者未必在第一次就能猜中,他們往往還需要做一些試驗(yàn)。有一個(gè)對比好的試驗(yàn)方式是把單引號作為用戶名錄入,理由是這樣可能會(huì)暴露一些重要信息。有好多開發(fā)人員在Mysql語句執(zhí)行出錯(cuò)時(shí)會(huì)調(diào)用函數(shù)mysql_error來報(bào)告錯(cuò)誤。見下面的例子:
復(fù)制代碼代碼例如:
?php
mysql_query$sqlorexitmysql_error;
?
該方法能向攻擊者暴露重要信息。假設(shè)攻擊者把單引號做為用戶名,mypass做為密碼,查詢語句就會(huì)變成:
復(fù)制代碼代碼例如:
?php
$sql=SELECT*
FROMusers
WHEREusername=
ANDpassword=a029d0df84eb5549c641e04a9ef389e5;
?
php防止SQL注入的方法
當(dāng)該語句發(fā)送到MySQL后,系統(tǒng)就會(huì)顯示如下錯(cuò)誤信息:
YouhaveanerrorinyourSQLsyntax.Checkthemanualthatcorrespondstoyour
MySQLserverversionfortherightsyntaxtousenearWHEREusername=AND
password=a029d0df84eb55
不費(fèi)吹灰之力,攻擊者已經(jīng)知道了兩個(gè)字段名username和password以及他們展現(xiàn)在查詢中的依次。除此以外,攻擊者還知道了數(shù)據(jù)沒有正確舉行過濾(程序沒有提示非法用戶名)和轉(zhuǎn)義(展現(xiàn)了數(shù)據(jù)庫錯(cuò)誤),同時(shí)整個(gè)WHERE條件的格式也暴露了,這樣,攻擊者就可以嘗試操縱符合查詢的記錄了。
在這一點(diǎn)上,攻擊者有好多選擇。一是嘗試填入一個(gè)特殊的用戶名,以使查詢無論用戶名密碼是否符合,都能得到匹配:
myuserorfoo=foo--
假定將mypass作為密碼,整個(gè)查詢就會(huì)變成:
復(fù)制代碼代碼例如:
?php
$sql=SELECT*
FROMusers
WHEREusername=myuserorfoo=foo--
ANDpassword=a029d0df84eb5549c641e04a9ef389e5;
?
幸運(yùn)的是,SQL注入是很輕易制止的。正如前面所提及的,你務(wù)必堅(jiān)持過濾輸入和轉(zhuǎn)義輸出。
雖然兩個(gè)步驟都不能省略,但只要實(shí)現(xiàn)其中的一個(gè)就能消釋大多數(shù)的SQL注入風(fēng)險(xiǎn)。假設(shè)你只是過濾輸入而沒有轉(zhuǎn)義輸出,你很可能會(huì)遇到數(shù)據(jù)庫錯(cuò)誤(合法的數(shù)據(jù)也可能影響SQL查詢的正確格式),但這也不成靠,合法的數(shù)據(jù)還可能變更SQL語句的行為。另一方面,假設(shè)你轉(zhuǎn)義了輸出,而沒有過濾輸入,就能保證數(shù)據(jù)不會(huì)影響SQL語句的格式,同時(shí)也防止了多種常見SQL注入攻擊的方法。
當(dāng)然,還是要堅(jiān)持同時(shí)使用這兩個(gè)步驟。過濾輸入的方式完全取決于輸入數(shù)據(jù)的類型(見第一章的例如),但轉(zhuǎn)義用于向數(shù)據(jù)庫發(fā)送的輸出數(shù)據(jù)只要使用同一個(gè)函數(shù)即可。對于MySQL用戶,可以使用函數(shù)mysql_real_escape_string:
復(fù)制代碼代碼例如:
?php
$clean=array;
$mysql=array;
$clean[last_name]=OReilly;
$mysql[last_name]=mysql_real_escape_string$clean[last_name];
$sql=INSERT
INTOuserlast_name
VALUES$mysql[last_name];
?
盡量使用為你的.數(shù)據(jù)庫設(shè)計(jì)的轉(zhuǎn)義函數(shù)。假設(shè)沒有,使用函數(shù)addslashes是最終的對比好的方法。
當(dāng)全體用于建立一個(gè)SQL語句的數(shù)據(jù)被正確過濾和轉(zhuǎn)義時(shí),實(shí)際上也就制止了SQL注入的風(fēng)險(xiǎn)。假設(shè)你正在使用支持參數(shù)化查詢語句和占位符的數(shù)據(jù)庫操作類(如PEAR::DB,PDO等),你就會(huì)多得到一層養(yǎng)護(hù)。見下面的使用PEAR::DB的例子:
復(fù)制代碼代碼例如:
?php
$sql=INSERT
INTOuserlast_name
VALUES?;
$dbh-query$sql,array$clean[last_name];
?
由于在上例中數(shù)據(jù)不能直接影響查詢語句的格式,SQL注入的風(fēng)險(xiǎn)就降低了。PEAR::DB會(huì)自動(dòng)根據(jù)你的數(shù)據(jù)庫的要求舉行轉(zhuǎn)義,所以你只需要過濾輸出即可。
假設(shè)正在使用參數(shù)化查詢語句,輸入的內(nèi)容就只會(huì)作為數(shù)據(jù)來處理。這樣就沒有必要舉行轉(zhuǎn)義了,盡管你可能認(rèn)為這是必要的一步(假設(shè)你夢想堅(jiān)持轉(zhuǎn)義輸出習(xí)慣的話)。實(shí)際上,這時(shí)是否轉(zhuǎn)義根本上不會(huì)產(chǎn)生影響,由于這時(shí)沒有特殊字符需要轉(zhuǎn)換。在防止SQL注入這一點(diǎn)上,參數(shù)化查詢語句為你的程序供給了強(qiáng)大的養(yǎng)護(hù)。
注:關(guān)于SQL注入,不得不
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 5到9章概括,昆蟲記
- 4年級上冊英語小報(bào)人教版第3單元
- 洛陽鏟施工方案
- 盤龍區(qū)施工方案
- 2025年浙江金融職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫參考答案
- 2025年海南職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫完整
- 2025年梧州職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫匯編
- 2025年重慶市廣安市單招職業(yè)適應(yīng)性測試題庫附答案
- 2025年鄂爾多斯職業(yè)學(xué)院單招職業(yè)傾向性測試題庫帶答案
- 北斗星基增強(qiáng)系統(tǒng)空間信號接口規(guī)范 第2部分:雙頻增強(qiáng)服務(wù)信號BDSBAS-B2a 征求意見稿
- DB37-T4824-2025 鄉(xiāng)鎮(zhèn)(街道)應(yīng)急物資配備指南
- 2025年國航機(jī)務(wù)系統(tǒng)AMECO技術(shù)員崗位校園招聘筆試參考題庫附帶答案詳解
- 2024年07月威海市商業(yè)銀行校園招考大學(xué)生報(bào)到筆試歷年參考題庫附帶答案詳解
- GJBZ 57-1994 維修性分配與預(yù)計(jì)手冊
- 2024年全國職業(yè)院校技能大賽(節(jié)水系統(tǒng)安裝與維護(hù)賽項(xiàng))考試題庫(含答案)
- GJB9001C-2017版標(biāo)準(zhǔn)培訓(xùn)課件
- 公益服務(wù)調(diào)研報(bào)告范文
- 電影配樂合同模板
- 2024年銅陵職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫完美版
- 充電樁施工環(huán)境保護(hù)方案
- 江蘇省南京市高三2024-2025學(xué)年上學(xué)期第一次學(xué)情調(diào)研英語試題(解析版)
評論
0/150
提交評論