2008-09-19 63 views
9

把這個代碼:PHP:獲取數據自動被聲明爲變量

<?php 
if (isset($_POST['action']) && !empty($_POST['action'])) { 
    $action = $_POST['action']; 
} 

if ($action) { 
    echo $action; 
} 
else { 
    echo 'No variable'; 
} 
?> 

然後用行動訪問該文件=測試 是否有防止由GET自動被宣佈$行動的任何方式?當然除了

&& !isset($_GET['action']) 

爲什麼我要變量爲我聲明?

回答

27

檢查您的php.ini中的register_globals設置。它可能是,你想要它。

爲什麼我要爲我聲明變量?

You don't.這是一個可怕的安全風險。它使環境,GET,POST,Cookie和服務器變量全局爲(PHP manual)。這些是PHP中的一小部分reserved variables

+0

謝謝你的答案,這真的是我一直在尋找。但是,我的例子是唯一的東西register_globals影響? – Eikern 2008-09-19 13:47:54

4

看起來像register_globals在你的php.ini中是罪魁禍首。你應該關掉它。擁有它也是一個巨大的安全風險。

如果您在共享主機上,並且無法修改php.ini,則可以使用ini_set()關閉register_globals。

1

您可以測試,是否所有的變量是正確聲明的通過轉動php.ini中的PHP日誌級別

error_reporting = E_ALL 

您的代碼段現在應該生成的通知。

1

在php歷史上的某個時刻,他們做出了有爭議的決定,默認關閉register_globals,因爲這是一個巨大的安全隱患。它給任何人在你的代碼中注入變量的潛力,產生不可想象的結果!這個「功能」甚至在php6中刪除

如果您發現它已聯繫管理員關閉它。

2

如果你沒有訪問php.ini中,在PHP腳本不會一起工作(變量已經聲明) 的.htaccesini_set('register_globals', false)

php_flag register_globals Off 

有時可以提供幫助。