PHP安全程式設計之開啟遠端檔案的風險

2021-07-16 10:08:49 字數 1559 閱讀 4328

php有乙個配置選項叫allow_url_fopen,該選項預設是有效的。它允許你指向許多態別的資源,並像本地檔案一樣處理。例如,通過讀取url你可以取得某乙個頁面的內容(html):

<?php

$contents = file_get_contents('');

?>

當被汙染資料用於include和require的檔案指向時,會產生嚴重漏洞。實際上,我認為這種漏洞是php應用中最危險的漏洞之一,這是因為它允許攻擊者執行任意**。儘管嚴重性在級別上要差一點,但在乙個標準檔案系統函式中使用了被汙染資料的話,會有類似的漏洞產生:

<?php

$contents = file_get_contents($_get['filename']);

?>

該例使使用者能操縱file_get_contents( )的行為,以使它獲取遠端資源的內容。考慮一下類似下面的請求:

... mple.org%2fxss.html

這就導致了$content的值被汙染的情形,由於這個值是通過間接方式得到的,因此很可能會忽視這個事實。這也是深度防範原則會視檔案系統為遠端的資料來源,同時會視$content的值為輸入,這樣你的過濾機制會潛在的起到扭轉乾坤的作用。

由於$content值是被汙染的,它可能導致多種安全漏洞,包括跨站指令碼漏洞和sql注入漏洞。例如,下面是跨站指令碼漏洞的示例:

<?php

$contents = file_get_contents($_get['filename']);

echo $contents;

?>

解決方案是永遠不要用被汙染的資料去指向乙個檔名。要堅持過濾輸入,同時確信在資料指向乙個檔名之前被過濾即可:

<?php

$clean = array();

/* filter input ($_get['filename']) */

$contents = file_get_contents($clean['filename']);

?>

儘管無法保證$content中的資料完全沒有問題,但這還是給出了乙個合理的保證,即你讀取的檔案正是你想要讀取的檔案,而不是由攻擊者指定的。為加強這個流程的安全性,你同樣需要把$content看成是輸入,並在使用前對它進行過濾。

<?php

$clean = array();

$html = array();

/* filter input ($_get['filename']) */

$contents = file_get_contents($clean['filename']);

/* filter input ($contents) */

$html['contents'] = htmlentities($clean['contents'], ent_quotes, 'utf-8');

echo $html['contents'];

?>

上面的流程提供了防範多種攻擊的強有力的方法,同時在實際程式設計中推薦使用。

PHP安全程式設計之PHP的安全模式

php的safe mode選項的目的是為了解決本小節前後所述的某些問題。但是,在php層面上去解決這類問題從架構上來看是不正確的,正如php手冊所述 當安全模式生效時,php會對正在執行的指令碼所讀取 或所操作 檔案的屬主進行檢查,以保證與該指令碼的屬主是相同的。雖然這樣確實可以防範本章中的很多例子...

PHP安全程式設計之主機檔案目錄瀏覽

除了能在共享伺服器上讀取任意檔案之外,攻擊者還能建立乙個可以瀏覽檔案系統的指令碼。由於你的大多數敏感檔案不會儲存在 主目錄下,此類指令碼一般用於找到你的原始檔的所在位置。請看下例 if isset get dir elseif isset get file else function cat fil...

PHP安全程式設計之阻止檔名被操縱

在很多情形下會使用動態包含,此時目錄名或檔名中的部分會儲存在乙個變數中。例如,你可以快取你的部分動態頁來降低你的資料庫伺服器的負擔。include cache html 為了讓這個漏洞更明顯,示例中使用了 get。如果你使用了受汙染資料時,這個漏洞同樣存在。使用 get username 是乙個極端...