成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

在PHP中全面阻止SQL注入式攻擊之三

瀏覽:161日期:2024-02-11 11:32:36

一、 建立一個安全抽象層

我們并不建議你手工地把前面介紹的技術(shù)應(yīng)用于每一個用戶輸入的實例中,而是強(qiáng)烈推薦你為此創(chuàng)建一個抽象層。一個簡單的抽象是把你的校驗方案加入到一個函數(shù)中,并且針對用戶輸入的每一項調(diào)用這個函數(shù)。當(dāng)然,我們還可以創(chuàng)建一種更復(fù)雜的更高一級的抽象-把一個安全的查詢封裝到一個類中,從而應(yīng)用于整個應(yīng)用程序。在網(wǎng)上已經(jīng)存在許多這種現(xiàn)成的免費的類;在本篇中,我們正要討論其中的一些。

進(jìn)行這種抽象至少存在三個優(yōu)點(而且每一個都會改進(jìn)安全級別):

1. 本地化代碼。

2. 使查詢的構(gòu)造更快且更為可靠-因為這可以把部分工作交由抽象代碼來實現(xiàn)。

3. 當(dāng)基于安全特征進(jìn)行構(gòu)建并且恰當(dāng)使用時,這將會有效地防止我們前面所討論的各種各樣的注入式攻擊。

二、 改進(jìn)現(xiàn)有的應(yīng)用程序

如果你想改進(jìn)一個現(xiàn)有的應(yīng)用程序,則使用一個簡單的抽象層是最適當(dāng)?shù)摹R粋€能夠簡單地'清理'你所收集的任何用戶輸入內(nèi)容的函數(shù)可能看起來如下所示:

function safe( $string ) { return ''' . mysql_real_escape_string( $string ) . '''}

【注意】我們已經(jīng)構(gòu)建了相應(yīng)于值要求的單引號以及mysql_real_escape_string()函數(shù)。接下來,就可以使用這個函數(shù)來構(gòu)造一個$query變量,如下所示:

$variety = safe( $_POST['variety'] );$query = ' SELECT * FROM wines WHERE variety=' . $variety;

現(xiàn)在,你的用戶試圖進(jìn)行一個注入式攻擊-通過輸入下列內(nèi)容作為變量$variety的值:

lagrein' or 1=1;

注意,如果不進(jìn)行上面的'清理',則最后的查詢將如下所示(這將導(dǎo)致無法預(yù)料的結(jié)果):

SELECT * FROM wines WHERE variety = 'lagrein' or 1=1;'

然而現(xiàn)在,既然用戶的輸入已經(jīng)被清理,那么查詢語句就成為下面這樣一種無危害的形式:

SELECT * FROM wines WHERE variety = 'lagrein' or 1=1;'

