2016-03-14 71 views
0

在PHP中的任何好處是有一個$ _POST值設置爲一個變量而不是隻使用線就已經消毒後的$ _ POST值的任何好處?

+2

技術上,如果它已經消毒它的罰款。但仍被認爲是不好的做法。如果您編寫的代碼直接訪問'$ _POST',該代碼如何確切知道它是否已被清理?更好地清理'$ _POST'變量並將清理過的值存儲在局部變量中,然後使用這些變量。 – jszobody

+0

當您更改$ _POST陣列的鍵時,您只需在代碼中更改一次,而不是每次都發生 –

回答

3

前提是有缺陷的地方,你「清理」$_POST陣列本身。

  1. 「禁制」(我不能寫不帶引號)是一個令人不安的概念,因爲它通常歸結爲隨機取出這些害怕字符在一些背景有些特殊的意義。問題在於:a)隨機刪除數據會給用戶提供一些隨機輸入的子集,從不知道現在到底是什麼東西,以及b)每個上下文都有自己的特殊字符,這意味着幾乎不可能平等地對所有情況進行消毒。

    您需要逃生編碼專門爲每個單獨的上下文(HTML編碼爲HTML,SQL逃生的SQL (更好:使用參數化查詢)爲JSON,JSON編碼等)。不要隨意刪除一部分數據,希望它現在對於任何你想要的環境都是「安全的」。

  2. 因爲1,一旦重整所有的輸入數據,並丟棄原來的數據意味着你真的完全放棄原來的數據。這可以是很麻煩的後面......

解決方案:

  1. 概念,當你產生一個數據塊的改變版本,將其分配到一個新的變量:

    $htmlEncodedUsername = htmlspecialchars($_POST['username']); 
    $sqlEscapedUsername = $mysqli->real_escape_string($_POST['username']); 
    
  2. 做這個聰明,不分配到上千元新的變量:

    $stmt->bindValue(':username', $_POST['username']); 
    
    ... 
    
    <p><?php echo htmlspecialchars($_POST['username']); ?></p> 
    

    不需要做任何你最初提出的事情。

+0

謝謝大家:) – BoKu