2013-02-28 39 views
0

我确定我使用了错误的方式,但这是我第一次尝试使用php。下一个代码不起作用。变量$file在本地定义,但我不知道如何使用全局变量。包含的可变参数

articles.php 在这个文件中我有一个列表:

<ol> 
    <li><a <?php $file="a.php"; ?> href="article.php" > title 1 </a> </li> 
    <li><a <?php $file="b.php"; ?> href="article.php" > title 2 </a> </li> 
</ol> 

article.php在这个文件我想用这个

<?php include("articles/$file"); ?> 

如何正确界定$file ? 有没有更好的方法来加载a.phpb.php

+1

对这类代码要格外小心。现在,如果此代码正常工作,它会将您的服务器打开为TOTAL和TRIVIALLY EASY远程妥协。例如'http://example.com?file = http:// malicioussite.com/attack_script.php'和poof ...你正在执行一个攻击者选择的脚本。 'articles /'部分是MINOR防御,但仍然允许攻击者加载并显示系统上的任何文件,他们知道其完整路径。 – 2013-02-28 21:51:59

回答

2

与例如通过它$ _GET:

<ol> 
    <li><a href="article.php?f=a" > title 1 </a> </li> 
    <li><a href="article.php?f=b" > title 2 </a> </li> 
</ol> 

包括任何没有完整性检查的文件都非常不安全。我建议用一个白名单来做到这一点:

$file = $_GET['f']; 
switch ($file){ 
    case 'a': 
    case 'b': 
     include('articles/'.$file.'.php'); 
     break; 
    default: 
     // don't do anything 
} 

HTH

+0

感谢转换的想法,但我不明白“健全检查”,“白名单”和“开关”之间的联系。 – Altermundus 2013-02-28 22:19:26

+0

如果您获得例如一个'c'作为参数,它不会试图包含它,因为它不在你的白名单上,b在交换机中的情况下完成。 – webcoder 2013-03-01 01:51:25

2

你做错了。

每个php文件的执行都像在服务器上单独执行应用程序一样。服务器forgets代码执行后的所有变量和页面被发送到浏览器。您不能像这样将数据从一个页面传递到其他页面。

传递一些值,你必须使用以下方法之一下一页:

  • POST或GET
  • 饼干
  • 会议

PHP Web应用程序是非常specyfic这一点很重要,如果你想用PHP编写web应用程序,你必须完美地学习它。

点击此处了解详情:

PHP Pass variable to next page

+0

是的,我明白我用错了方式。你的回答有助于我理解其他答案。 – Altermundus 2013-02-28 22:04:47

3

你可以做这样的事情:

articles.php

<ol> 
    <li><a href="article.php?page=a" > title 1 </a></li> 
    <li><a href="article.php?page=b" > title 2 </a></li> 
</ol> 

这将通过变量pagearticle.php

article.php

if($_SERVER[REQUEST_METHOD] == 'GET' && !empty($_GET[page])) { 
    $path = $_GET[page] . ".php"; // transform into a filename (a.php) 

    if(file_exists($path)) { 
     include_once $path; 
    } 
} 

在这里,你会检查请求的方法是GET如果page变量是不是空的。然后,您将.php添加到变量中,使其成为一个完整的文件名并检查它是否存在。如果有,它将被包括在内。谨慎的话,这不是消毒。您可以添加一个可接受的文件名的数组,并遍历这些文件名以检查它们是否有效。

+0

谢谢!我需要尝试你的代码,并试图了解与其他人的不同之处。 – Altermundus 2013-02-28 22:08:47

+0

安全性似乎对这类代码非常重要。我需要研究如何定义可接受的文件名的数组以及如何使用它。 – Altermundus 2013-02-28 22:22:23

1

你可能试图做这样的事情(这是通过HTTP GET传递一些值)。


1(page1.php中) - 包含参数file链路与价值page3

<a href="page2.php?file=page3"> 

第2页(使page2.php) - 页面应该有 “文件” 打开参数URL

<?php 
    $file = $_GET["file"]; // takes parameter "file" from URL 
    include($file."php"); // Dot is used for "adding" strings 
?> 

第3页(page3.php) - 测试页,包括

<?php 
    echo "This is included page3.php!" 
?> 

考虑学习这是最简单可行的代码。在实际应用中有很多事情要做。

“在现实世界”,你必须检查(通过使用IF语句):

  1. 如果文件被调用GET请求($_SERVER[REQUEST_METHOD] == 'GET'
  2. 如果在URL参数!empty($_GET['file'])
  3. 如果在URL中提供名称的文件存在file_exists($file."php")

为了避免PHP致命错误,当有人手动将URL写入您的page2.php时,没有参数或文件名错误。

Aarolama Bluenk写了这些必要的事情做的答案(见下面/上面)。

+0

有趣,因为这段代码看起来很简单。你知道一个很好的手册或网站,了解如何使用html和php管理页面吗?有必要了解答案之间的差异。 – Altermundus 2013-02-28 22:13:13

+0

我这样做。您可以访问http://thenewboston.org或http://phpacademy.org非常好的PHP和其他语言的视频教程。 – Kamil 2013-02-28 22:19:51

+0

我添加了一些额外的信息,为什么我的脚本如此简单(在答案的最后)。 – Kamil 2013-02-28 22:23:32