首頁 > 後端開發 > php教程 > PHP安全-遠端檔案風險

PHP安全-遠端檔案風險

黄舟
發布: 2023-03-05 21:18:01
原創
1128 人瀏覽過



遠端文件風險

  PHP有一個配置選項叫做allow_url_fopen,該選項預設是有效的。它允許你指向許多類型的資源,並像本地文件一樣處理。例如,透過讀取URL你可以取得某一個頁面的內容(HTML):

<?php
 
  $contents =
file_get_contents(&#39;http://example.org/&#39;);
 
  ?>
登入後複製


 

  正如第五章所討論的那樣,當被污染資料用於include和require的文件指向時,會產生嚴重漏洞。實際上,我認為這種漏洞是PHP應用中最危險的漏洞之一,這是因為它允許攻擊者執行任意程式碼。

  儘管嚴重性在等級上要差一點,但在一個標準檔案系統函數中使用了被污染資料的話,會有類似的漏洞產生:

 

 <?php
 
  $contents =
file_get_contents($_GET[&#39;filename&#39;]);
 
  ?>
登入後複製


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

  http://www.php.cn/ ... mple.org%2Fxss.html

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

  由於$content值是被污染 的,它可能導致多種安全漏洞,包括跨站腳本漏洞和SQL注入漏洞。例如,以下是跨站腳本漏洞的範例:

  <?php
 
  $contents =
file_get_contents($_GET[&#39;filename&#39;]);
 
  echo $contents;
 
  ?>
登入後複製


 

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

 

  <?php
 
  $clean = array();
 
  /* Filter Input ($_GET[&#39;filename&#39;]) */
 
  $contents =
file_get_contents($clean[&#39;filename&#39;]);
 
  ?>
登入後複製


 

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

 

<?php
 
  $clean = array();
  $html = array();
 
  /* Filter Input ($_GET[&#39;filename&#39;]) */
 
  $contents =
file_get_contents($clean[&#39;filename&#39;]);
 
  /* Filter Input ($contents) */
 
  $html[&#39;contents&#39;] =
htmlentities($clean[&#39;contents&#39;], ENT_QUOTES, &#39;UTF-8&#39;);
 
  echo $html[&#39;contents&#39;];
 
  ?>
登入後複製


 

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

 

以上是PHP安全-遠端檔案風險的內容,更多相關內容請關注PHP中文網(www.php.cn)!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板