使用此代码的影响是什么?
<?php
if(file_exists("pages/" . $_GET["page"] . ".php")){
include("pages/" . $_GET["page"] . ".php");
} else{
include("pages/home.php");
}
?>我已经让它让你不能在没有".php“扩展的情况下加载任何东西,所以我认为使用它是非常安全的。如果您使用:
website.com/index.php?page=../index 在url中,它将创建一个无限循环。据我所知,你不能加载外部URL。
示例:
website.com/index.php?page=anothersite.com/virus但我不是很确定,有什么建议吗?或者这可以使用吗?
发布于 2013-05-27 13:27:56
正如zerkms已经指出的,根据PHP版本的不同,file_exists和include可能会not be safe when handling NULL bytes。只有since PHP version 5.4.3, filesystem functions are said to be NULL byte safe。
因此,您应该在使用该值之前对其进行验证,例如,使用允许值的白名单:
$allowedPages = array(/* … */);
if (in_array($_GET["page"], $allowedPages)) {
// allowed
}您还可以将此白名单扩展到文档根目录下的任何现有文件:
if (strpos($_GET["page"], "\0") !== false) {
// NULL byte detected
}
$path = realpath("pages/" . $_GET["page"] . ".php");
$base = realpath($_SERVER['DOCUMENT_ROOT']) . "/";
if ($path !== false && substr($path, 0, strlen($base)) === $base) {
// allowed
}但是,这仍然可以用于绕过其他访问控制措施,如基于位置的HTTP授权。
发布于 2013-05-27 13:36:31
结合使用../../模式和空字节可能会导致路径“转义”其封闭部分。
"../../../etc/passwd\0.php"你可以对它做两件事:
$path = preg_replace('/^a-z/','');//现在像使用一样使用$path
发布于 2013-05-27 10:58:57
首先,根据URL参数包含页面是不安全的,这很容易被用户搞乱,你最好避免这样做。
其次,如果您希望避免包含外部url,则可能需要根据http://www.php.net/manual/en/filesystem.configuration.php#ini.allow-url-include配置php.ini。
如果您还没有开始配置页面,您可以首先修剪$_GET‘https://“’中"http://"”页面字符串,这是一个很好的行为,并创建一个.htaccess文件来将不存在的页面请求重定向到home.php,您还必须确保您的服务器上有mod_rewrite。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ home.php [NC,L] https://stackoverflow.com/questions/16765652
复制相似问题