2010-08-16 28 views
3

我對Web開發有經驗,但對PHP沒有經驗。因此,我現在面臨的挑戰是,我即將把舊的PHP解決方案移植到僅支持PHP 5.2的服務器上。整個解決方案是使用$id - 風格讀請求而不是$_REQUEST['id']$_GET..., $_POST...在PHP中讀取請求時向後兼容

不知這類型的代碼不再支持,或者如果有什麼我已經在這裏錯過。在我移動解決方案後,它無法正常工作。該變量將爲空白/空白。

有沒有簡單的方法來解決這個問題,還是我必須重寫?

非常感謝你,如果你花時間來幫忙。

+1

讓我猜測,這些的$ id的打算直接向SQL查詢,'$ Q = 「SELECT * FROM table WHERE id = $ id」',對吧? – 2010-08-16 08:21:53

+0

通常,是的。但是,通過使用會話登錄來控制對解決方案的訪問,所以我不太在意SQL注入。但是,我明白了您的觀點...... – Peaceman71 2010-08-16 08:24:15

+1

讓我猜測,此登錄實現與應用程序的其餘部分相同 - 作爲篩子被破壞。 – 2010-08-16 08:28:44

回答

2

其接縫舊版本在php.ini中使用Register_globals = on閱讀它

http://www.peoplecnc.com/register_globals_off.html

其不建議使用它,並在PHP5默認是關閉的,

你可以通過創建一個名爲.htaccess的文件並將其放入它來覆蓋它:

php_value register_globals 1 

或將此行放在腳本的頭部 (在PHP 5.3.0中已貶低。這種棄用的功能將來肯定會被刪除。)

ini_set('register_globals', 'on'); 

但是不推薦,因爲您可以在鏈接中閱讀。

+0

後者是荒謬的,男人。試着去思考,它會有用嗎? – 2010-08-16 08:39:47

+0

@col。謝謝我更新 – 2010-08-16 08:45:50

+0

大聲笑你還是不明白。 **當你運行這段代碼時,所有的初始化都已經完成了。 – 2010-08-16 08:56:32

0

您描述的「功能」稱爲register_globals。這是一個失敗的嘗試,通過神奇地創建來自外部輸入的變量來使編碼更容易。最終,它只會導致不安全並且難以維護代碼。 PHP手冊本身警告一下:

http://es.php.net/manual/en/security.globals.php

它已經灰心了好幾年。在PHP/5.2中,它不再是默認設置,在PHP/5.3中它被標記爲不推薦使用,並且預計將在某一天從語言中刪除。

如果你要深入研究一堆或編寫得不好的舊代碼,你應該努力將它移植到最新的PHP版本上。否則,最好只配置你的服務器,以便它可以按原樣運行遺留代碼。

綜上所述:

  1. 如果你想保持遺留代碼,使註冊全局變量:如果你想重寫代碼http://es.php.net/manual/en/ini.core.php#ini.register-globals

  2. ,安裝PHP/5.3在開發箱,確保register_globals被禁用和啓用完整的錯誤報告:http://es.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

更新

您顯然需要啓用magic quotes以及。爲SQL查詢轉義輸入數據通常被視爲安全問題,但這並非完全正確:您需要轉義輸入,以便在用戶鍵入合法的單引號時,應用程序不會崩潰。

0

這種編碼風格是有風險的,因爲可以通過在URL中提供參數將變量注入到腳本中。

實施例:

if(SOME_CONDITION){ 
    $loggedIn = true; 
} 

後同一天...

if($loggedIn){ 
    sensitiveStuff(); 
} 

正如你可以看到,可以假代碼中的一個登錄上述通過將參數的loggedIn = 1到URL。

這就是說,如果你知道自己在做什麼,你可以很容易地模仿舊的行爲與線:

extract($_GET); 

的URL參數,或者

extract($_REQUEST); 

爲GET,POST和餅乾。

http://php.net/manual/en/function.extract.php

一個更好的辦法是找出需要什麼變量,只提取出來:

$neededArguments = array('foo', 'bar', 'bla'); 
foreach($neededArguments as $neededArgument) 
    $$neededArgument = $_REQUEST[$neededArgument];