动态站点安全风险

时间:2014-03-18 19:34:20

标签: php security dynamic include

我听说因为我的index.php

,我的网站或整个服务器都很容易入侵

就是这样:

<?php
include_once 'config.php';
include_once 'includes/mysqlconnect.php';
$url_slash=$_SERVER['REQUEST_URI'];
$url= rtrim($url_slash, '/');
?>

<head>
    <meta charset="UTF-8">
    <title>Site Title</title>
    <link rel="stylesheet" type="text/css" href="<?php echo $domain;?>themes/reset.css">
    <link rel="stylesheet" type="text/css" href="<?php echo $domain;?>themes/<?php echo $theme;?>.css">
</head>
<body class="body">
    <div class="container-all">
        <?php include_once 'includes/header.php';?>
        <div class="container">
            <?php include_once 'includes/navigationbar.php';?>
            <?php include_once 'includes/rightsidebar.php';?>
            <div class="content"><?php

            if ($url==''){

                include_once "sites/home.php";
            }
            elseif (file_exists("sites/$url.php") && is_readable("sites/$url.php")){
                include_once "sites/$url.php";

            }

            else {
                include_once 'sites/404.php';

            }


            ?></div>
            <?php include_once 'includes/footer.php';?>
        </div>
    </div>
</body>

我的.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

如何阻止人们输入example.com /../../../ somefilepeoplemaynotsee.txt

我真的想保持我的网址清洁,所以没有关于example.com?page=example 我想通过在/ var / www / html / sites / dir中创建一个文件来添加一个站点,然后我添加了一个页面。这是它的工作原理,但正如所说。它的安全风险很大:/ 我真的希望保持我的网站动态

任何想法

2 个答案:

答案 0 :(得分:-1)

使用basename,请参阅:http://php.net/basename

示例:

$url = rtrim($url_slash, '/');
$url = basename($url);

(注意:这是在最简单的级动态。使用像已知路由的MVC这样的东西可能更安全)

答案 1 :(得分:-1)

为了防止出现本地文件包含漏洞,您必须先验证用户输入,然后再尝试将其用作包含的文件名。

if (!preg_match("/[^A-Za-z0-9]/", $url)){
    // user input is valided to A-Za-z0-9

    if(file_exists("sites/$url.php")){
        include_once "sites/$url.php";
    }
}

这假设您只放置要包含在sites目录中的脚本。显然,如果你有其他代码不包括在内,那么你需要使用白名单。