既然數(shù)據(jù)庫中不存在與指定的值相應(yīng)的variety域(這正是惡意用戶所輸入的內(nèi)容-lagrein' or 1=1;),那么,這個查詢將不能返回任何結(jié)果,并且注入將會失敗。

三、 保護(hù)一個新的應(yīng)用程序

如果你正在創(chuàng)建一個新的應(yīng)用程序,那么,你可以從頭開始創(chuàng)建一個安全抽象層。如今,PHP 5新改進(jìn)的對于MySQL的支持(這主要體現(xiàn)在新的mysqli擴(kuò)展中)為這種安全特征提供了強(qiáng)有力的支持(既有過程性的,也有面向?qū)ο筇卣鞯模D憧梢詮恼军chttp://php.net/mysqli上獲取有關(guān)mysqli的信息。注意,只有當(dāng)你使用--with-mysqli=path/to/mysql_config選項編譯PHP時,這種mysqli支持才可用。下面是該代碼的一個過程性版本,用于保護(hù)一個基于mysqli的查詢:

<?php //檢索用戶的輸入 $animalName = $_POST['animalName']; //連接到數(shù)據(jù)庫 $connect = mysqli_connect( 'localhost', 'username', 'password', 'database' ); if ( !$connect ) exit( 'connection failed: ' . mysqli_connect_error() ); //創(chuàng)建一個查詢語句源 $stmt = mysqli_prepare( $connect,'SELECT intelligence FROM animals WHERE name = ?' ); if ( $stmt ) {//把替代綁定到語句上mysqli_stmt_bind_param( $stmt, 's', $animalName );//執(zhí)行該語句mysqli_stmt_execute( $stmt );//檢索結(jié)果...mysqli_stmt_bind_result( $stmt, $intelligence );// ...并顯示它if ( mysqli_stmt_fetch( $stmt ) ) { print 'A $animalName has $intelligence intelligence.n';} else { print 'Sorry, no records found.';}//清除語句源mysqli_stmt_close( $stmt ); } mysqli_close( $connect );?>

該mysqli擴(kuò)展提供了一組函數(shù)用于構(gòu)造和執(zhí)行查詢。而且,它也非常準(zhǔn)確地提供了前面使用我們自己的safe()函數(shù)所實現(xiàn)的功能。

在上面的片斷中,首先收集用戶提交的輸入內(nèi)容并建立數(shù)據(jù)庫連接。然后,使用mysqli_prepare()函數(shù)創(chuàng)建一個查詢語句源-在此命名為$stmt以反映使用它的函數(shù)的名稱。這個函數(shù)使用了兩個參數(shù):連接資源和一個字符串(每當(dāng)你使用擴(kuò)展插入一個值時,'?'標(biāo)記被插入到其中)。在本例中,你僅有一個這樣的值-動物的名字。

注意,在一個SELECT語句中,放置'?'標(biāo)記的唯一的有效位置是在值比較部分。這正是為什么你不需要指定使用哪個變量的原因(除了在mysqli_stmt_bind_param()函數(shù)中之外)。在此,你還需要指定它的類型-在本例中,'s'代表字符串。其它可能的類型有:'I'代表整數(shù),'d'代表雙精度數(shù)(或浮點數(shù)),而'b'代表二進(jìn)制字符串。

函數(shù)mysqli_stmt_execute(),mysqli_stmt_bind_result()和mysqli_stmt_fetch()負(fù)責(zé)執(zhí)行查詢并檢索結(jié)果。如果存在檢索結(jié)果,則顯示它們;如果不存在結(jié)果,則顯示一條無害的消息。最后,你需要關(guān)閉$stmt資源以及數(shù)據(jù)庫連接-從內(nèi)存中對它們加以釋放。

假定一個合法的用戶輸入了字符串'lemming',那么這個例程將(假定是數(shù)據(jù)庫中適當(dāng)?shù)臄?shù)據(jù))輸出消息'A lemming has very low intelligence.'。假定存在一個嘗試性注入-例如'lemming' or 1=1;',那么這個例程將打印(無害)消息'Sorry, no records found.'。此外,mysqli擴(kuò)展還提供了一個面向?qū)ο蟀姹镜南嗤睦獭O旅妫覀兿胝f明這種版本的使用方法。

<?php $animalName = $_POST['animalName']; $mysqli = new mysqli( 'localhost', 'username', 'password', 'database'); if ( !$mysqli ) exit( 'connection failed: ' . mysqli_connect_error() ); $stmt = $mysqli->prepare( 'SELECT intelligence FROM animals WHERE name = ?' ); if ( $stmt ) {$stmt->bind_param( 's', $animalName );$stmt->execute();$stmt->bind_result( $intelligence );if ( $stmt->fetch() ) { print 'A $animalName has $intelligence intelligence.n';} else { print 'Sorry, no records found.';}$stmt->close(); } $mysqli->close();?>

實際上,這部分代碼是前面描述代碼的復(fù)制-它使用了一種面向?qū)ο蟮恼Z法和組織方法,而不是嚴(yán)格的過程式代碼。四、 更高級的抽象

如果你使用外部庫PearDB,那么,你可以對應(yīng)用程序的安全保護(hù)模塊進(jìn)行全面的抽象。

另一方面,使用這個庫存在一個突出的缺點:你只能受限于某些人的思想,而且代碼管理方面也添加了大量的工作。為此,在決定是否使用它們之前,你需要進(jìn)行仔細(xì)地斟酌。如果你決定這樣做,那么,你至少確保它們能夠真正幫助你'清理'你的用戶輸入的內(nèi)容。

五、 測試你的注入式保護(hù)能力

正如我們在前面所討論的,確保你的腳本安全的一個重要的部分是對它們進(jìn)行測試。為此,最好的辦法是你自己創(chuàng)建SQL代碼注入測試。在此,我們提供了一個這種測試的示例。在本例中,我們測試對一個SELECT語句的注入式攻擊。

