使用包含页面vs已更新的网址修复网址到新文件

时间:2016-07-02 15:33:41

标签: php

我在网站上看到过一种技术,它有一个固定的index.php文件,并在该文件中动态包含页面。

我的意思是让index.php只有这个代码:

<?php
    if ($_GET['page'])
    {
        $url= $_GET['page'].".php" ;
        if(is_file($url))
        {
            include $url;
        }
        else
        {
            echo ' requested page is not found :'.$url;
        }
    }
    else
    {
        include 'home.php';
    }
?>

并且任何herf位置都有index.php?page = ToPage

网址将是www.site.com/index.php?page=page1,www.site.com/index.php?page=page2,等等..

另一方面,大多数网站使用正常移动到页面,就像任何href会让你去另一页。 通过这种方式,网址将是www.site.com/index.php,www.site.com/page1,www.site.com/page2.php。

我想知道每种方法的优点和缺点是什么。 使用第一种方法是否安全?

1 个答案:

答案 0 :(得分:0)

<强> 1。 www.site.com/index.php?page=page1

这种方法存在风险,根本不推荐,因为用户可以操纵数据。

<强> 2。 www.site.com/page1

这只是相当重写的url。您可以通过在 Apache服务器上使用一些.htaccess代码并在 nginx 配置文件的服务器块中配置url rewrite来实现此目的。但是你会以上面提到的方式实施安全漏洞。

使用includerequire使用用户的数据可能会导致Path Traversal攻击。

详细信息:https://www.owasp.org/index.php/Path_Traversal

一种选择可能是比较实际路径:

$basepath = '/foo/bar/baz/';
$realBase = realpath($basepath);

$userpath = $basepath . $_GET['path'];
$realUserPath = realpath($userpath);

if ($realUserPath === false || strpos($realUserPath, $realBase) !== 0) {
    //Directory Traversal!
} else {
    //Good path!
}

其次,您可以使用任何良好且可信的路由库或包。