2011-10-10 68 views
0

我有同樣的問題,但...我重定向根據的,如果使用標頭是通過函數構建動態頁面語句的用戶。爲了使該功能正常工作,它需要在標題的GET部分中傳遞的參數。

根據什麼來提供的答案,這是一個不好的做法。我該怎麼做呢?

function page($title,$msg){ 
    $title = $_GET['title']; 
    $msg = $_GET['msg']; 
    echo '<h1>'.$title.'</h1>'; 

    echo '<p>'; 
    switch($msg){ 
     case 1: 
      echo 'dwasdwadawdwadwa'; 
     break; 
     case 2: 
      echo 'wasdadwadwdad'; 
     break; 
     default: 
      echo 'wadasdasd'; 
     break; 
    } 
    echo '</p>'; 
} 

ps:隨意指出你看錯的東西。

我發現this,但它並沒有真正幫助我。

+0

其中回答?你有同樣的問題,哪個問題? – ceejayoz

+0

首先,不是從函數中'echo',而是將內容存儲到函數返回的變量中,即'return $ func_html'。 –

+6

爲什麼你的函數需要立即覆蓋的參數? –

回答

0

答案給你鏈接的問題表明,功能不應該依賴任何外部(例如全局)變量,你可以訪問所有相同的屬性。 $_GET$_POST(其中包括)是'超級全局',這是PHP的一種語言特性,可以在任何範圍內使用它們。這意味着它們可能會在腳本的任何地方被意外修改。

避免這種情況的一種方法是避免在方法中使用超類全局變量,而不是像另一個問題的答案所表明的那樣,而是需要變量的參數,否則這些變量會從超級全局變量中獲得。的

例如,而不是:

function add_user() { 
    $user = $_GET['user']; 
    // ... 
} 
add_user(); 

你可以使用:

function add_user($user) { 
    // ... 
} 
add_user($_GET['user']); 

在你的情況,你會怎樣想的是:

function page($title, $msg){ 
    echo '<h1>'.$title.'</h1>'; 
    echo '<p>'; 
    switch($msg){ 
    case 1: 
     echo 'dwasdwadawdwadwa'; 
    break; 
    case 2: 
     echo 'wasdadwadwdad'; 
    break; 
    default: 
     echo 'wadasdasd'; 
    break; 
    } 
    echo '</p>'; 
} 

然後,當你調用page你可以這樣稱呼它:

page($_GET['title'], $_GET['msg']); 
+0

'「......從腳本中的任何位置意外修改」 - 這是一個現實問題嗎? – mario

+0

@mario:是的。如果您調用修改'$ _GET'和'$ _POST'變量的函數以及其他讀取它們的函數,那麼更改函數調用的順序可能會產生邏輯錯誤。 – Rob

+0

@mario:在這種情況下是虛構的,但完全符合現實,並且常見的錯誤原因。最大限度地減少函數的副作用總是一個好主意。這種心態是像不變性和無狀態編程這樣的實踐的原因:http://stackoverflow.com/questions/844536/advantages-of-stateless-programming – Rob

-1

不知道如果我明白你的問題,但這裏是一些代碼,我用處理我的AJAX調用有:

$mc = new MyClass(); 
echo $mc->{$_GET["operation"]}($_GET); 

這意味着「操作」是指內部MyClass的方法名稱和我沒有加每種方法都有一個新的switch語句。現在就可以增加一個功能「的addRecord($參數)」,以MyClass的,和我的Ajax調用是這樣的:

ajax_users.php?operation=addRecord&name=testuser&dob=1980-01-01 

你的PHP函數接收陣列中的參數,所以內部功能addRecord()你必須訪問像$args['name']$args['dob']這樣的變量,並且它有多少參數需要傳遞給您的方法。

確保你使用準備好的語句這裏或適當的逃逸,以防止SQL注入。

1

雖然你不一定用的東西的$_GET輸入需要安全性的考慮(在這種情況下),這是一個不好的做法不是從URL進行消毒值。

您不僅應該檢查惡意輸入(尤其是如果您使用輸入來查詢數據庫),但您應該驗證預期的整數值確實是整數,並且所需的字符串不是空的。

此外,您page($title, $msg)函數接受$title$msg並設定他們,即使他們不是passed by reference

  1. 如果您希望修改輸入參數,請通過引用傳遞它們。

  2. 如果您需要使用的輸入參數,不要馬上覆蓋它們。

  3. 如果你不需要輸入參數,只有使用價值從$_GET本地到你的函數,聲明page()不帶任何參數。

0

爲什麼你需要使用GET?如果你使用POST這也是更安全

+0

POST比POST更安全嗎? POST的唯一好處是它允許你發送更多的數據(文件上傳,非常長的textareas);但是您不需要比Firebug,TamperData或其他任何webdev工具來操作POST數據。 – iHaveacomputer

+0

它不會混亂網址/顯示用戶數據。 示例login.php?username = iHaveacomputer&password = generic。要獲取他們輸入的信息,您只需鍵入網站的網址,然後按向下箭頭鍵即可。而不是鼓勵使用GET來消息鼓勵POST,因爲這就是它的用途。沒有人想要一個400長的網址。 – Bankzilla

+0

URL混亂是一個合理的論點。安全恐嚇不是。也請等待[更多]點(http://stackoverflow.com/privileges/comment),直到您可以發表簡短的問題作爲評論。 – mario