<?php//被測試的保護(hù)函數(shù)function safe( $string ) { return ''' . mysql_real_escape_string( $string ) . '''}//連接到數(shù)據(jù)庫/////////////////////////試圖進(jìn)行注入///////////////////////$exploit = 'lemming' AND 1=1;';//進(jìn)行清理$safe = safe( $exploit );$query = 'SELECT * FROM animals WHERE name = $safe';$result = mysql_query( $query );//測試是否保護(hù)是足夠的if ( $result && mysql_num_rows( $result ) == 1 ) { exitt 'Protection succeeded:n exploit $exploit was neutralized.';}else { exit( 'Protection failed:n exploit $exploit was able to retrieve all rows.' );}?>

如果你想創(chuàng)建這樣的一個測試集,并試驗基于不同的SQL命令的各種不同的注入,那么,你將會很快地探測出你的保護(hù)策略中的任何漏洞。一旦糾正這些問題,那么,你就可以很有把握-你已經(jīng)建立起真正的注入式攻擊保護(hù)機(jī)制。

六、 小結(jié)

在本系列文章一開始,我們通過一個SQL注入討論分析了對你的腳本的特定威脅-由不恰當(dāng)?shù)挠脩糨斎胨隆V螅覀兠枋隽薙QL注入的工作原理并精確地分析了PHP是怎樣易于被注入的。然后,我們提供了一個實際中的注入示例。之后,我們推薦一系列措施來使試圖的注入攻擊變?yōu)闊o害的-這將分別通過確保使所有提交的值以引號封閉,通過檢查用戶提交值的類型,以及通過過濾掉你的用戶輸入的潛在危險的字符等方法來實現(xiàn)的。最后,我們推薦,你最好對你的校驗例程進(jìn)行抽象,并針對更改一個現(xiàn)有應(yīng)用程序提供了腳本示例。然后,我們討論了第三方抽象方案的優(yōu)缺點。

全文完

