2011-04-22 76 views
0

我正在構建一個CMS,並且主頁面(index.php)由CMS目錄中的很多小文件構建而成。例如,該結構可以是這樣的:如何使某些文件僅適用於PHP腳本?

index.php 
menu/admin/content.php 
      config.php 
      requests.php 

menu/tools/content.php 
      config.php 
      requests.php 

menu/users/content.php 
      config.php 
      requests.php 

當我在根目錄訪問index.php,我得到一個基於$_GET參數不同的結果。例如,當我訪問index.php?section=tools時,索引文件會從menu/tools/文件夾中加載contentcofnigrequests文件。

現在來解決問題。 index.php頁面本身僅供登錄用戶訪問,但出於安全原因,我想要禁用menu文件夾中的所有內容,而不是通過其他任何方式訪問,而不是通過php的include功能訪問。

爲了證明會發生什麼:如果我要刪除的東西,我用index.php?section=tools&delete=5,並在menu/tools/requests.php文件,如果$_GET['delete']設爲我會檢查,然後從數據庫中刪除的5號。現在的問題是,如果有人知道實際結構,他可以像這樣訪問requests.php文件:site.com/admin/menu/tools/requests.php?delete=5,然後用這種方法破解網站。

有沒有辦法來防止這種可能的攻擊?有些東西拒絕訪問菜單文件夾中的文件,但仍然讓他們從我的index.php文件訪問? Htaccess也許?我真的不想在「菜單」文件夾中對每個文件都進行檢查(如果設置會話/ cookie),儘管這可能是一個可行的解決方案。

+0

index.php?section = tools&delete = 5本身就是一個壞主意。我現在找不到這個參考資料,但是有一個案例我讀到了整個網站被一個仁慈的機器人銷燬的地方,因爲每個項目都有一個「刪除」鏈接。改爲使用POST請求。 – TecBrat 2014-06-16 14:24:43

回答

1

最好的方法是將menu文件夾移動到Web服務器文檔根目錄之外的某個位置。這樣一來,沒有URL映射到menu/tools/requests.php你唯一的安全問題是您在index.php

+0

好吧,或者我可以將'menu'文件夾重命名爲'menu145235234952'或類似的東西,然後更改每個項目的編號,但這看起來不是一個乾淨的解決方案。我不知道我會在哪裏移動它,我總是使用託管服務。 – Mike 2011-04-22 16:26:47

+0

應該有可能。有關詳細信息,請諮詢您的託管服務提供商。 – Oswald 2011-04-22 16:32:37

+1

@Mike:是的,請向您的提供商諮詢,您應該至少可以訪問您的賬戶的'$ HOME',該賬戶通常包含您的webroot所在的文件夾。如果他們不給這種訪問它可能是一個很好的跡象,你應該切換提供商:-) – prodigitalson 2011-04-22 16:47:37

3

做創建的文件夾(S)在你的.htaccess到wan't拒絕包含以下訪問:

deny from all 

儘管如此,最好的辦法是將文件夾放在Web根目錄之外。

+0

那麼,有沒有辦法在使用普通託管服務時將文件放在根目錄之外? – Mike 2011-04-22 16:28:50

+1

應該有,儘管一些(壞的)共享主機只允許你訪問web根目錄。 – 2011-04-22 16:30:57

+0

嗯,我嘗試了「拒絕所有」,它工作正常。只是一件我不確定的事情,如果存在.htaccess規則,是否有某種方式可以讓外部人員訪問該文件?例如,如果他要使用CURL或類似的東西? – Mike 2011-04-22 16:42:19

0

首先,如果有人要手動添加GET參數並「破解」該網站,則存在問題。在腳本中,您應該驗證嘗試執行這些操作的用戶的身份驗證,並且如果它們已通過身份驗證,則應該沒有問題。我不認爲任何人都會通過GET參數刪除某些東西,當他們可以在接口上自己做這件事時會引發問題。

有解決方案,你問的方式,但他們每個人都有自己的憂慮......

CodeIgniter的工作原理是設置一個變量,然後在每個腳本的頭,

if (! defined('BASEPATH')) exit('No direct script access allowed'); 

你也可以檢查$ _SERVER ['SCRIPT_FILENAME'],$ _SERVER ['SCRIPT_NAME']或$ _SERVER ['PHP_SELF']查看它的index.php,否則退出。

相關問題