2017-05-07 24 views
1

爲了防止PHP本地文件包含攻擊,我希望完全禁用所有PHP文件在一個目錄中的執行。使用.htcaccess文件中的行php_flag engine off將導致500錯誤。根據another question,這是由於PHP的安裝方式。在一個目錄中禁用PHP執行

如果PHP安裝無法更改,是否有其他方法可以阻止PHP執行?

更新:文件不一定以.php結尾。

+0

因此,當用戶訪問該目錄中的PHP文件時,您希望發生什麼?是否將它作爲純文本文件提供回來? – rickdenhaan

+0

只適用於擴展名爲.php的文件? – Croises

+0

無論如何用戶不能直接訪問這些文件。我只是想阻止所有文件的執行(不僅僅是那些帶有.php結尾的文件),所以它們不能從另一個php文件中執行。 – kot

回答

2

添加到您的.htaccess文件

<FilesMatch \.php$> 
    SetHandler None 
</FilesMatch> 
+0

請注意,如果直接通過HTTP請求'.php'文件,則此(僅)會阻止代碼執行。它不一定會阻止PHP文件在該目錄中執行,如果它們是include()或d或由服務器上的其他腳本調用的話。 – MrWhite

+0

我更新了我的問題,所以很明顯這些文件沒有php結尾。可以修改此答案以從文件中刪除所有處理程序嗎?我唯一想做的事情是創建,讀取和刪除它們。他們不應該以任何方式訪問或執行。 – kot

+0

PHP被解釋,而不是編譯 - 所以可讀性和可執行性沒有區別。 –

-1

添加這個<?php標題下方,這將防止php

defined('BASEPATH') OR exit('No direct script access allowed'); 
+0

此(或熟悉的代碼)適用於庫和包含文件。但是,如果文件是用戶生成的內容(這是您想要關閉PHPHändler的正常情況),這並沒有幫助。 – eckes

+0

爲什麼不把它包含在生成的內容中。他在問是否「其他方式」阻止PHP執行。 – Eyy

+1

因爲有點難以告訴攻擊者只上傳無法執行的PHP腳本 - 我想。 – eckes

0

您要通過「允許所有建設網站上直接執行,然後否認「邏輯。你應該用「拒絕所有,然後允許」邏輯來構建它。例如,您告訴Apache將所有文件提供給特定的目錄,然後重寫該配置以告知Apache不爲該目錄中的某些文件提供服務。也就是說,你可能有這樣的事情:像這樣

<VirtualHost *:80> 
    ServerName foo.com 
    DocumentRoot "/path/to/files" 
</VirtualHost> 

藉助目錄佈局:

/path/to/files 
    index.php 
    config.php 
/path/to/files/lib 
    db.php 
    etc.php 
    other_thing.php 

有了這個設置,任何人都可以請求http://foo.com/config.phphttp://foo.com/lib/etc.php直接,這是你想要什麼避免。對於你想要拒絕的所有事情,不要增加個別的例外情況,而是反過來開始。也就是說,如果你有不想要的文件,那麼不要將它們放在文檔根目錄中。

<VirtualHost *:80> 
    ServerName foo.com 
    DocumentRoot "/path/to/files/public" 
</VirtualHost> 

注意DocumentRoot現在設置爲您的項目中的子目錄。只把你的公共資產放在這個目錄中。所有其他文件都在公開之外(即高於),因此不能由由Apache提供服務,同時仍允許PHP包含它們。

/path/to/files 
    config.php 
/path/to/files/lib 
    db.php 
    etc.php 
    other_thing.php 
/path/to/files/public 
    index.php 
+0

謝謝,但我不認爲這解決了其他PHP文件包含的問題。我不想停止公衆訪問,我已經這樣做了。我明確想要防止PHP文件被執行(例如,通過其他php文件的'include()') – kot

+0

你不能這樣做。他們需要可讀才能在您的應用中運行。 –

+0

我不希望它們在我的應用程序中運行 – kot