日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

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

一、 建立一個安全抽象層

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

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

1. 本地化代碼。

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

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

二、 改進現有的應用程序

如果你想改進一個現有的應用程序,則使用一個簡單的抽象層是最適當的。一個能夠簡單地'清理'你所收集的任何用戶輸入內容的函數可能看起來如下所示:

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

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

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

現在,你的用戶試圖進行一個注入式攻擊-通過輸入下列內容作為變量$variety的值:

lagrein' or 1=1;

注意,如果不進行上面的'清理',則最后的查詢將如下所示(這將導致無法預料的結果):

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

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

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

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

三、 保護一個新的應用程序

如果你正在創建一個新的應用程序,那么,你可以從頭開始創建一個安全抽象層。如今,PHP 5新改進的對于MySQL的支持(這主要體現在新的mysqli擴展中)為這種安全特征提供了強有力的支持(既有過程性的,也有面向對象特征的)。你可以從站點http://php.net/mysqli上獲取有關mysqli的信息。注意,只有當你使用--with-mysqli=path/to/mysql_config選項編譯PHP時,這種mysqli支持才可用。下面是該代碼的一個過程性版本,用于保護一個基于mysqli的查詢:

<?php //檢索用戶的輸入 $animalName = $_POST['animalName']; //連接到數據庫 $connect = mysqli_connect( 'localhost', 'username', 'password', 'database' ); if ( !$connect ) exit( 'connection failed: ' . mysqli_connect_error() ); //創建一個查詢語句源 $stmt = mysqli_prepare( $connect,'SELECT intelligence FROM animals WHERE name = ?' ); if ( $stmt ) {//把替代綁定到語句上mysqli_stmt_bind_param( $stmt, 's', $animalName );//執行該語句mysqli_stmt_execute( $stmt );//檢索結果...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擴展提供了一組函數用于構造和執行查詢。而且,它也非常準確地提供了前面使用我們自己的safe()函數所實現的功能。

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

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

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

假定一個合法的用戶輸入了字符串'lemming',那么這個例程將(假定是數據庫中適當的數據)輸出消息'A lemming has very low intelligence.'。假定存在一個嘗試性注入-例如'lemming' or 1=1;',那么這個例程將打印(無害)消息'Sorry, no records found.'。此外,mysqli擴展還提供了一個面向對象版本的相同的例程。下面,我們想說明這種版本的使用方法。

<?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();?>

實際上,這部分代碼是前面描述代碼的復制-它使用了一種面向對象的語法和組織方法,而不是嚴格的過程式代碼。四、 更高級的抽象

如果你使用外部庫PearDB,那么,你可以對應用程序的安全保護模塊進行全面的抽象。

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

五、 測試你的注入式保護能力

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

<?php//被測試的保護函數function safe( $string ) { return ''' . mysql_real_escape_string( $string ) . '''}//連接到數據庫/////////////////////////試圖進行注入///////////////////////$exploit = 'lemming' AND 1=1;';//進行清理$safe = safe( $exploit );$query = 'SELECT * FROM animals WHERE name = $safe';$result = mysql_query( $query );//測試是否保護是足夠的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.' );}?>

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

六、 小結

在本系列文章一開始,我們通過一個SQL注入討論分析了對你的腳本的特定威脅-由不恰當的用戶輸入所致。之后,我們描述了SQL注入的工作原理并精確地分析了PHP是怎樣易于被注入的。然后,我們提供了一個實際中的注入示例。之后,我們推薦一系列措施來使試圖的注入攻擊變為無害的-這將分別通過確保使所有提交的值以引號封閉,通過檢查用戶提交值的類型,以及通過過濾掉你的用戶輸入的潛在危險的字符等方法來實現的。最后,我們推薦,你最好對你的校驗例程進行抽象,并針對更改一個現有應用程序提供了腳本示例。然后,我們討論了第三方抽象方案的優缺點。

