0
A
回答
3
是的。對於初學者,如果不進行某種驗證,您永遠不應該直接使用GET變量,有史以來。
此外,您不應該允許任意指定要包含的路徑。
相反,如果您絕對需要那麼多動態性,您應該直接限制包含某個特定路徑的路徑(並檢查指定的路徑是否指向該目錄中的某個文件),或者應該傳遞引用的標記到你想要包含的東西(然後做一些類似於查看關聯數組的東西來查看給定令牌引用的文件)。
後者的一個例子是這樣的:
$allowed_pages = array(
"page1" => "pages/page1.php",
"page2" => "pages/page2.php",
"foobar" => "pages/page7.php",
"stuff" => "pages/blarg.php"
);
$page = $_GET['page'];
if(array_key_exists($allowed_pages, $page)) {
include($allowed_pages[$page]);
}
(。在這種情況下,只有指定的鍵被允許同時充當驗證和限制對可被包括什麼的事實)
1
這是冒險的,因爲在$_GET["page"]
可以是一個你不需要的路徑 - 例如../../settings.php
在別的東西上。
它應該做的事,如:
$allowedPages = array('news', 'contact', ...);
if (in_array($_GET["page"], $allowedPages)) {
include "pages/".$_GET["page"].".php";
} else {
throw new Exception('Page is not valid !');
}
好東西也是要檢查文件是否存在。
1
1
除了具有白名單,你可以做這樣的事情
$include = $_GET['page'];
if (! preg_match('/^[a-z-_]+$/i', $include)) {
throw new Exception('Access denied');
}
1
包括 「網頁/".$_ GET [」 頁 「] PHP」。「。
你已經硬編碼的前綴,以防出現類似的攻擊:?
頁= HTTP%3A%2F%2Fwww.blackhat.com%2Fbad.code%3F
但因爲$ _GET ['page']可能包含'..',那麼有人可以強制從您的系統中包含任何文件和php擴展名。你確信這永遠不會導致安全妥協?
按照其他人的建議使用白名單更安全,同時也避免了在路徑前添加要求以避免遠程包含漏洞的需求。
C.關於如何利用這樣的事情在這裏
相關問題
- 1. ASP.NET:基於文件的數據庫中的線程安全性
- 2. Java EE中安全的基於文件的數據持久性
- 3. Spring STOMP基於令牌的安全性
- 4. 基於角色的安全性asp.net mvc
- 5. winform數據的安全性?
- 6. java和hibernate的數據'安全性'
- 7. 端口和URL中的安全性
- 8. PHP包含基於URL參數
- 9. 基於會話屬性的Spring MVC安全性
- 10. AzMan和AD角色的基於ASP.NET角色的安全性
- 11. Google App Engine和Python基於角色的安全性
- 12. Spring安全性 - 基於屬性訪問控制器方法
- 13. JavaFX:基於屬性的實體與基於屬性的包裝
- 14. 基於Spring安全角色的URL
- 15. Spring和Thread的安全性
- 16. 如何在Firebase數據庫中實現基於用戶的安全性?
- 17. Android中的數據安全性
- 18. WordPress的數據屬性安全權值
- 19. 數據相關的安全性實現
- 20. 通過AJAX調用URL的安全性
- 21. 基於XML的spring mvc與基於java配置的spring安全性的集成
- 22. 基於HTTP的基於聲明的安全性是否有任何標準?
- 23. 基於URL長度的API的性能
- 24. PHP - 會話安全性和可靠性
- 25. 基於哈希片段的安全性是如何工作的?
- 26. 部署在Weblogic上的EJB基於角色的安全性
- 27. Spring引導Spring基於SOAP的Web服務的安全性
- 28. 小部件的基於域的安全性
- 29. Rails中屬性的基於角色的安全機制
- 30. 基於令牌的身份驗證的安全性
更多的例子:http://ha.ckers.org/blog/20100128/micro-php-lfi-backdoor/的評論有很多的東西太多。 – Arkh 2010-01-29 13:10:59