標(biāo)簽: PHP
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
99久久国产免费看| 欧美一区二区三区免费大片| 久久国产一区| 国产精品国产三级国产| av不卡免费电影| 欧美一二三区精品| 国产精品一区二区久久精品爱涩| 色婷婷国产精品综合在线观看| 夜色激情一区二区| 一本色道久久综合亚洲精品不 | 成人app软件下载大全免费| 欧美色中文字幕| 男男视频亚洲欧美| 久久亚洲色图| 亚洲国产视频一区| 国产精品亚洲不卡a| 亚洲精品国产无天堂网2021| 日韩视频在线播放| 一区二区在线观看不卡| 在线亚洲自拍| 亚洲已满18点击进入久久| 日韩视频在线播放 | 欧美丰满美乳xxx高潮www| 久久国产生活片100| 欧美性大战久久久久久久| 免费av网站大全久久| 在线一区二区三区四区五区| 青青草精品视频| 欧美吞精做爰啪啪高潮| 久久精品二区亚洲w码| 欧亚洲嫩模精品一区三区| 日韩不卡一区二区| 91精品1区2区| 久久精品国产第一区二区三区| 欧美日韩一区二区三区免费看 | 久久av中文字幕片| 宅男噜噜噜66一区二区66| 国产成人综合亚洲网站| 精品国产网站在线观看| 色综合久久中文字幕综合网| 欧美高清一级片在线观看| 欧美日韩一区在线观看视频| 国产精品夫妻自拍| 99re66热这里只有精品4| 亚洲午夜私人影院| 欧美特级限制片免费在线观看| 久久成人麻豆午夜电影| 91精品国产麻豆国产自产在线| 国产+成+人+亚洲欧洲自线| 2023国产一二三区日本精品2022| 欧美成人蜜桃| 亚洲美女在线一区| 亚洲在线播放| 蜜臀久久99精品久久久久宅男 | 欧美日韩免费观看一区| 亚洲日本免费电影| 久久久国产精品一区二区三区| 免费观看在线综合| 日韩三级电影网址| 亚洲视频福利| 无码av免费一区二区三区试看| 欧美日韩综合不卡| 99re热这里只有精品免费视频| 国产精品大尺度| 午夜在线精品偷拍| 国产乱码精品一区二区三区五月婷| 精品久久久久av影院| 国内精品久久久久久久影视蜜臀| 亚洲综合在线第一页| 欧美日韩国产欧美日美国产精品| eeuss影院一区二区三区| 中文字幕在线观看一区| 久久在线视频| 丁香桃色午夜亚洲一区二区三区| 国产日韩欧美一区二区三区综合| 日韩一级在线| 另类小说综合欧美亚洲| 欧美大白屁股肥臀xxxxxx| 国产一区日韩欧美| 日本三级韩国三级欧美三级| 欧美一区二区黄| 国产精品观看| 亚洲一区二区三区在线| 这里只有精品免费| 狠狠综合久久| 蜜臀av在线播放一区二区三区| 精品久久久久99| 一区二区激情| 精品亚洲欧美一区| 国产欧美日韩另类视频免费观看| 久久久久免费| 99热在这里有精品免费| 亚洲大型综合色站| 欧美一级黄色录像| 99综合精品| 国产精品1024久久| 亚洲日本在线观看| 91久久午夜| 韩国v欧美v亚洲v日本v| 中文字幕一区二区在线观看| 在线精品视频免费观看| 你懂的国产精品| 蜜桃av一区二区在线观看| 国产欧美一区二区精品忘忧草| 久久国产一区二区| 91年精品国产| 日韩激情一二三区| 国产午夜三级一区二区三| 色网站国产精品| 欧美成人69av| 久久99国产精品麻豆| 亚洲日本护士毛茸茸| 欧美高清精品3d| 日韩视频免费| www.欧美日韩国产在线| 午夜视频一区二区| 亚洲精品一区二区三区福利| 色噜噜久久综合| 欧美日韩一区在线播放| 精彩视频一区二区三区| 亚洲美女屁股眼交| 精品久久久久久久久久久久久久久久久 | 91无套直看片红桃| 日韩成人免费看| 亚洲欧洲一区二区在线播放| 欧美电影在线免费观看| 国产亚洲在线观看| 91丨porny丨最新| 国内精品在线播放| 又紧又大又爽精品一区二区| 欧美r级在线观看| 欧美亚洲动漫另类| 亚洲激情一区| 94色蜜桃网一区二区三区| 青青草97国产精品免费观看 | 国产精品一级二级三级| 水蜜桃久久夜色精品一区的特点| 久久―日本道色综合久久| 欧美视频一区二区三区四区 | 欧美日韩国产免费观看| 国产精品一区二区在线观看不卡| 亚洲成人久久影院| 中文字幕不卡一区| 精品久久人人做人人爱| 欧美三级韩国三级日本一级| 国产精品久久久久久模特| 欧美精品一线| 丁香激情综合国产| 精品制服美女丁香| 天天av天天翘天天综合网色鬼国产 | 亚洲精品1区2区| 欧美不卡福利| 97久久超碰国产精品| 国产伦精品一区二区三区视频青涩 | 7777女厕盗摄久久久| 在线观看国产精品网站| 亚洲综合激情| 99综合精品| 午夜日韩激情| 91丨九色porny丨蝌蚪| 国产aⅴ综合色| 久久精品国产精品青草| 日韩福利视频导航| 亚洲大片精品永久免费| 一级精品视频在线观看宜春院 | 视频一区二区中文字幕| 一区二区三区四区在线| 欧美高清在线精品一区| 日韩精品一区二区三区蜜臀| 欧美色图片你懂的| 国产一区二区三区高清| 在线看无码的免费网站| 欧美国产先锋| zzijzzij亚洲日本少妇熟睡| 麻豆精品在线视频| 亚洲精品欧美激情| 亚洲三级在线免费观看| 国产精品三级在线观看| 久久这里只有精品首页| 2023国产精品视频| 亚洲精品一区二区精华| 精品欧美一区二区久久| 日韩欧美在线影院| 欧美一区二区三区视频在线| 91麻豆精品91久久久久久清纯| 91精品欧美久久久久久动漫| 在线91免费看| 欧美日本国产一区| 欧美乱熟臀69xxxxxx| 欧美乱妇15p| 3d成人h动漫网站入口| 51午夜精品国产| 日韩一二三区不卡| 欧美一区二区播放| 日韩亚洲电影在线| 欧美变态口味重另类| 久久久久久久电影| 国产日韩欧美不卡在线| 欧美国产成人在线| 亚洲同性同志一二三专区|