2012-11-26 50 views
2

他們在URL中使用類名和/或參數時是否存在任何安全問題?URL類別/方法路由的安全

我創建了一個簡單的PHP頁面路由器的路由路徑,例如:

www.mysite.com/classname/methodname/param1/param2/etc/etc 

是否有泄露我的類和方法的名稱的任何危險?還是應該在類方法中有足夠的過濾來使其不成問題?

此外,我的AJAX調用將以相同的方式路由。爲了確保合法的AJAX調用,我可以以何種方式生成每次調用時都會更改的會話標記。例如,在由AJAX訪問的PHP腳本中生成一個隨機數,該腳本也由該調用發送。如果它們匹配,那麼它的授權請求。唯一的問題是我如何讓他們匹配?

+0

爲什麼不重用像Symfony2 [Routing](http://symfony.com/doc/current/components/routing/introduction.html)和[Http Foundation](http://symfony.com)這樣經過良好測試的穩健組件。 /doc/master/components/http_foundation/introduction.html)。 – ChocoDeveloper

+0

@ChocoDeveloper謝謝,我知道alr​​ady有很多解決方案,但如果我試着自己做第一個,我會更好地理解它們和URL路由概念。 – imperium2335

+0

你仍然應該檢查出來。閱讀別人怎麼做會給你很多想法。例如,爲方法添加一些類似'Action'的內容很常見,以防止訪問不應通過URL訪問的公共方法。因此,例如,如果您收到'user/profile',則應該創建User類並調用方法'profileAction'。如果你不添加'Action',攻擊者可以嘗試調用'deleteUser',你就明白了。 – ChocoDeveloper

回答

2

最大的安全問題是,你不能盲目包括類名稱,如:

require_once('classes/' . $_GET['class'] . '.php'); 

以上將是一個脆弱的例子,所以一定要驗證類名或你有這樣的文件避免本地文件包含漏洞。

class_exists()將是不夠的。我會先驗證它,以便它只包含a-z。然後使用file_exists,class_exists等

我想不是所有的類和方法都會被公衆通過路由使用,所以有一些系統可以檢查路由器是否被允許訪問指定的類和方法。這可以通過多種方式完成,例如從基類中派生公開可用的類,例如, BaseController,並檢查包含的類是否源自該類,或者將控制器保存在內部類的單獨目錄中,並根據需要控制類中的訪問。

至於揭示你的類和方法 - 這不是真的關心,實際上它是大多數MVC框架的工作原理。確保你驗證了用戶輸入的所有內容。

對於您的AJAX建議,可以通過在會話中存儲令牌來完成,以便您可以在調用時檢查它是否匹配。我認爲這不會增加很多安全性。通常,AJAX服務會提供與頁面上可用的相同的數據。

+0

謝謝你。那麼爲了避免這種漏洞,我可以在我的前端控制器中使用class_exists()和method_exists()函數嗎? – imperium2335

+0

@ imperium2335看我的編輯:我會檢查'a-z',然後檢查是否可以從URL /路由器訪問該類。 – MrCode