2013-05-04 43 views
-3

如果我的形式我發佈一個隱藏字段這樣的:發佈一個數組()

<input type="hidden" name="userArr" value="Array([0] => 13 [1] => 10 [2] => 12 [3] => 9 [4] => 14 [5] => 11)"> 

不要我把一個數組的好處?

我是否需要撥打我的輸入姓名字段userArruserArr[]


溶液作爲我的陣列已經存在:「!用戶輸入永遠不能信任甚至沒有當它是隱藏的」

foreach ($userArr as $value) { 
    echo '<input type="hidden" name="userArr[]" value="'.$value.'">'; 
} 
+0

感謝您在法語每次嘗試說英語時加入-1。激勵我的好方法。 – Francois 2013-05-04 19:59:52

+0

你假設一個不存在的HTML和PHP之間的關係。瀏覽器看到的html只是文本。瀏覽器無法從文本中指出PHP數組。 – kojiro 2013-05-04 20:00:34

+0

更好:」> – Francois 2013-05-04 20:01:59

回答

3

你最好這樣做,但

<input type="hidden" name="userArr" value="<?= htmlentities(json_encode(array(10, 20, 30), ENT_NOQUOTES); ?>"> 

和服務器端做到這一點,讓您的數組:

$arr = json_decode(html_entity_decode($_POST['userArr'], ENT_NOQUOTES)); 

您正在使用的值將作爲一個普通的字符串處理,所以你不能輕易將其轉換回一個數組。有幾種編碼和解碼方法。下面的一些例子。您必須對其進行編碼,以便引號不會造成任何問題。

  1. json_encode/json_decode
  2. 序列化/反序列化

如果用[]打電話給你的輸入,你可以發佈一個陣列到服務器,但是這是當你有相同名稱的多個輸入字段。例如,如果人們想要接收有關不同主題的郵件,則您有5個複選框。所有這些主題都可以使用與[]相同的輸入名稱,因此您可以動態處理它,而不是爲每個輸入指定不同的名稱。

+2

注意:用戶可以更改此數據,但是他希望這樣,因此您可以像處理任何其他用戶輸入一樣處理陣列或面對嚴重的安全漏洞。 – dtech 2013-05-04 20:01:42

+0

Totaly true,session安全性更高!你永遠不能相信用戶輸入。 – Niels 2013-05-04 20:02:18

+1

這給了* a *怎麼樣,但是爲什麼*是哪裏? – kojiro 2013-05-04 20:02:33

1

您可以序列化數組,然後將其反序列化,但更好的做法是將數據存儲在session中。

代碼形式:

<input type="hidden" name"userArr" value="<?php echo base64_encode(serialize($userArr)); ?>" /> 

而且形式解析器:

<?php 
$userArr = unserialize(base64_decode($_POST['userArr'])); 
?> 

注意,用戶可以改變但是他想要的數據,因此,你應該處理數組作爲任何其他用戶輸入或面臨嚴重的安全漏洞。同樣,會話不存在這個問題。

+0

'serialize'不能保證輸出一個HTML安全的字符串。你應該把它傳遞給'htmlentities'。 – kojiro 2013-05-04 20:13:47

+0

好點,但base64是一個更好的選擇(它也可以包含不可打印的字節) – dtech 2013-05-04 20:49:09

+0

爲什麼base64是一個更好的選擇? – kojiro 2013-05-04 20:50:28