全文完

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国产欧美| 日本特黄久久久高潮| 麻豆精品蜜桃视频网站| 国模大尺度视频一区二区| 激情综合网站| 欧美日韩在线精品一区二区三区激情综合| а√天堂8资源在线| 蜜桃一区二区三区在线观看| 你懂的亚洲视频| 福利欧美精品在线| 欧美+亚洲+精品+三区| 亚洲日本久久| 日本综合字幕| 国产亚洲一卡2卡3卡4卡新区| 国产精品1区| 免费精品视频| 成人午夜网址| 日韩精品久久久久久久电影99爱| 国产精品婷婷| 免费观看亚洲| 99pao成人国产永久免费视频| 欧美影院视频| 日韩成人综合| 美美哒免费高清在线观看视频一区二区| 欧美午夜三级| 国产麻豆综合| 精品三级在线观看视频| 日韩一区二区三区四区五区| 99视频精品全国免费| 蜜桃久久久久久| 成人国产综合| 亚洲另类黄色| 精品捆绑调教一区二区三区| 黄色网一区二区| 欧美成人国产| 国产高清亚洲| 香蕉视频成人在线观看| 成人在线视频区| 亚洲日本国产| 999国产精品| 国产精品va| 丝袜美腿高跟呻吟高潮一区| 91视频精品| 啪啪亚洲精品| 亚洲精品午夜av福利久久蜜桃| 久久视频一区| 欧美中文高清| 午夜在线播放视频欧美| 中文在线а√天堂| 日韩国产在线观看一区| 欧美1级日本1级| 国产一区二区久久久久| 视频一区日韩精品| 亚洲天堂免费| 中文字幕成在线观看| 奇米色欧美一区二区三区| 婷婷久久一区| 午夜影院一区| 久久精品日韩欧美| 日韩av不卡在线观看| 亚洲视频www| 夜夜嗨一区二区| 久久精品一区二区国产| 宅男噜噜噜66国产日韩在线观看| 亚洲精品三级| 在线观看精品| 欧美日韩夜夜| 欧美91精品| 国产成人精品三级高清久久91| 中文字幕一区二区三区四区久久 | 久久久久久婷| 欧美伊人影院| 精品成人免费一区二区在线播放| 日韩三级一区| 久久国产小视频| 国产欧美一级| 青青在线精品| 久久久精品日韩| 国产精品欧美一区二区三区不卡| japanese国产精品| 精品福利久久久| 日本视频一区二区| 国产一区91| 香蕉成人av| 欧美国产先锋| 天堂久久一区| 一区二区视频欧美| 中文字幕在线官网| 国产精品亲子伦av一区二区三区| 蜜臀精品久久久久久蜜臀 | 国产日产一区| 国产精品视区| 久久在线视频免费观看| 91精品国产乱码久久久久久久| 日本欧美大码aⅴ在线播放| 中文日韩欧美| 1000部精品久久久久久久久| 国产成人精选| 欧美国产精品| 欧美另类中文字幕| 中文字幕日韩高清在线| 一区二区自拍| 亚洲福利一区| 国产欧美一区二区三区精品酒店 | 午夜在线视频观看日韩17c| 日本韩国欧美超级黄在线观看| 久久久久亚洲精品中文字幕| 久久精品凹凸全集| 亚洲欧洲国产精品一区| 亚洲一区二区三区高清| 国产综合亚洲精品一区二| 日韩深夜视频| 国产精品蜜芽在线观看| 麻豆精品少妇| 国产精品久久久久久av公交车 | 久久亚洲视频| 久久久精品五月天| 国产精品黑丝在线播放| 精品视频久久| 精品久久精品| 国产精品天天看天天狠| 日韩精品导航| 日本精品在线播放| 蜜臀精品一区二区三区在线观看| 性色av一区二区怡红| 国产午夜精品一区二区三区欧美| 精品欧美激情在线观看| 欧美日韩国产免费观看视频| 亚洲女同中文字幕| 日韩一区二区免费看| 蜜桃av一区| 午夜精品影视国产一区在线麻豆| 午夜亚洲福利| 国产精品入口久久| 荡女精品导航| 捆绑调教日本一区二区三区| 日韩精品2区| 久久久久国产精品一区三寸| 久久影视一区| 欧美成人亚洲| 视频一区在线播放| 亚洲黑丝一区二区| 亚洲激精日韩激精欧美精品| 亚洲作爱视频| 日韩高清电影一区| 国产精品久久乐| 色偷偷色偷偷色偷偷在线视频| 激情国产在线| 激情综合网址| 亚洲开心激情| 国产精品一在线观看| 色综合五月天| 自拍日韩欧美| 日韩高清电影免费| 四虎8848精品成人免费网站| 久久精品动漫| 另类av一区二区| 欧美综合社区国产| 久久久久九九精品影院| 亚洲综合在线电影| 噜噜噜躁狠狠躁狠狠精品视频| 日本视频一区二区| 国产精品theporn| 久久国产电影| 日韩av字幕| a国产在线视频| 亚洲欧美日本国产专区一区| 欧美日韩一区二区三区四区在线观看 | 国产精品手机在线播放| 福利一区二区免费视频| 妖精视频成人观看www| 国产欧美日韩一区二区三区在线| 电影91久久久| 亚洲欧美网站| 精品一区av| 国产女优一区| 福利视频一区| 亚洲精品乱码日韩| 成人精品视频| 亚洲综合二区| 久久影院一区二区三区| 亚洲天堂1区| 日韩欧美久久| 三上悠亚国产精品一区二区三区| 中文字幕免费一区二区| 日韩成人免费| 日韩和欧美一区二区| 91精品国产乱码久久久久久久| 欧美日本不卡高清| 99国产精品久久久久久久成人热| 国产精品一区二区av日韩在线| 久久久五月天| 国产精品一区二区精品视频观看 | 亚洲天堂久久| 国产精品久久久亚洲一区| 欧美日韩一二三四| 国产精品主播| 视频精品一区二区| 日韩免费高清| 国产乱人伦丫前精品视频|