PHP 安全及相關

2021-04-02 11:58:25 字數 3420 閱讀 6124

關注安全問題的重要性

看到的遠非全部

<?php

function write_text($filename, $text="")

return true;

} $index = md5($filename);

if(!isset($open_files[$index]))

fputs($open_files[$index], $text);

return true;

}?>

這個函式帶有兩個預設引數,檔名和要寫入檔案的文字。

函式將先檢查檔案是否已被開啟;如果是,將使用原來的檔案控制代碼。否則,將自行建立。在這兩種情況中,文字都會被寫入檔案。

如果傳遞給函式的檔名是null,那麼所有開啟的檔案將被關閉。下邊提供了乙個使用上的例項。

如果開發者以下邊的格式來寫入多個文字檔案,那麼這個函式將清楚和易讀的多。

讓我們假定這個函式存在於乙個單獨的檔案中,這個檔案包含了呼叫這個函式的**。

下邊是乙個這樣的程式,我們叫它quotes.php:

<?php

include_once('write_text.php');

$filename = "/home/web/quotes/";

$quote_msg = $_get['quote_text'];

if (write_text($filename, $quote_msg)) else

write_text(null);

?>

如同你看到的,這位開發者使用了write_text()函式來建立乙個體系使得使用者可以提交他們喜歡的格言,這些格言將被存放在乙個文字檔案中。

不幸的是,開發者可能沒有想到,這個程式也允許了惡意使用者危害web server的安全。

也許現在你正撓著頭想著究竟這個看起來很無辜的程式怎樣引入了安全風險。

如果你看不出來,考慮下邊這個url,記住這個程式叫做quotes.php:

當這個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程式只有在最弱的安全鏈結下才安全,所以確認這些可能不安全的鏈結是否安全很重要。

常見的涉及安全的錯誤

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

在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'])) .zip";

$filename = basename($cmp_name);

if (file_exists($tmp_name))

} }

?>

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

if (isset($_files['file'])) .zip";

$filename = basename($cmp_name);

if (file_exists($tmp_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年左右了。  

英文原文:

安全相關的PHP函式

1.mysql real escape string 這個函式對於在php中防止sql注入很有幫助,它對一些特殊字元像單引號雙引號,加上反斜槓 注意是在連線著資料庫的情況下使用 確保查詢之前資料是安全的。現在更多的 應用會用類似pdo這樣的庫對資料庫進行操作,而且一些框架tp或ci都可以防止sql注...

php安裝及相關配置

apache php mysql,apache相當於伺服器,php是指令碼語言,mysql是資料庫,初學者很難配置這三者,我們這裡有個繼承開發環境,phpstudy非常方便 相關埠等配置請參照相關文件 a.在php 開頭加上下面 但是這樣只是對本段php 有效 header content type...

php介面安全設計及實現

介面的安全性主要圍繞token timestamp和sign三個機制展開設計,保證介面的資料不會被篡改和重複呼叫,下面具體來看 1 token授權機制 token是客戶端訪問服務端的憑證 使用者使用使用者名稱密碼登入後伺服器給客戶端返回乙個token 通常是uuid 並將token userid以鍵...