2013-02-28 38 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