-1

昨天我问了一个关于如何包含通过 URL 传入的文件的问题,有人给我这个:

if (isset($_GET['file'])){
  include($_GET['file'].'.php');
}

但是其中一个答案告诉我要对此做一些事情,以避免黑客或类似的攻击。问题是我自己不明白如何去做。

他说我应该这样做:

$pages_array=('home','services','contact').

然后检查 GET 变量:

if(!in_array($_GET['page'], $pages_array) { die(); }

这是做什么的,我如何将它集成到我上面的原始代码中?

4

6 回答 6

1

该代码GET通过确保页面名称出现在您的$pages_array.

只要您列出 中的所有页面$pages_array,代码就会执行。如果页面不在您的数组列表中,那么它将die不会被执行。

使用GET时,验证以这种方式发送的代码总是有益的,因为可以发送和执行任意语句而无需验证。

在这种情况下,代码正在被验证——所以你已经采取了必要的步骤;只要您尚未提交的代码没有更多内容。

正确的代码

$pages_array=array('home','services','contact');
于 2013-06-24T01:05:40.950 回答
1

您的原始代码file在 URL 中查找参数,然后包含传入的任何文件。因此,如果有人访问您的 PHP 页面并添加?file=something.txt到 URL,您将something.txt在输出中包含 的内容。

这样做的问题是任何人都可以手动修改 URL 以尝试包含他们想要的任何文件 - 让他们看到系统上应该是私有的文件。

解决方案是拥有一个允许的文件名列表,如下所示:

$pages = array('home', 'services', 'contact');

然后在包含文件之前,首先检查它是否是允许的文件名之一。

$pages = array('home', 'services', 'contact');
if (isset($_GET['file'])){
    if (!in_array($_GET['file'], $pages_array)) {
        exit('Not permitted to view this page');
    }
    include($_GET['file'].'.php');
}

我们使用 PHParray来定义允许页面的列表,检查我们的页面是否在函数列表中,in_array()如果它不在函数列表中,则停止所有脚本执行exit()

于 2013-06-24T01:07:35.477 回答
0

你几乎回答了你自己的问题......

除了这条线变成...

$pages_array=array('home','services','contact');

而不是你所拥有的...

$pages_array=('home','services','contact').
于 2013-06-24T01:02:55.740 回答
0
//change the variable array declaration
$newArray = array('home','services','contact');

只需在你的 if like 中做一个 else 语句

 else { 
     //include your file
     include($_GET['page'].'.php');
  }
于 2013-06-24T01:07:46.517 回答
0

基本上,您的数组定义语法是错误的,但为什么没有设置die()if ?$_GET['file']如果您恢复为默认值以静默失败,这不是更好吗?

使用in_array()

<?php
$pages_array = array('home','services','contact');

if(isset($_GET['file']) && in_array($_GET['file'], $pages_array)){
    include($_GET['file'].'.php');
}else{
    include('home.php');
}
?>

甚至使用带有硬编码值的switch() 。

<?php
$page = isset($_GET['file']) ? $_GET['file'] : 'home';
switch($page){
    case "home"     : include($page.'.php'); break;
    case "services" : include($page.'.php'); break;
    case "contact"  : include($page.'.php'); break;

    default:
        include('home.php');
        break;
}
?>
于 2013-06-24T01:15:55.330 回答
-1
$pages=array('home','services','contact');

if(isset($_GET['page']))

{


$page=$_GET['page'];

if(!in_array($page,$pages)) 

{

die ('');


}

else {

include($page.'.php');

}
 }

因此,您的链接将如下所示:

yoursite.com/index.php?page=home -> 使用此工具:

http://www.generateit.net/mod-rewrite/

您可以制作更好的 URL。

于 2013-06-24T01:05:47.273 回答