/* define page path */ define("PAGE_DIR", "pages/"); if (file_exists(PAGE_DIR."$_GET[page].php")) include(PAGE_DIR."$_GET[page].php");
这有多安全?例如,如果页面位于名为pages的文件夹中,可以在另一个Web服务器上包含一个页面吗?
由于
答案 0 :(得分:6)
这根本不安全 - 想想如果$_GET[page]
包含../../../somewhere/else/
您应该明确地拥有允许页面列表。
编辑:我认为它不能包含来自不同服务器的文件,但它仍然不是一件好事。
答案 1 :(得分:2)
将未经过处理的用户输入直接传递给命令,尤其是像include()这样的东西,这绝不是一种好习惯。您不一定知道底层Web服务器/操作系统将如何处理,例如,相对路径,扩展字符等。恶意或其他方式使用的任何这些都可能导致用户看到他们不应该看到的内容。见。
一种可能的漏洞:用户将相对路径传递到服务器上已知位置的恶意脚本。 http://webserver/yourscript.php?page=%2e%2e%2f%2e%2e%2f%2e%2e%2fhome/bad_user/evil_script
你的功能可以转换为页面/../../../ home / bad_user / evil_script.php,其中包括有时会愉快地包含。因此,您提供的网页可以很好地执行bad_user的php脚本,他可以用来做各种令人讨厌的事情。
至少你应该将$ _GET ['path']分配给一个新变量和addslashes()。
答案 2 :(得分:1)
在验证/清理数据之前使用$ _GET或$ _POST执行任何是危险的。假设所有用户都出去找你,并在使用之前清理数据。