我在网站上看到过一种技术,它有一个固定的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。我想知道每种方法的优点和缺点是什么。 使用第一种方法是否安全?
答案 0 :(得分:0)
<强> 1。 www.site.com/index.php?page=page1
这种方法存在风险,根本不推荐,因为用户可以操纵数据。
<强> 2。 www.site.com/page1
这只是相当重写的url。您可以通过在 Apache服务器上使用一些.htaccess代码并在 nginx 配置文件的服务器块中配置url rewrite来实现此目的。但是你会以上面提到的方式实施安全漏洞。
使用include
或require
使用用户的数据可能会导致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!
}
其次,您可以使用任何良好且可信的路由库或包。