簡體   English   中英

PHP序列化成功,反序列化失敗

[英]PHP Serialize Successful, Unserialize Failure

我的PHP代碼已序列化但未反序列化,這可能是什么問題?

$serializedColumns = serialize($columnNames);

我得到以下結果html,其中將序列化的字符串存儲到隱藏字段中:

<input id="columns_hidden" name="columns" type="hidden" value="a:3:{i:0;s:8:&quot;Username&quot;;i:1;s:8:&quot;Password&quot;;i:2;s:11:&quot;AccessLevel&quot;;}">

該請求被發送到“ AddData.php”,在這里我有這樣的反序列化代碼:

$columns =  unserialize($_REQUEST['columns']);

當我在$columns上調用print_r時,它返回一個空白字符串。

當我在$_REQUEST['columns']上調用print_r時,它返回:

a:3:{i:0;s:8:\\"Username\\";i:1;s:8:\\"Password\\";i:2;s:11:\\"AccessLevel\\";}

這實際上是一條評論,但我在這里將其放在此處以引起更多關注: 請勿這樣做

為什么? -每當您盲目地對請求提供的數據進行反unserialize ,PHP的作用都超出您的想象。 這會創建對您的應用程序有害的對象,而您對此無能為力。

可以使用DOM編輯器或JavaScript輕松地編輯和處理隱藏的輸入,以包含有害代碼,或者可以對您的網站觸發惡意請求,從而迅速將其關閉。

替代方案 -而是使用您可以更輕松地處理的某種形式的數據,例如,使用json_encode / json_decode或經典的implode / explode

$serializedColumns = implode(',', $columnNames);

$columns =  explode(',', $_REQUEST['columns']);

由於它是靜態數據處理,因此更加安全可靠。

看來您正在通過htmlspecialchars傳遞序列化的結果 這將破壞序列化的數據。 使用其他編碼方法以使其安全地用作html屬性值,即base64_encode

<?php
$serializedColumns = serialize($columnNames);
?>

<input id="columns_hidden" name="columns" type="hidden" value="<?php echo base64_decode($serializedColumns) ?>">

然后,在您的處理腳本中:

$columns =  unserialize(base64_decode($_REQUEST['columns']));

&quot; 是probabably將在連載的方式,如; 不能逃脫。

您可以對值進行base64_encode並隨后對其進行解碼:

$serializedColumns = base64_encode(serialize($columnNames));

$columns =  unserialize(base64_decode($_REQUEST['columns']));

當您將數據發布到PHP時,看起來好舊的魔術引號在所有定界引號之前插入\\。 您必須先取消轉義(斜杠),然后才能解碼/反序列化。

如果您對該列使用VARCHAR,請嘗試將MySQL列更改為TEXT。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM